'SQL Server 2005'에 해당되는 글 50건

  1. SQL Server 2005의 Bulk Insert 성능 비교
  2. SQL 템플릿 관리,,
  3. 최소 로그 처리 방법이 뭐가 있을까?
  4. 끝 공백 문자들을 SQL에서는 어떻게 처리하는 걸까??
  5. Login failed for user ’sa’ because the account is currently locked out. The system administrator can unlock it.
  6. ::fn_dblog(null, null);
  7. [SQL] Using 'GO 100' to execute a batch 100 times
  8. identity overflow 검사하기
  9. XML execution plans out as SQLPlan files
  10. sp_depends

 BOL 링크
ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.ko/udb9/html/50d19cab-1830-4f70-8df1-2450ce887805.htm

http://www.sqlleader.com/mboard.asp?exec=view&strBoardID=SS2005TSQL&intPage=1&intCategory=0&strSearchCategory=%7Cs_name%7Cs_subject%7C&strSearchWord=&intSeq=351


대량 데이타 전송 관련 방법은 bcp, Bulk insert, INSERT ...SELECT * FROM OPENROWSET(BULK...)  세가지가 있다.

Bulk Insert는 쿼리 분석기에서 수행되며, 실행 계획이나 작업 수행 방식이 스레드 형식으로 처리 된다.
Bcp는 명령 프롬프트에서 수행되며, Odbc 인터페이스를 가지고 프로세스로 수행된다.

성능은 Bulk insert가 제일 빠르다.


Differences Between BULK INSERT and bcp

1. Bulk Insert 는 SQL 문이고, BCP는 Cmd 유틸이다.

1-1. Bulk Insert 는 In-Process 이고, BCP는 Out-Of-Process 이다 (자세한 사항은 BOL 참조)

1-2. 1-1과 같은 이유로 서로 다른 pc를 이용 한다면 bcp로 cpu 부하를 덜 수 있다!


2. Bulk Insert 는 입력만 가능하고, BCP는 출력도 가능하다

3. Bulk Insert 가 입력시 BCP보다 성능이 좋다




 

입력시 Bulk Insert와 BCP 모두 사용할 수 있는 상황에서는 Bulk Insert를 사용하고


그렇지 않으면 BCP 사용하라!

출력시 BCP 사용하라!



In-Process와 Out-of-Process 작업

Transact-SQL 명령은 SQL Server 에서 in-process를 실행하며 동일한 메모리 주소 공간을 공유합니다. 데이터 파일은 SQL Server 프로세스에서 열리므로 데이터는 클라이언트 프로세스와 SQL Server 프로세스 간에 복사되지 않습니다. BULK INSERT 또는 INSERT ... SELECT * FROM OPENROWSET(BULK...)를 사용하여 데이터를 가져오려면 데이터를 대량으로 가져오기 위해 Transact-SQL을 사용할 때의 보안 고려 사항을 참조하십시오.

이와는 반대로 bcp 명령과 SSIS 실행 파일은 out-of-process를 실행합니다. 프로세스 메모리 공간에서 데이터를 이동하려면 bcp 및 SSIS가 프로세스 간 데이터 마샬링을 사용해야 합니다. 프로세스 간 데이터 마샬링은 메서드 호출 매개 변수를 프로세서에 대량의 부하를 추가할 수 있는 바이트 스트림으로 변환하는 프로세스입니다. 그러나 bcp 및 SSIS는 클라이언트 프로세스에서 데이터를 구문 분석하여 기본 저장소 형식으로 변환하기 때문에 SQL Server 프로세스에서 구문 분석 및 데이터 변환을 오프로드할 수 있습니다. CPU 제약 조건이 있는 경우 Transact-SQL 명령을 사용하지 않고 둘 이상의 CPU가 있는 컴퓨터나 다른 컴퓨터에서 bcp 또는 SSIS를 사용하여 더 향상된 성능으로 대량 가져오기의 성능을 향상시킬 수 있습니다.

SQL 템플릿 관리,,


DBA라면 자신이 자주 사용하는 템플릿을 관리하기를 원할 것이다.  SSMS옆에 템플릿 탐색기 안에 내가 자주 사용하는 템플릿을 지정하기를 원할 것이다. 

(원본) SQL 템플릿 저장 위치
---------------------------------------
C:\Program Files\Microsoft SQL Server\90\Tools\Binn\VSShell\Common7\IDE\sqlworkbenchprojectitems\Sql

위의 폴더 안에 기본적으로 생성되는 템플릿 정보 파일들을 /DefaultTemplate 폴더를 생성 후 이외의 폴더 파일들을 잘라내기 하여 /DefaultTemplate 폴더에 붙여 놓는다. 

SSMS를 새롭게 열게 된다면 SQLServer 템플릿 탐색기는  /DefaultTemplate  폴더에 보여지게 될것이다.
자, 이제 내가 원하는 템플릿 정보만 이 안에 다 넣어두기만 하면 된다.
쉽넹.ㅋㅋㅋ

-- 주디 아줌마용 템플릿은 아래와 같이 저장되더만,  만약 자기가 사용하던 템플릿을 사용하길 원한다면 아래의 폴더로 파일을 카피해서 쓰기만 하면 된다. ㅋㅋ

C:\Documents and Settings\주디아줌마\Application Data\Microsoft\Microsoft SQL Server\90\Tools\Shell\Templates\Sql


다덜 아는 내용인가.ㅋㅋㅋ


참고는 http://purumae.tistory.com/3 여기거 보구,ㅋㅋ



MSSQL의 복구 모델은 3가지가 있다


1.     Full 복구

DML(UPDATE, DELETE, INSERT) 동작에 대한 모든 변경된 모든 행들을 기록

2.     BULK_LOGGED 복구

BULK INSERT, BCP, CREATE INDEX, SELECT INTO~~ 에 대한 최소한의 로그 공간을 사용

3.     SIMPLE 복구

트랜잭션 로그는 정기적으로 잘려진다.

 

위의 3가지 중 OLTP 환경에서는 Full 복구 모델을 사용하고 있다. 로그는 SIMPLE 모델로 데이터의 속성에 따라 다르다.

 

DML문의 최소 로그 처리 방법이 무엇이냐? 

DML문이 동작을 하면 변경된 모든 행들을 트랜잭션 로그에 기록을 한다. 서버에서 주기적으로 배치 작업 형태의 INSERT, DELETE, UPDATE 등의 처리 속도를 향상시키는 방법은 배치 작업에 대한 트랜잭션 로그 수를 줄이게 된다면 처리 작업 진행에 대한 속도 향상 시킬 수 있다.  아래의 예제를 참고하자.

 

 

게임에서 주기적으로 통계,기타 등등의 배치 형태의 작업이 존재한다면 아래와 같은 방법으로 성능 개선해 보자.

 

샘플>>

SET NOCOUNT ON          

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

GO

 

USE master

go

 

create database t_log_test

go

 

use t_log_test

go

 

-- 트랜잭션로그를디스크에반영하구..

checkpoint;

go

 

 

select * from ::fn_dblog(null,null)

go

 

---- 체크포인트들만남았다.

--Operation        Context

--LOP_BEGIN_CKPT        LCX_NULL

--LOP_END_CKPT           LCX_NULL

--GO

 

-- 로그활성화

dbcc traceon (3604)

dbcc traceon (2588)

go

 

 

select @@version

go

 

--Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86)   Nov 24 2008 13:01:59   Copyright (c) 1988-2005 Microsoft Corporation  Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 3)

 

 

if object_id('tblx') is not null

             drop table dbo.tblx

go

 

create table dbo.tblx

(

             cola varchar(10)

             ,colb varchar(10)

             ,colc varchar(10)

)

go

 

 

-- 순간적으로한꺼번에반영할수있는데이타들을스피드하게처리할수가있을까?

truncate table tblx

go

 

checkpoint;

go

 

 

-- 10개의row

insert into tblx values('a','b','c')

insert into tblx values('a','b','c')

insert into tblx values('a','b','c')

insert into tblx values('a','b','c')

insert into tblx values('a','b','c')

insert into tblx values('a','b','c')

insert into tblx values('a','b','c')

insert into tblx values('d','e','f')

insert into tblx values('a','b','c')

insert into tblx values('a','b','c')

go

 

 

select * from ::fn_dblog(null,null)

go

 

-- 한로우마다insert할때아래와같은트랜잭션로그가기록이된다.

--Operation        Context

--LOP_BEGIN_XACT        LCX_NULL

--LOP_INSERT_ROWS     LCX_HEAP

--LOP_COMMIT_XACT     LCX_NULL

go

 

 

 

truncate table tblx

go

 

checkpoint;

go

 

 

-- 10개의row

begin tran

insert into tblx values('a','b','c')

insert into tblx values('a','b','c')

insert into tblx values('a','b','c')

insert into tblx values('a','b','c')

insert into tblx values('a','b','c')

insert into tblx values('a','b','c')

insert into tblx values('a','b','c')

insert into tblx values('d','e','f')

insert into tblx values('a','b','c')

insert into tblx values('a','b','c')

commit tran

 

if @@trancount > 0 rollback tran

go

 

 

select

[rowlog contents 0],

[rowlog contents 1],

[rowlog contents 2],

*

 

from ::fn_dblog(null,null)

 

go

-- 31

 

 

 

--- 많은양의로그량을줄일수가잇다.

--LOP_COMMIT_XACT

--LOP_INSERT_ROWS

--LOP_SET_FREE_SPACE

--LOP_INSERT_ROWS

--LOP_INSERT_ROWS

--LOP_INSERT_ROWS

--LOP_INSERT_ROWS

--LOP_INSERT_ROWS

--LOP_INSERT_ROWS

--LOP_INSERT_ROWS

--LOP_INSERT_ROWS

--LOP_INSERT_ROWS

--LOP_COMMIT_XACT

 

 

>> 적용 방안의 예

begin tran

             exec dbo.u_a

             exec dbo.u_a

             exec dbo.u_a

             exec dbo.u_a

             exec dbo.u_a

             exec dbo.u_a

             exec dbo.u_a

             exec dbo.u_a

             exec dbo.u_a

             exec dbo.u_a

commit tran

 

if @@trancount > 0 rollback tran

 

>> 활용방안

통계 수집

기타..

 

팁 같지도 않은 팁을 올려서 죄송 ㅜ.ㅜ

공백 문자로 인하여 다양하게 문제가 일어나네요... 이번참에 개념 정리....

 

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><?xml:namespace prefix = o /> 

/*

제 목: 끝 공백문자들을SQL에서는어떻게처리하는걸까??

작성자: 주디아줌마

작성일: 2009.05.21 ~ 2009.05.22

*/

 

SQL에서는열이정의된열크기보다짧은값을저장하는방법과char, varchar, binary varbinary

데이터에후행공백이있는값을저장하는방법을제어합니다.

 

구문>>

SET ANSI_PADDING { ON | OFF }

 

link>>

ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.ko/tsqlref9/html/92bd29a3-9beb-410e-b7e0-7bc1dc1ae6d0.htm

 

SET ANSI_PADDING ON일때SQL에서는후행의공백에대해서는잘리지않고저장한다.

  

보이지않은공백문자spacebar(0x20), tab, enter ,, spacebar 공백처리에대해서만padding 처리하는 것으로보인다. , 인덱스생성, 집계, 검색에 끝 공백문자들에 대해서는padding 처리한다.

 

결국에는 공백 문자가 보고 싶지 않다면 RTRIM() 함수를이용하여 저장해야 한다.

후 행의 공백문자를 제거한다.

 

 

---------------------------------------

-- CASE 1

-- sapcebartab의문자코드값은멀까?

---------------------------------------

IF OBJECT_ID('T') IS NOT NULL

BEGIN

             DROP TABLE T

END

GO

 

CREATE TABLE dbo.T

(

             Seq                    INT IDENTITY(1,1) NOT NULL,

             strID      VARCHAR(100)

            

             -- CONSTRAINT UCL_T_strID PRIMARY KEY (strID)

)

GO

 

INSERT INTO dbo.T (strID) VALUES(' AAA')

INSERT INTO dbo.T (strID) VALUES('AAA')

INSERT INTO dbo.T (strID) VALUES('AAA ') -- space bar      1 count

INSERT INTO dbo.T (strID) VALUES('AAA     ')        -- space bar      2 count

INSERT INTO dbo.T (strID) VALUES('AAA          ')              -- space bar      3 count

INSERT INTO dbo.T (strID) VALUES('AAA    ')           -- tab  1

INSERT INTO dbo.T (strID) VALUES('AAA                  ')           -- tab  2

INSERT INTO dbo.T (strID) VALUES('AAA   

')           -- Enter Key 1

INSERT INTO dbo.T (strID) VALUES('AAA   

 

 

')           -- Enter Key 2

INSERT INTO dbo.T (strID) VALUES('BBB')

INSERT INTO dbo.T (strID) VALUES('CCC')

GO

 

SELECT CONVERT(VARBINARY, strID), *

FROM DBO.T

ORDER BY strID ASC

GO

 

----- spacebar 20, tab 09 이구만..ㅋㅋ

--(No column name)       Seq       strID

--0x20414141      1            AAA

--0x414141         2            AAA

--0x41414120      3            AAA

--0x4141412020202020     4            AAA    

--0x41414120202020202020202020 5            AAA         

--0x41414120090D0A        8            AAA   

--0x41414120090D0A0D0A0D0A     9            AAA       

--0x41414109      6            AAA

--0x4141410909  7            AAA 

--0x424242         10          BBB

--0x434343         11          CCC

 

 

SELECT CONVERT(VARBINARY, strID), *

FROM DBO.T

WHERE strID = 'AAA'

ORDER BY strID ASC

GO

 

----- 어쭈이것봐라~~~~ 같은문자로보네,,,

----- 앞의공백은다른문자로보냉.. 어쭈구리.

--(No column name)       Seq       strID

--0x414141         2            AAA

--0x41414120      3            AAA

--0x4141412020202020     4            AAA    

--0x41414120202020202020202020 5            AAA     

   

-- 어디보자집계처리는?? group by ??

SELECT CONVERT(VARBINARY, strID), strID

FROM DBO.T

GROUP BY strID

ORDER BY strID ASC

GO

 

---- 어쭈,, 이거뭐냐??????? 공백은하나로생각하는구나, spacebar가한개~N개는모두하나로

---- 인식하는구낭... 이런뭥미..spacebar, tab 처리는spacebar 처리기법이다르구만...

---- 또한, 앞의공백은다르다.

--(No column name)       strID

--0x20414141      AAA

--0x414141         AAA

--0x41414120090D0A        AAA   

--0x41414120090D0A0D0A0D0A     AAA       

--0x41414109      AAA

--0x4141410909  AAA 

--0x424242         BBB

--0x434343         CCC

 

---------------------------------------

-- CASE 2

-- 유니크한인덱스를만들어서,,,, spacebar 1개일때와2개일때와의차이체크해보자

---------------------------------------

 

IF OBJECT_ID('T_IDX') IS NOT NULL

BEGIN

             DROP TABLE T_IDX

END

GO

CREATE TABLE dbo.T_IDX

(

             Seq                    INT IDENTITY(1,1) NOT NULL,

             strID      VARCHAR(20)

            

             CONSTRAINT UCL_T_IDX_strID PRIMARY KEY (strID)

)

GO

 

INSERT INTO dbo.T_IDX (strID) VALUES(' AAA')

INSERT INTO dbo.T_IDX (strID) VALUES('AAA')

INSERT INTO dbo.T_IDX (strID) VALUES('AAA ')        -- space bar      1 count

INSERT INTO dbo.T_IDX (strID) VALUES('AAA     ') -- space bar      2 count

INSERT INTO dbo.T_IDX (strID) VALUES('AAA          ')       -- space bar      3 count

INSERT INTO dbo.T_IDX (strID) VALUES('AAA           ')           -- tab  1

INSERT INTO dbo.T_IDX (strID) VALUES('AAA                        ')           -- tab  2

INSERT INTO dbo.T_IDX (strID) VALUES('AAA         

')           -- Enter Key 1

INSERT INTO dbo.T_IDX (strID) VALUES('AAA         

 

 

')           -- Enter Key 2

INSERT INTO dbo.T_IDX (strID) VALUES('BBB')

INSERT INTO dbo.T_IDX (strID) VALUES('CCC')

GO

 

-- spacebar에대한공백처리에대해서는INDEX 처리시오류가생기는군...

-- 문자코드값으로전혀다른데, 어찌,,,, 동일하게보는것일까?

-- 위의처리부분에서보면,, 쿼리결과값은,,,

-- 역시동일하구낭...

SELECT CONVERT(VARBINARY, strID), *

FROM DBO.T_IDX

ORDER BY strID ASC

GO

 

---- 어쭈구리..... 등록이안되잖아?????? 이런줴길,,

---- 처리를어찌한다는거지? SQL에서,,,

--(No column name)       Seq       strID

--0x20414141      1            AAA

--0x414141         2            AAA

--0x41414120090D0A        8            AAA   

--0x41414120090D0A0D0A0D0A     9            AAA       

--0x41414109      6            AAA

--0x4141410909  7            AAA 

--0x424242         10          BBB

--0x434343         11          CCC

 

-- LIKE 검색은어찌되는게냐?

SELECT CONVERT(VARBINARY, strID), *

FROM DBO.T_IDX

WHERE strID LIKE 'AAA%'

GO

 

--(No column name)       Seq       strID

--0x414141         2            AAA

--0x41414120090D0A        8            AAA   

--0x41414120090D0A0D0A0D0A     9            AAA       

--0x41414109      6            AAA

--0x4141410909  7            AAA 

 

-- 공백이포함된문자열은어찌검색되느냐?

SELECT CONVERT(VARBINARY, strID), *

FROM DBO.T_IDX

WHERE strID LIKE 'AAA %'

GO

 

--(No column name)       Seq       strID

--0x41414120090D0A        8            AAA   

--0x41414120090D0A0D0A0D0A     9            AAA     




Login failed for user ’sa’ because the account is currently locked out. The system administrator can unlock it.  (Microsoft SQL Server, Error: 18486).


위와 같은 시스템 오류가 발생하였을 때 아래와 같이 실행한다.

use master
go

alter login 로그인계정
with PASSWORD  = '새로운패스워드' unlock
go

::fn_dblog(null, null);


최상위 LSN 확인

select *

from fn_dblog(null, null);


http://weblogs.asp.net/jgalloway/archive/2007/04/25/sql-using-go-100-to-execute-a-batch-100-times.aspx

이런 팁이 있었다니. 크하하하하 ^___^



SET NOCOUNT ON

GO

 

CREATE TABLE dbo.TEST (ID INT IDENTITY (1,1), ROWID uniqueidentifier)

GO

-- 1000번의 배치실행한다.

INSERT INTO dbo.TEST (ROWID) VALUES (NEWID()) 

GO 1000

 

SELECT *

fROM TEST

 


>> 잼나다 ^___^ 요런 트릭도 있다니.ㅋㅋㅋ

identity overflow 검사하기


-- SQL2000

select object_name(id) as table_nam

, name

,    'Seed'     = ident_seed(object_name(id))

,    'Increment'    = ident_incr(object_name(id))

,    'current'     = IDENT_CURRENT(object_name(id))

, max_value =

 case

  when length =  2 then  32767

  when length =  4 then  2147483647

  when length =  8 then  9223372036854775807  

 else 'etc'

      end

from syscolumns

where status = 128

GO

 

-- SQL2005,2008

select object_name(object_id) as table_nam

, name

,    'Seed'     = ident_seed(object_schema_name(object_id) + '.' + object_name(object_id))

,    'Increment'    = ident_incr(object_schema_name(object_id) + '.' + object_name(object_id))

,    'current'     = IDENT_CURRENT(object_schema_name(object_id) + '.' + object_name(object_id))

, max_value =

 case

  when max_length =  2 then  32767

  when max_length =  4 then  2147483647

  when max_length =  8 then  9223372036854775807          

 else 'etc'

      end

from sys.columns

where is_identity = 1

and name <> 'queuing_order'

go


http://cafe.naver.com/sqlmvp/433
[출처] identity overflow 검사하기(스키마 있는경우) (sqlmvp) |작성자 차주언

'SQL Server 2005' 카테고리의 다른 글

::fn_dblog(null, null);  (0) 2009.04.16
[SQL] Using 'GO 100' to execute a batch 100 times  (0) 2009.04.03
XML execution plans out as SQLPlan files  (0) 2009.03.24
sp_depends  (0) 2009.03.13
DMV  (0) 2009.03.09
3월 7일 SQLER 스터디에 나온 이슈중에 하나이다.^^

USE AdventureWorks;
GO
SET SHOWPLAN_XML ON;
GO
-- Execute a query.
SELECT EmployeeID
FROM HumanResources.Employee
WHERE NationalIDNumber = '509647174';
GO
SET SHOWPLAN_XML OFF;

위의 결과를 다른 이름으로 파일 저장하기를 이용하여 저장한다. 저장할때, 파일 형식은 모든 파일 선택 (*.*) 한다. 
이름.sqlplan 저장한다. (예, test5.sqlplan )
저장된 파일을 더블 클릭한다. 그러면, SQL PLAN 정보를 확인할 수가 있다.  (SSMS 확인이 가능하다 )

실행계획의 정보를 텍스트 파일이 좋지만, XML 파일 형태로 공유하는게 더 확실하다. 왜냐, 모든 실행 계획을 보여주기 때문에 적절하다.

그래픽 형태가 보기도 좋구...

'SQL Server 2005' 카테고리의 다른 글

[SQL] Using 'GO 100' to execute a batch 100 times  (0) 2009.04.03
identity overflow 검사하기  (0) 2009.03.25
sp_depends  (0) 2009.03.13
DMV  (0) 2009.03.09
유용한 DMV  (0) 2009.03.04

sp_depends

그동안 어떤 테이블의 참조 개체를 찾아내는데 아래와 같이 사용하였으나,

----------------------------------------------------------------------------------- 이전
SELECT A.name ProcedureName
FROM sys.objects A, sys.syscomments B
WHERE A.object_id = B.ID
 -- AND A.name LIKE @SP_NAME + '%'
 AND B.text LIKE '%' + @DS_TEXT + '%'

>> 가끔, 다른 용도로도 사용 가능.

----------------------------------------------------------------------------------- 이후
sp_depends '테이블명'

'SQL Server 2005' 카테고리의 다른 글

identity overflow 검사하기  (0) 2009.03.25
XML execution plans out as SQLPlan files  (0) 2009.03.24
DMV  (0) 2009.03.09
유용한 DMV  (0) 2009.03.04
업데이트 비용에 대한 고찰  (0) 2009.02.04