반응형
반응형

http://symplog.tistory.com/266

반응형

'연구개발 > DBA' 카테고리의 다른 글

oracle mssql linked server  (0) 2018.04.17
select 처리순서  (0) 2017.08.02
Microsoft Windows DistributedCOM 오류 로그  (0) 2016.03.23
mssql 권한설정  (0) 2016.03.16
tempdb 분리  (0) 2016.03.15
반응형

https://blogs.msdn.microsoft.com/dbrowne/2013/10/02/creating-a-linked-server-for-oracle-in-64bit-sql-server/



This post is a walkthrough of creating a Linked Server to Oracle from 64bit SQL Server.  There's lots of information on doing this on the web, but much of it is out-of-date.

First, install the correct Oracle drivers.  You want the latest version of the Oracle Data Access Components (ODAC), and you want the XCopy deployment.  They are available here:

64-bit Oracle Data Access Components (ODAC) Downloads

http://www.oracle.com/technetwork/database/windows/downloads/index-090165.html

One you download and unzip this into a folder run the following command from that folder:

C:\Users\dbrowne\Downloads\ODAC121010Xcopy_x64>.\install.bat oledb c:\oracle\odac64 odac64 true

Then you need to add two folders to your system path: c:\oracle\odac64 and c:\oracle\odac64\bin


Then you must reboot for the system path change to be visible by services like SQL Server.

After reboot you're ready to create and test the linked server.

First configure the Oracle OleDB provider to run inside the SQL Server process, and configure it to accept parameters.

exec master.dbo.sp_MSset_oledb_prop 'ORAOLEDB.Oracle', N'AllowInProcess', 1 
exec master.dbo.sp_MSset_oledb_prop 'ORAOLEDB.Oracle', N'DynamicParameters', 1 

Then create the linked server definition.  Instead of a TNSNames alias, use an EZConnect identifier.  Here I'm specifying an IP address and a SID to connecto to an Oracle Express instance running on a VM:

 

exec sp_addlinkedserver N'MyOracle', 'Oracle', 'ORAOLEDB.Oracle', N'//172.16.8.119/xe', N'FetchSize=2000', ''

 

exec master.dbo.sp_serveroption @server=N'MyOracle', @optname=N'rpc out', @optvalue=N'true'
exec sp_addlinkedsrvlogin @rmtsrvname='MyOracle', @useself=N'FALSE', @rmtuser=N'system', @rmtpassword='xxxxxx'     

Now you're ready to test.  We configured the linked server for 'rpc out' so we can send a simple passthrough query to test connectivity:

exec ('select 1 a from dual') at MyOracle

That's it.





exec master.dbo.sp_MSset_oledb_prop 'ORAOLEDB.Oracle', N'AllowInProcess', 1 



exec master.dbo.sp_MSset_oledb_prop 'ORAOLEDB.Oracle', N'DynamicParameters', 1 




exec sp_addlinkedserver N'MyOracle', 'Oracle', 'ORAOLEDB.Oracle', N'//192.168.10.80:1521/myora', N'FetchSize=5000', ''



exec master.dbo.sp_serveroption @server=N'MyOracle', @optname=N'rpc out', @optvalue=N'true'




exec sp_addlinkedsrvlogin @rmtsrvname='MyOracle', @useself=N'FALSE', @rmtuser=N'system', @rmtpassword='head1ton' 



exec ('select 1 a from dual') at MyOracle

반응형

'연구개발 > DBA' 카테고리의 다른 글

Mysql Mssql linked server  (0) 2018.04.17
select 처리순서  (0) 2017.08.02
Microsoft Windows DistributedCOM 오류 로그  (0) 2016.03.23
mssql 권한설정  (0) 2016.03.16
tempdb 분리  (0) 2016.03.15
반응형

FROM


ON


JOIN


WHERE


GROUP BY


WITH CUBE | WITH ROLLUP


HAVING


SELECT


DISTINCT


ORDER BY


TOP

반응형

'연구개발 > DBA' 카테고리의 다른 글

Mysql Mssql linked server  (0) 2018.04.17
oracle mssql linked server  (0) 2018.04.17
Microsoft Windows DistributedCOM 오류 로그  (0) 2016.03.23
mssql 권한설정  (0) 2016.03.16
tempdb 분리  (0) 2016.03.15
반응형

응용 프로그램별 권한 설정에서 CLSID가 
{806835AE-FD04-4870-A1E8-D65535358293}
이고 APPID가 
{EE4171E6-C37E-4D04-AF4C-8617BC7D4914}인 COM 서버 응용 프로그램에 대한 로컬 활성화 사용 권한을
응용 프로그램 컨테이너 사용할 수 없음 SID(사용할 수 없음)에서 실행 중인 주소 LocalHost(LRPC 사용)의 
사용자 NT SERVICE\SQLSERVERAGENT SID(S-1-5-80-344959196-2060754871-2302487193-2804545603-1466107430)에게 부여하지 않았습니다. 
구성 요소 서비스 관리 도구를 사용하여 이 보안 권한을 수정할 수 있습니다.

(영문)

The application-specific permission settings do not grant Local Activation permission for the COM Server application with CLSID 
{806835AE-FD04-4870-A1E8-D65535358293}
 and APPID 
{EE4171E6-C37E-4D04-AF4C-8617BC7D4914}
 to the user MyDomain\MyLogin SID (S-1-5-21-1688516961-3049443350-111816674-1126) from address LocalHost (Using LRPC). This security permission can be modified using the Component Services administrative tool.





구성요소 서비스 -> 컴퓨터 -> 내컴퓨터 -> DCOM구성에서 Microsoft SQL Server Integration Services 12.0를 찾습니다.

응용 프로그램 ID가 {EE4171E6-C37E-4D04-AF4C-8617BC7D4914} 인지 확인합니다.

속성 -> 보안 -> 시작 및 활성화 권한에서 편집 버튼을 클릭합니다.

추가버튼을 클릭하고 계정을 추가합니다.

위 오류에서 보면 계정은 NT SERVICE\SQLSERVERAGENT가 되어야 겠네요.

로컬 시작과 로컬 활성화 권한을 부여합니다.

확인 버튼을 클릭하고 마무리 합니다.



NT SERVICE\SQLSERVERAGENT 계정 입력방법은 처음 답변했던 내용 대로입니다.

선택할 개체이름을 입력하세요 부분에서 NT SERVICE\SQLSERVERAGENT를 직접 입력해주시면 됩니다.

고급 버튼을 눌러서 검색해봐도 NT SERVICE\SQLSERVERAGENT 계정이 나오지 않습니다. 직접 입력해야 합니다.



반응형

'연구개발 > DBA' 카테고리의 다른 글

oracle mssql linked server  (0) 2018.04.17
select 처리순서  (0) 2017.08.02
mssql 권한설정  (0) 2016.03.16
tempdb 분리  (0) 2016.03.15
성능 모니터  (0) 2015.12.16
반응형

USE [master]

GO

CREATE LOGIN [GulsAdmin] WITH PASSWORD=N'!@#dpaqhTld04', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF

GO

USE [Game]

GO

CREATE USER [GulsAdmin] FOR LOGIN [GulsAdmin]

GO

USE [Game]

GO

EXEC sp_addrolemember N'db_owner', N'GulsAdmin'


USE [GameInfo]

GO

CREATE USER [GulsAdmin] FOR LOGIN [GulsAdmin]

GO

USE [GameInfo]

GO

EXEC sp_addrolemember N'db_owner', N'GulsAdmin'


USE [Guild]

GO

CREATE USER [GulsAdmin] FOR LOGIN [GulsAdmin]

GO

USE [Guild]

GO

EXEC sp_addrolemember N'db_owner', N'GulsAdmin'


USE [GuildInfo]

GO

CREATE USER [GulsAdmin] FOR LOGIN [GulsAdmin]

GO

USE [GuildInfo]

GO

EXEC sp_addrolemember N'db_owner', N'GulsAdmin'


USE [Log]

GO

CREATE USER [GulsAdmin] FOR LOGIN [GulsAdmin]

GO

USE [Log]

GO

EXEC sp_addrolemember N'db_owner', N'GulsAdmin'


USE [Login]

GO

CREATE USER [GulsAdmin] FOR LOGIN [GulsAdmin]

GO

USE [Login]

GO

EXEC sp_addrolemember N'db_owner', N'GulsAdmin'


USE [LoginInfo]

GO

CREATE USER [GulsAdmin] FOR LOGIN [GulsAdmin]

GO

USE [LoginInfo]

GO

EXEC sp_addrolemember N'db_owner', N'GulsAdmin'


USE [Rank]

GO

CREATE USER [GulsAdmin] FOR LOGIN [GulsAdmin]

GO

USE [Rank]

GO

EXEC sp_addrolemember N'db_owner', N'GulsAdmin'


USE [Tool]

GO

CREATE USER [GulsAdmin] FOR LOGIN [GulsAdmin]

GO

USE [Tool]

GO

EXEC sp_addrolemember N'db_owner', N'GulsAdmin'





USE [master]

GO

CREATE LOGIN [GulsWeb] WITH PASSWORD=N'qordjqvlftn$#@!', DEFAULT_DATABASE=[Guild], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF

GO

USE [Game]

GO

CREATE USER [GulsWeb] FOR LOGIN [GulsWeb] WITH DEFAULT_SCHEMA = DBO;

GO

USE [Game]

GO

GRANT EXECUTE TO GulsWeb;

GRANT SELECT TO GulsWeb;


USE [GameInfo]

GO

CREATE USER [GulsWeb] FOR LOGIN [GulsWeb] WITH DEFAULT_SCHEMA = DBO;

GO

USE [GameInfo]

GO

GRANT EXECUTE TO GulsWeb;

GRANT SELECT TO GulsWeb;


USE [Guild]

GO

CREATE USER [GulsWeb] FOR LOGIN [GulsWeb] WITH DEFAULT_SCHEMA = DBO;

GO

USE [Guild]

GO

GRANT EXECUTE TO GulsWeb;

GRANT SELECT TO GulsWeb;


USE [GuildInfo]

GO

CREATE USER [GulsWeb] FOR LOGIN [GulsWeb] WITH DEFAULT_SCHEMA = DBO;

GO

USE [GuildInfo]

GO

GRANT EXECUTE TO GulsWeb;

GRANT SELECT TO GulsWeb;


USE [Log]

GO

CREATE USER [GulsWeb] FOR LOGIN [GulsWeb] WITH DEFAULT_SCHEMA = DBO;

GO

USE [Log]

GO

GRANT EXECUTE TO GulsWeb;

GRANT SELECT TO GulsWeb;


USE [Login]

GO

CREATE USER [GulsWeb] FOR LOGIN [GulsWeb] WITH DEFAULT_SCHEMA = DBO;

GO

USE [Login]

GO

GRANT EXECUTE TO GulsWeb;

GRANT SELECT TO GulsWeb;


USE [LoginInfo]

GO

CREATE USER [GulsWeb] FOR LOGIN [GulsWeb] WITH DEFAULT_SCHEMA = DBO;

GO

USE [LoginInfo]

GO

GRANT EXECUTE TO GulsWeb;

GRANT SELECT TO GulsWeb;


USE [Rank]

GO

CREATE USER [GulsWeb] FOR LOGIN [GulsWeb] WITH DEFAULT_SCHEMA = DBO;

GO

USE [Rank]

GO

GRANT EXECUTE TO GulsWeb;

GRANT SELECT TO GulsWeb;


USE [Tool]

GO

CREATE USER [GulsWeb] FOR LOGIN [GulsWeb] WITH DEFAULT_SCHEMA = DBO;

GO

USE [Tool]

GO

GRANT EXECUTE TO GulsWeb;

GRANT SELECT TO GulsWeb;

반응형

'연구개발 > DBA' 카테고리의 다른 글

select 처리순서  (0) 2017.08.02
Microsoft Windows DistributedCOM 오류 로그  (0) 2016.03.23
tempdb 분리  (0) 2016.03.15
성능 모니터  (0) 2015.12.16
성능 관련 기초 이론  (0) 2015.11.04
반응형

USE master

GO

--1. tempdb의논리파일이름확인

SELECT name, physical_name, state_desc

FROM sys.master_files

WHERE database_id = DB_ID(N'tempdb')

GO


--2. ALTER DATABASE 사용하여파일위치변경

ALTER DATABASE tempdb

MODIFY FILE(NAME = tempdev, FILENAME = 'C:\TempDB\tempdb.mdf')

ALTER DATABASE tempdb

MODIFY FILE(NAME = templog, FILENAME = 'C:\TempDB\templog.ldf')

GO


--3. Processor만큼파일분할및사이즈변경및파일사이즈, 증가옵션설정

ALTER DATABASE [tempdb] MODIFY FILE ( NAME = N'tempdev', SIZE = 20480KB , FILEGROWTH = 10240KB )

GO

ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev2', FILENAME = N'C:\TempDB\tempdev2.ndf' , SIZE = 20480KB , FILEGROWTH = 10240KB )

GO

ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev3', FILENAME = N'C:\TempDB\tempdev3.ndf' , SIZE = 20480KB , FILEGROWTH = 10240KB )

GO

ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev4', FILENAME = N'C:\TempDB\tempdev4.ndf' , SIZE = 20480KB , FILEGROWTH = 10240KB )

GO

ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev5', FILENAME = N'C:\TempDB\tempdev5.ndf' , SIZE = 20480KB , FILEGROWTH = 10240KB )

GO

ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev6', FILENAME = N'C:\TempDB\tempdev6.ndf' , SIZE = 20480KB , FILEGROWTH = 10240KB )

GO

ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev7', FILENAME = N'C:\TempDB\tempdev7.ndf' , SIZE = 20480KB , FILEGROWTH = 10240KB )

GO

ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev8', FILENAME = N'C:\TempDB\tempdev8.ndf' , SIZE = 20480KB , FILEGROWTH = 10240KB )

GO

ALTER DATABASE [tempdb] MODIFY FILE ( NAME = N'templog', SIZE = 163840KB )

GO

--4.SQL Server 서비스 재시작.

 


--5.SQL Server 서비스가 시작된것을확인후 정사 이동 확인 

SELECT name, physical_name, state_desc 

FROM sys.master_files

WHERE database_id = DB_ID(N'tempdb')

GO



반응형

'연구개발 > DBA' 카테고리의 다른 글

Microsoft Windows DistributedCOM 오류 로그  (0) 2016.03.23
mssql 권한설정  (0) 2016.03.16
성능 모니터  (0) 2015.12.16
성능 관련 기초 이론  (0) 2015.11.04
리소스 잠금 및 리소스 확인  (0) 2015.09.07
반응형

♬ 하드 디스크 병목 현상

-LogicalDisk\% Free Space 

-PhysicalDisk\% Idle Time

-PhysicalDisk\Avg. Disk Sec/Read

-PhysicalDisk\Avg. Disk Sec/Write

-PhysicalDisk\Avg. Disk Queue Length

-Memory\Cache Bytes

 메모리 병목 현상

-Memory\% Committed Bytes in Use

-Memory\% Available Mbytes

-Memory\Free System Page Table Entries

-Memory\Pool Non-Paged Bytes

-Memory\Pool Paged Bytes

-Memory\Pages per Second

 프로세서 병목 현상

-Processor\% Processor Time

-Processor\% User Time

-Processor\% Interrupt Time

-System\Processor Queue Length

 네트워크 병목 현상

-Network Interface\Bytes Total/Sec

-Network Interface\Output Queue Length

 프로세스 병목 현상

-Process\Handle Count 

-Process\Thread Count

-Process\Private Bytes 




https://technet.microsoft.com/ko-kr/magazine/2008.08.pulse.aspx

반응형

'연구개발 > DBA' 카테고리의 다른 글

mssql 권한설정  (0) 2016.03.16
tempdb 분리  (0) 2016.03.15
성능 관련 기초 이론  (0) 2015.11.04
리소스 잠금 및 리소스 확인  (0) 2015.09.07
RECOMPILE  (0) 2015.09.04
반응형

성능 관련 기초 이론
※ 모델링 - 시스템에 영향을 미칠 수 있는 요소들을 추출하여 이들의 연관관계를 도식화하는 것
- Queuing Network Model(QNM)
  : 1976년 Jeffrey P. Buzen이 제안, 1978년 Peter J.Denning&Jeffrey P. Buzen에 의해 확장
  : 컴퓨터 시스템의 대기 행렬을 의미하는 큐들의 네트워크
  : 다중 서버에 대한 모델링이 가능
  : 'Operational Law'에 의해 분석

- 단일 서버 QNM
  : 서버가 하나인 경우 사용(2Tier)
  : 사용자가 서버에 Request하는 경우, Queue를 거쳐 서비스 요청
  : Parameters - 부하 강도(사용자의 호출 빈도), 서비스 요구량(사용자 요청을 처리하는 데 소요되는 시간)
  : Operation Law
    → 이용률(Utilization): 전체 측정 시간 대비 서비스 시간의 비율
    → 응답시간(Response Time): 사용자가 서버에서 머물렀던 평균 시간(서비스 시간+대기 시간)
    → 큐 길이(Queue Length): 서버에 머무르고 있는 총 사용자 수(서비스 + 대기)
    → 처리량(Throughtput): 서버가 서비스 처리 종료 후 서버를 출발하는 비율
  : Operation Law의 의미
    → 이용률(Utilization): 대상 서버에 대한 가용 자원 대비에 현재 이용되고 있는 정도
                            0≤이용률≤1, 1이 되면 서버에 병목현상 발생, 부하강도가 증가하면 이용률도 증가
    → 응답시간(Response Time): 사용자가 서비스를 요청하고 받을 때까지 걸리는 시간
                                이용률(부하강도)의 증가에 따라 기하급수적으로 증가
    → 큐 길이(Queue Length): 큐를 점유하고 있는 사용자 수
                              이용률(부하강도)의 증가에 따라 기하급수적으로 증가
    → 처리량(Throughtput): 대상 서버에서 요청 건수의 대비 처리량
                            이용률의 증가에 따라 같이 증가, 이용률이 1이 되면 일정 수준 유지

- 다중 서버 QNM
  : 서버가 여러 개일 경우 사용(3Tier over)
  : 사용자가 서버에 Request하는 경우, Web Server → WAS → DB 서버 등을 거쳐 서비스 요청 및 처리
  : Parameters - 부하 강도(사용자의 호출 빈도), 실행 시간(각 개별 서버 별 요청 처리에 소요되는 시간)
                 ※ 부하 강도는 시스템의 종류에 따라 각각 다르게 정의될 수 있음
                    (ex. TP-Monitor: 요청건수, Batch: 동시 사용자, 웹 기반, C/S 시스템: 동시 사용자 수&평균 Think time 등)
  : Operation Law는 단일 서버 QNM과 유사

- Operation Law
  : QNM에서 서버의 여러 특성들을 파라미터화하여 주요 평가 항목들을 추출할 때 사용하는 주요 공식의 기반
  : 파라미터화 된 기본 항목들은 측정 도구에 의해 측정 가능

  ※ 기본 항목
    → T: 대상 시스템을 모니터링한 총 소요 시간(초)
       A: T시간 동안 시스템에 요청된 총 요청 건수(건)
       C: T시간 동안 시스템에서 처리된 총 처리 건수(건)
       B: 시스템이 요청을 처리하기 위해 사용된 총 서비스 시간(Bysu Time, 초)
       W: 시스템이 요청을 처리하기 위해 사용된 총 응답 시간(서비스 시간 + 대기 시간)
       Z: 사용자가 다음 요청을 준비하기 위해 소요된 Think time(초)
       N: T시간 동안 시스템을 사용하고 있는 사용자 수(명)

  ※ 도출되는 성능 수치 항목
    → 호출비율(Arrival Rate): 단위 시간당 시스템으로 들어오고 있는 건수(λ=A/T)
    → 처리량(Throughtput): 단위 시간당 시스템에서 처리 되고 있는 건수(X=C/T)
    → 이용률(Utilization): 총 소요 시간 대비의 총 서비스 시간 비율(U=B/T)
    → 평균 서비스 시간(Service Time): 요청을 처리하기 위해 소요된 평균 서비스 시간(S=B/C)
    → 응답 시간(Response Time): 요청을 처리하기 위해 소요된 평균 응답 시간(R=W/C)


- Utilization Law
  : U=B/T=(B/C)*(C/T)=S*X
  : 총 소요 시간 대비의 총 서비스 시간 비율 = 단위 시간당 시스템의 처리 건수 * 처리 건당 소요되는 평균 서비스 시간

- Little's Law
  : 서버상의 큐 길이를 설정할 때 참조할 수 있는 공식
  : Q(큐의 길이) = W/T = (W/C)*(C/T) = R*X

- Response Time's Law
  : X(처리량) = 총 호출 건수/총 소요 시간 = N*(T*(R+Z))/T = N*(R+Z)

- Forced-Flow Law
  : 개별 리소스와 전체 시스템 사이의 상관 관계를 보여주는 공식
  : C - 전체 시스템에 대한 처리 건수
    Ck- 개별 리소스에 대한 처리 건수(k번째 리소스)
    Vk- 개별 리소스에 대한 Visit Ratio(k번째 리소스)
    Dk- 개별 리소스에 대한 서비스 요구량(k번째 리소스)

    Vk = Ck/C(k번째 리소스)
    Xk = Vk*X (k번째 리소스에 대한 처리량)
    Uk = Xk*Sk (k번째 리소스에 대한 사용율)
       = X*Vk*Sk
       = X*Dk

- 처리량 상관관계
  : Forced-Flow Law에 의해 도출된 각 리소스에 대한 처리량을 통해 전체 시스템의 처리량을 정의할 수 있음
  : 전체 시스템을 구성하는 n개의 독립 서버의 각 처리량을 Tn이라할 때, 다음과 같이 처리량을 도출할 수 있음
  ※ 전체 Throughput(단, 각각의 서버가 동일한 리소스에 의해 병목을 직면하고 있는 경우)
    T = 1/(1/T1+1/T2+1/T3+1/T4+1/T5+....+1/Tn) = 1/(∑(1/Tn))
  ※ Throughput of Block A&B = 1/(1/a+1/b)

- 병목 지점 분석
  : 임계 지점 부근의 처리량(X)과 응답 시간(R)의 상관 관계
    → X(N)≤min{1/Dmax, N/(D+Z)}
       R(N)≥max{D, NDmax-Z}
       where Dmax: 병목 지점의 서비스 시간
             D=∑Dn
       전제조건: 어떠한 리소스라도 이용률은 1이하이다.
                 N명의 사용자를 처리하고 있는 시스템의 응답 시간은 1명의 사용자를 처리하는 시스템보다 더 빠를 수 없다

  : 처리량의 경우 입계 사용자 수 근방까지 시스템의 용청을 원할하게 처리, 포화 지점 이후 병목 발생 수평을 유지
  : 임계 사용자 수 지점의 처리량은 해당 시스템의 최대 처리량 or 임계 처리량
  : 응답 시간은 임계점 이전은 일정하게 유지, 포화 지점 이후 병목 발생으로 응답시간 증가

===================================================================================================================

 

각종 공식들에 눈돌아가네요...@_@;

DB와는 직접적인 관련이 없습니다만... 알아두시면 좋으실 듯 해서 두번째 정리본 올립니당~^^ㅋ


출처 : http://cafe.naver.com/prodba/3664

반응형

'연구개발 > DBA' 카테고리의 다른 글

tempdb 분리  (0) 2016.03.15
성능 모니터  (0) 2015.12.16
리소스 잠금 및 리소스 확인  (0) 2015.09.07
RECOMPILE  (0) 2015.09.04
tempdb 대량 I/O 발생시키는 쿼리 확인  (0) 2015.09.01
반응형

-- 출처 : SQLTAG BOOK2 


CREATE TABLE dbo.TEST_RESOURCE

( COL1 int NOT NULL

, COL2 varchar(100) NULL

, COL3 smallint NOT NULL

, COL4 varchar(10) SPARSE NULL

, COL5 char(10) NOT NULL

, COL6 char(30) NULL

, COL7 varchar(max) NOT NULL

)

GO


INSERT dbo.TEST_RESOURCE

( COL1

, COL2

, COL3

, COL4

, COL5

, COL6

, COL7

)

VALUES

(1,'A',1,'AA','A','A',REPLICATE(CONVERT(varchar(max),'A'),10000)),

(2,'BB',2,'BBB','BB','BB',REPLICATE(CONVERT(varchar(max),'A'),300)),

(3,'CCC',30,'CCCC','CCC','CCC',REPLICATE(CONVERT(varchar(max),'A'),10))

GO


ALTER TABLE dbo.TEST_RESOURCE

ADD CONSTRAINT PK_TEST_RESOURCE

PRIMARY KEY CLUSTERED

( COL3

)

GO


CREATE UNIQUE NONCLUSTERED INDEX UNCIDX_TEST_RESOURCE

ON dbo.TEST_RESOURCE

( COL1

)

GO


-- 1. Partition Id 확인(PK_TEST_RESOURCE)

SELECT %%ROWDUMP%% AS [ROWDUMP]

, sys.fn_GetRowsetIdFromRowDump(%%ROWDUMP%%) AS PARITION_ID

FROM dbo.TEST_RESOURCE

GO


-- 2. Partition Id 확인(UNCIDX_TEST_RESOURCE)

SELECT %%ROWDUMP%% AS [ROWDUMP]

, sys.fn_GetRowsetIdFromRowDump(%%ROWDUMP%%) AS PARITION_ID

FROM dbo.TEST_RESOURCE WITH(INDEX(UNCIDX_TEST_RESOURCE))

GO


-- 3. 가변 길이 칼럼의 행 정보 확인

SELECT %%ROWDUMP%% AS [ROWDUMP]

, RDC.*

FROM dbo.TEST_RESOURCE AS TR

CROSS APPLY

sys.fn_RowDumpCracker(%%ROWDUMP%%) AS RDC

GO


-- 3. File Id, Page Id, Slot Id, KeyHashValue 확인(PK_TEST_RESOURCE)

SELECT %%PHYSLOC%% AS PHYSLOC

, sys.fn_PhysLocFormatter(%%PHYSLOC%%) AS [FILEID:PAGEID:SLOTID]

, PLC.*

, %%LOCKRES%% AS [LOCKRES]

FROM dbo.TEST_RESOURCE AS TR

CROSS APPLY

sys.fn_PhysLocCracker(%%PHYSLOC%%) AS PLC

GO


-- 4. File Id, Page Id, Slot Id, KeyHashValue 확인(UNCIDX_TEST_RESOURCE)

SELECT %%PHYSLOC%% AS PHYSLOC

, sys.fn_PhysLocFormatter(%%PHYSLOC%%) AS [FILEID:PAGEID:SLOTID]

, PLC.*

, %%LOCKRES%% LOCKRES

FROM dbo.TEST_RESOURCE AS TR WITH(INDEX(UNCIDX_TEST_RESOURCE))

CROSS APPLY

sys.fn_PhysLocCracker(%%PHYSLOC%%) AS PLC

GO

반응형

'연구개발 > DBA' 카테고리의 다른 글

성능 모니터  (0) 2015.12.16
성능 관련 기초 이론  (0) 2015.11.04
RECOMPILE  (0) 2015.09.04
tempdb 대량 I/O 발생시키는 쿼리 확인  (0) 2015.09.01
tempdb file read/write i/o 기록 확인  (0) 2015.08.31
반응형


--1단계 : 가장 많은 리컴파일 데이터베이스 찾기

CREATE EVENT SESSION [XE_Database_Recompile_Histogram] ON SERVER

ADD EVENT sqlserver.sql_statement_recompile(

ACTION(sqlserver.database_id)

WHERE ([package0].[counter]<(2000)))

ADD TARGET package0.histogram(

SET filtering_event_name = N'sqlserver.sql_statement_recompile'

, slots = (100)

, source = N'sqlserver.database_id')

WITH (

MAX_MEMORY = 4096 KB

, EVENT_RETENTION_MODE = ALLOW_MULTIPLE_EVENT_LOSS

, MAX_DISPATCH_LATENCY = 5 SECONDS


)

GO



-- 2단계 : 어떤 이유로 리컴파일이 가장 많이 발생하는지 찾기

CREATE EVENT SESSION [XE_Database_Recompile_Histogram_Cause] ON SERVER 

ADD EVENT sqlserver.sql_statement_recompile(

    WHERE (

[package0].[less_than_uint64]([package0].[counter],(2000)) 

AND [package0].[equal_uint64]([sqlserver].[database_id],(54)))) 

ADD TARGET package0.histogram(

SET filtering_event_name=N'sqlserver.sql_statement_recompile'

, source=N'recompile_cause'

, source_type=(0))

WITH (

MAX_MEMORY=4096 KB

, EVENT_RETENTION_MODE=ALLOW_MULTIPLE_EVENT_LOSS

, MAX_DISPATCH_LATENCY=5 SECONDS

, MAX_EVENT_SIZE=0 KB

, MEMORY_PARTITION_MODE=NONE

, TRACK_CAUSALITY=OFF

, STARTUP_STATE=OFF

)

GO



-- 3단계 : 2단계에서 찾은 원인에 해당하는 쿼리 찾기

CREATE EVENT SESSION [XE_Database_Recompile_Histogram_Cause_Statement] ON SERVER 

ADD EVENT sqlserver.sql_statement_recompile(

    ACTION(sqlserver.sql_text,sqlserver.tsql_stack)

    WHERE (

[package0].[counter]<(2000) AND [sqlserver].[database_id]=(10)

AND [recompile_cause]=(11))) 

ADD TARGET package0.event_file(

SET filename=N'XE_Database_Recompile_Histogram_Cause_Statement'

, max_file_size=(100))

WITH (

MAX_MEMORY=4096 KB

, EVENT_RETENTION_MODE=ALLOW_MULTIPLE_EVENT_LOSS

, MAX_DISPATCH_LATENCY=5 SECONDS

, MAX_EVENT_SIZE=0 KB

, MEMORY_PARTITION_MODE=NONE

, TRACK_CAUSALITY=OFF

, STARTUP_STATE=OFF

)

GO



-- 시작

ALTER EVENT SESSION [XE_Database_Recompile_Histogram] ON SERVER

STATE = START

GO


ALTER EVENT SESSION [XE_Database_Recompile_Histogram_Cause] ON SERVER

STATE = START

GO


ALTER EVENT SESSION [XE_Database_Recompile_Histogram_Cause_Statement] ON SERVER

STATE = START

GO



-- 종료

ALTER EVENT SESSION [XE_Database_Recompile_Histogram] ON SERVER

STATE = STOP

GO


ALTER EVENT SESSION [XE_Database_Recompile_Histogram_Cause] ON SERVER

STATE = STOP

GO


ALTER EVENT SESSION [XE_Database_Recompile_Histogram_Cause_Statement] ON SERVER

STATE = STOP

GO



-- 삭제

DROP EVENT SESSION [XE_Database_Recompile_Histogram] ON SERVER

GO


DROP EVENT SESSION [XE_Database_Recompile_Histogram_Cause] ON SERVER

GO


DROP EVENT SESSION [XE_Database_Recompile_Histogram_Cause_Statement] ON SERVER

GO




-- 1단계 XQuery를 이용한 분석

SELECT db_name(xnode.xdata.query('.').value('(Slot/value)[1]','varchar(max)')) AS database_name

, xnode.xdata.query('.').value('(Slot/@count)[1]','varchar(max)') as recompile_count

FROM (

SELECT CAST(target_data as xml) as target_data

FROM sys.dm_xe_sessions as s

INNER JOIN sys.dm_xe_session_targets as t

ON s.address = t.event_session_address

WHERE s.name = 'XE_Database_Recompile_Histogram') as a

CROSS APPLY a.target_data.nodes('HistogramTarget/Slot') as xnode (xdata)

GO



-- 2단계 XQuery를 이용한 분석

;WITH cte_xdata_results as (

SELECT xnode.xdata.query('.').value('(Slot/value)[1]','varchar(max)') as recompile_cause

, xnode.xdata.query('.').value('(Slot/@count)[1]','varchar(max)') as recompile_count

FROM (

SELECT CAST(target_data as xml) as target_data

FROM sys.dm_xe_sessions as s

INNER JOIN sys.dm_xe_session_targets as t

ON s.address = t.event_session_address

WHERE s.name = 'XE_Database_Recompile_Histogram_Cause'

) as a

CROSS APPLY a.target_data.nodes('HistogramTarget/Slot') as xnode (xdata)

)

SELECT map_value as statement_recompile_cause

, recompile_count

FROM cte_xdata_results as x

INNER JOIN sys.dm_xe_map_values as mv

ON x.recompile_cause = mv.map_key

WHERE mv.name = 'statement_recompile_cause';

GO



-- 3단계 분석

/* 

tsql_stack 의 handle를 이용해 프로덕션 데이터베이스에서 조회 할 수 있음.(결과가 모두 출력되지 않으면

도구 > 옵션 > 쿼리 결과 > SQL Server > 텍스트로 결과 표시 > 각 열에 표시할 최대 문자 수를 적당하게 변경 후 SSMS 재시작)

*/

SELECT *

FROM sys.dm_exec_sql_text(0x03002E005D05B6215B3BFB00A2A2000001000000000000000000000000000000000000000000000000000000);



;WITH cte_dm_xe_sessions AS (

SELECT xnode.xdata.query('./data').value('(data[@name="recompile_cause"]/text)[1]','varchar(max)') AS recompile_cause

, db_name(xnode.xdata.query('./data').value('(data[@name="source_database_id"]/value)[1]','varchar(max)')) AS [db_name]

, xnode.xdata.query('./data').value('(data[@name="object_type"]/text)[1]','varchar(max)') AS object_type

, xnode.xdata.query('./action').value('(action[@name="sql_text"]/value)[1]','varchar(max)') AS sql_text

, xnode.xdata.query('./action/value/frames') AS tsql_stack_frames

FROM ( SELECT CONVERT(xml,target_data) AS target_data

FROM sys.dm_xe_sessions AS s

INNER JOIN

sys.dm_xe_session_targets AS t

ON s.[address] = t.event_session_address

WHERE s.name = 'XE_Database_Recompile_Histogram_Cause_Statement'

AND target_name = 'ring_buffer'

) AS a

CROSS APPLY

a.target_data.nodes('RingBufferTarget/event') xnode (xdata)

)

SELECT a.db_name

, a.recompile_cause

, a.object_type

, a.sql_text

, [level] AS frame_level

, b.[text]

, SUBSTRING

( b.[text]

, (offsetStart/2)+1

, (( CASE offsetEnd

WHEN -1 THEN DATALENGTH(b.[text])

ELSE offsetEnd

END - offsetStart

)/2)+1

) AS stmt

FROM ( SELECT a.*

, ynode.ydata.query('.').value('(frame/@level)[1]','varchar(max)') AS [level]

, ynode.ydata.query('.').value('(frame/@handle)[1]','varchar(max)') AS handle

, ynode.ydata.query('.').value('(frame/@offsetStart)[1]','varchar(max)') AS offsetStart

, ynode.ydata.query('.').value('(frame/@offsetEnd)[1]','varchar(max)') AS offsetEnd

FROM cte_dm_xe_sessions AS a

CROSS APPLY

a.tsql_stack_frames.nodes('frames/frame') ynode (ydata)

) AS a

OUTER APPLY

sys.dm_exec_sql_text (CONVERT(varbinary(max),handle,1)) b

GO

반응형
반응형

-- tempdb 의 I/O 관련 장애처리


CREATE DATABASE DBA

GO


USE DBA

GO


-- DROP TABLE dbo.TBL_ANALYSIS_MONITOR_TEMPDB

-- GO

CREATE TABLE dbo.TBL_ANALYSIS_MONITOR_TEMPDB

(

Event_Date datetime -- 로깅 시작

, Event_Idx int identity -- 중복방지 자동증가값

, Task_UserObj_Alloc_Cnt int -- 유저오브젝트 페이지 할당수

, Task_UserObj_Dealloc_Cnt int -- 유저오브젝트 페이지 해제수

, Task_Internal_Alloc_Cnt int -- 내부오브젝트 페이지 할당수

, Task_Internal_Dealloc_Cnt int -- 내부오브젝트 페이지 해제수

, Degree_of_Parallelism smallint -- 병렬처리수준

, Database_ID int -- DB_ID

, User_ID int -- 실행 유저 ID

, SQL_Handle varbinary(64) -- 후에 추적 가능하도록 로깅

, Plan_Handle varbinary(64) -- 후에 추적 가능하도록 로깅

, SQL_Text100 nvarchar(100) -- 핸들 조인 안될경우 대비

, CONSTRAINT CPK__TBL_ANALYSIS_MONITOR_TEMPDB__01 PRIMARY KEY CLUSTERED (Event_Date, Event_Idx)

);

GO


IF object_id('dbo.USP_TEMP_IO_GETTER') IS NULL

EXEC ('CREATE PROC dbo.USP_TEMP_IO_GETTER AS SELECT 1')

GO


ALTER PROCEDURE dbo.USP_TEMP_IO_GETTER

(

@pRoop_Cnt int = 60

)

AS

BEGIN

SET NOCOUNT ON;

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;


DECLARE @vDate_Time datetime, @vCnt int = 0


WHILE @vCnt < @pRoop_Cnt

BEGIN

SELECT @vDate_Time = GETDATE(), @vCnt += 1;


WITH cteSU AS (

SELECT TOP 10

session_id

, request_id

, SUM(user_objects_alloc_page_count) as [userobj_alloc_cnt]

, SUM(user_objects_dealloc_page_count) as [userobj_dealloc_cnt]

, SUM(internal_objects_alloc_page_count) as [internal_alloc_cnt]

, SUM(internal_objects_dealloc_page_count) as [internal_dealloc_cnt]

, COUNT(session_id) as [degree_of_parallelism]

FROM tempdb.sys.dm_db_task_space_usage

WHERE database_id = 2

AND (user_objects_alloc_page_count > 0 OR internal_objects_alloc_page_count > 0)

AND session_id <> @@spid

AND session_id > 50

GROUP BY session_id, request_id

ORDER BY SUM(user_objects_alloc_page_count)

+ SUM(internal_objects_alloc_page_count) DESC

)

INSERT INTO DBA.dbo.TBL_ANALYSIS_MONITOR_TEMPDB

(Event_Date

, Task_UserObj_Alloc_Cnt

, Task_UserObj_Dealloc_Cnt

, Task_Internal_Alloc_Cnt

, Task_Internal_Dealloc_Cnt

, Degree_of_Parallelism

, Database_ID

, User_ID

, SQL_Handle

, Plan_Handle

, SQL_Text100

)

SELECT GETDATE() AS event_date

, A.userobj_alloc_cnt

, A.userobj_dealloc_cnt

, A.internal_alloc_cnt

, A.internal_dealloc_cnt

, A.degree_of_parallelism

, ER.database_id

, ER.user_id

, ER.sql_handle

, ER.plan_handle

, LEFT(ST.text, 100)

FROM cteSU AS A 

INNER JOIN sys.dm_exec_requests AS ER

ON ER.session_id = A.session_id AND ER.request_id = A.request_id

OUTER APPLY sys.dm_exec_sql_text(ER.sql_handle) AS ST


WAITFOR DELAY '00:00:01'


END

END;

GO


SELECT ST.text as [SQL_Text]

, QP.query_plan as [Plan_XML]

, AMT.Max_Task_UserObj_Alloc_Cnt

, AMT.Max_Task_Internal_Alloc_Cnt

, AMT.Database_ID

, AMT.SQL_Text100

FROM (

SELECT TOP 10

SQL_Handle, Plan_Handle, Database_ID

, MAX(Task_UserObj_Alloc_Cnt) as [Max_Task_UserObj_Alloc_Cnt]

, MAX(Task_Internal_Alloc_Cnt) as [Max_Task_Internal_Alloc_Cnt]

, SQL_Text100

FROM DBA.dbo.TBL_ANALYSIS_MONITOR_TEMPDB

GROUP BY SQL_Handle, Plan_Handle, Database_ID, SQL_Text100

ORDER BY MAX(Task_UserObj_Alloc_Cnt) + MAX(Task_Internal_Alloc_Cnt) DESC

) AS AMT 

OUTER APPLY sys.dm_exec_sql_text(AMT.sql_handle) as ST

OUTER APPLY sys.dm_exec_query_plan(AMT.Plan_Handle) as QP

GO



EXEC dbo.USP_TEMP_IO_GETTER;

반응형

'연구개발 > DBA' 카테고리의 다른 글

리소스 잠금 및 리소스 확인  (0) 2015.09.07
RECOMPILE  (0) 2015.09.04
tempdb file read/write i/o 기록 확인  (0) 2015.08.31
tempdb 많이 사용하는 실행계획과 텍스트 반환  (0) 2015.08.31
SQL Server 메모리  (0) 2015.06.04
반응형


-- Read I/O

CREATE EVENT SESSION [MONITOR_FILEIO_READ_HISTOGRAM]

ON SERVER

ADD EVENT sqlserver.file_read

( SET collect_path = (1)

WHERE

( -- tempdb 드라이브 path를 지정

[sqlserver].[like_i_sql_unicode_string]([path],N'E:\%')

)

)


ADD TARGET package0.histogram

( SET filtering_event_name = N'sqlserver.file_read'

, source = N'path'

, source_type = (0)

)

WITH

( max_memory = 4096 kb

, event_retention_mode = allow_single_event_loss

, max_dispatch_latency = 30 seconds

, max_event_size = 0 kb

, memory_partition_mode = none

, track_causality = off

, startup_state = off

)

GO




-- Write I/O

CREATE EVENT SESSION [MONITOR_FILEIO_WRITTEN_HISTOGRAM]

ON SERVER

ADD EVENT sqlserver.file_written

( SET collect_path = (1)

WHERE

( -- tempdb 드라이브 path를 지정

[sqlserver].[like_i_sql_unicode_string]([path],N'E:\%')

)

)


ADD TARGET package0.histogram

( SET filtering_event_name = N'sqlserver.file_written'

, source = N'path'

, source_type = (0)

)

WITH

( max_memory = 4096 kb

, event_retention_mode = allow_single_event_loss

, max_dispatch_latency = 30 seconds

, max_event_size = 0 kb

, memory_partition_mode = none

, track_causality = off

, startup_state = off

)

GO

반응형

'연구개발 > DBA' 카테고리의 다른 글

RECOMPILE  (0) 2015.09.04
tempdb 대량 I/O 발생시키는 쿼리 확인  (0) 2015.09.01
tempdb 많이 사용하는 실행계획과 텍스트 반환  (0) 2015.08.31
SQL Server 메모리  (0) 2015.06.04
LATCH  (0) 2015.06.03
반응형

SELECT TOP 10

TSU.session_id

, TSU.request_id

, TSU.task_alloc_cnt

, TSU.task_dealloc_cnt

, EST.text as [query_text]

, EQP.query_plan as [plan_xml]

FROM (

SELECT session_id

, request_id

, SUM(internal_objects_alloc_page_count) as [task_alloc_cnt]

, SUM(internal_objects_dealloc_page_count) as [task_dealloc_cnt]

FROM sys.dm_db_task_space_usage

GROUP BY session_id, request_id --병렬처리 그룹화

) as [TSU]

INNER JOIN sys.dm_exec_requests as [ER]

ON TSU.session_id = ER.session_id

AND TSU.request_id = ER.request_id

OUTER APPLY sys.dm_exec_sql_text (ER.sql_handle) as [EST]

OUTER APPLY sys.dm_exec_query_plan (ER.plan_handle) as [EQP]

WHERE TSU.session_id <> @@spid

ORDER BY TSU.task_alloc_cnt DESC




-- 버전스토오 사용시 TEMPDB 사용량 확인

SELECT TOP 10

SDT.session_id

, SDT.elapsed_time_seconds

, SDT.is_snapshot

, EST.text as query_text

, EQP.query_plan as plan_xml

FROM sys.dm_tran_active_snapshot_database_transactions as [SDT]

LEFT OUTER JOIN sys.dm_exec_requests as [ER]

ON SDT.session_id = ER.session_id

OUTER APPLY sys.dm_exec_sql_text (ER.sql_handle) as [EST]

OUTER APPLY sys.dm_exec_query_plan (ER.plan_handle) as [EQP]

ORDER BY elapsed_time_seconds DESC;

반응형

'연구개발 > DBA' 카테고리의 다른 글

tempdb 대량 I/O 발생시키는 쿼리 확인  (0) 2015.09.01
tempdb file read/write i/o 기록 확인  (0) 2015.08.31
SQL Server 메모리  (0) 2015.06.04
LATCH  (0) 2015.06.03
DB 에서 사용되는 명령어 정리  (0) 2015.03.13
반응형

1. SQL Server 메모리의 이해

 

데이터는 디스크에 저장되고 디스크에서 검색을 하는데 디스크 I/O 작업에 많은 리소스를

소비하게 되므로 SQL Server는 디스크 I/O 작업을 효율적으로 관리하기 위하여 버퍼풀의

메모리 구조를 이용한다.

 

1) SQL Server 메모리 동작 방식

데이터를 조회하게 되면 SQL Server는 버퍼풀에 데이터가 있는지 확인하고 없을 경우

디스크에서 버퍼풀로 데이터를 복사한 후 데이터를 사용한다.

버퍼풀에 데이터가 있으면 디스크에 액세스 하지 않고 버퍼풀의 데이터를 바로 사용한다.

데이터를 변경하게 되면 트랜잭션 로그에는 변경 내역이 즉시 반영되지만 실질적인

데이터 페이지에는 CHECKPOINT 시점의 최종적으로 수정된 데이터만 디스크에 쓰여져

디스크 I/O를 줄여준다.

SQL Server가 사용하는 메모리는 동적으로 관리된다.

처음 시작될 때 SQL Server는 가동에 필요한 최소한의 메모리 공간만 할당 받아서 사용하게 된다.

SQL Server가 운영되는 동안 메모리가 필요할 경우 시스템의 여유 메모리를 할당 받아 사용하고,

사용이 끝나 다른 곳에서 메모리를 요구할 경우 메모리를 반환한다.

 


 

 

2) 32비트 시스템 메모리 특징

32bit 응용 프로그램에서는 총 4GB의 프로세스 주소 공간을 할당할 수 있다.

이중 2GB OS의 커널 모드 주소 공간. 2GB는 사용자 모드 주소 공간으로 사용한다.

메모리 옵션을 사용하여 커널 모드 주소 공간을 1GB로 제한하고, 응용 프로그램에 더 할당하거나

AWE 옵션을 활용하여 사용자 모드 주소 공간을 확장하여 응용 프로그램이 더 많은 메모리를

용할 수 있도록 한다.


 

 

3) 메모리 설정을 해야 하는 이유

부하가 많은 시스템에서 I/O가 지속적으로 발생하면 SQL Server는 시스템의 메모리를 계속

요구하며 할당 받아 사용하게 되는데 이는 OS나 다른 응용 프로그램의 동작에 영향을 줄 수 있다

반대로 OS나 다른 응응 프로그램에서 많은 공간의 메모리를 사용하고 있다면

SQL Server가 할당 받아 사용할 메모리가 줄어들게 된다.

SQL Server의 버퍼풀 메모리가 부족할 경우 잦은 디스크 I/O를 발생시키고, 쿼리를

실행하는데 필요한 최소 메모리를 얻지 못하고 리소스를 대기하는 동안 오류가 발생한다.

 

 

 

2. 메모리 설정 옵션들

 

1) 부팅 옵션

3GB

32bit 환경에서 4GB 메모리를 사용 중이라면 boot.ini /3GB 옵션을 설정해서 운영체제에

1GB를 할당 하고, SQL Server 3GB를 할당해서 사용할 수 있다.

그러나 16GB를 초과하는 메모리를 사용할 경우에는 가상메모리 주소 할당을 위해 커널 모드에

2GB 이상의 메모리가 필요하기 때문에 /3GB 옵션은 해제해야 한다.

 

PAE

32bit 운영체제에서 4GB이상의 물리메모리를 사용할 수 있도록 확장

AWE 설정 시 필수 사항

 

2) 시스템 옵션

LOCK PAGE IN MEMORY

시스템이 디스크의 가상 메모리로 데이터를 페이징 하지 않도록 방지.

OS에서 메모리 반환 요청을 하지 않는다. 

AWE +  LOCK PAGE IN MEMORY 설정을 하면 할당된 메모리를 해제하지 않기 때문에 OS에 메모리를

뺏기지 않는다. 그래서 max server memory를 지정해 주지 않으면 OS가 메모리 부족을 감지할 경우 

buffer pool 영역 이외의 영역이 non-buffer pool 영역에서 메모리를 빼앗기게 때문에 더 심각한 문제가 

발생할 수 있다. 그래서 max server memory  설정을 해야한다. 

32bit 환경에서 4GB 이상 메모리를 사용해야 하는 경우나 64bit 시스템을 사용할 경우 이 옵션을 반드시 설정 해야한다. 

 

LARGE SYSTEM CACHE

변경 된 데이터 페이지를 물리적인 메모리에 남겨두는 제한을 설정한다.

시스템 캐시를 사용하게 되면 서버의 성능은 향상되지만 애플리케이션에서

사용할 수 있는 가용메모리는 줄어들게 된다.

응용 프로그램이 좀 더 메모리를 사용할수 있게 해주는 옵션임.

http://sqlsql.tistory.com/82

 

3) SP_CONFIGURE 옵션

min/max server memory

max server memory 까지 메모리를 확보 후 min server memory 까지 메모리를 해제.

min/max server memory를 같게 하여 SQL Server간 메모리 할당 해제에 따른 리소스 최소화.

 

AWE

4GB를 초과하는 물리적인 메모리를 32bit 주소 공간에 동적으로 할당하는 역할

/PAE 옵션과 함께 사용

확장된 메모리는 버퍼풀로만 매핑해서 활용

 

4) Trace flag 옵션

845

Lock Page in Memory를 사용할 수 있도록 하는 옵션

SQL Server 구성관리자 -> SQL Server 서비스 -> SQL Server 속성 -> 고급 -> 시작 매개 변수 마지막에 ;-T845 추가 (맞나?..)

 

836

Max server memory로 지정된 공간까지 버퍼풀 메모리를 확보

AWE모드에서 작동

 

834

버퍼풀에 할당된 메모리가 Windows 큰 페이지 할당을 사용하도록 한다.

 

5) 시스템 별 메모리 옵션 설정하기

32bit SQL Server & 32bit Windows Server

/3GB 옵션으로 OS 1GB, 응용 프로그램 3GB 할당

만약 4GB를 초과하는 메모리를 사용한다면 /PAE 옵션을 통해 4GB 메모리 주소 공간을

최대 64GB까지 확장하고, AWE 옵션으로 SQL Server가 확장된 주소 공간을 버퍼풀

영역으로 사용할 수 있도록 설정.

Lock Page in Memory 설정으로 메모리가 페이징 되는 것을 방지.

max server memory 옵션 설정

16GB를 초과하는 메모리를 사용할 경우 3GB 옵션을 제거

 

64bit SQL Server & 64bit Windows Server

Lock Page in Memory / Max server memory 만 설정

3GB , PAE , AWE 옵션 필요 없음.

 

32bit SQL Server & 64bit Windows Server(WOW 모드)

OS 64bit 이기 때문에 내부적인 메모리의 동작 방식은 64bit 시스템을 따라간다.

그래서 PAE 옵션은 필요하지 않다. 하지만 SQL Server 32bit 시스템 이므로 AWE 모드를

활성화 한다. Lock Page in Memory / max server memory 옵션도 함께 설정한다.

 

 

 

3. MIN / MAX 메모리 설정하기

 

데이터 캐시를 위한 버퍼풀 영역의 크기만을 의미

SQL Server 전용 머신이라 할지라도 버퍼풀 이외 개체의 메모리 사용량을 예측하고 적절한

크기를 설정한다. 왜냐하면 SQL Server가 메모리를 확보한 후 해제하지 않아 OS나 다른

애플리케이션에서 메모리 부족으로 문제가 발생 하거나 반대로 SQL Server가 메모리를

확보하지 못해 느린 응답 속도를 낼 수 있다.

 

 

1) 메모리 크기 별 권장 메모리 설정

메모리 크기별 OS 필요 메모리

물리적 메모리

OS 필요 메모리

물리적 메모리

OS 필요 메모리

4GB 미만

512MB ~ 1GB

32 ~ 128GB

2 ~ 4GB

4~32GB

1 ~ 2GB

128GB 초과

4GB 초과

SQL Server 전용 서버에서의 최대 메모리

물리적 메모리

최대 메모리(MB)

물리적 메모리

최대 메모리(MB)

2GB

1500

4GB

3200

6GB

4800

8GB

6400

12GB

10000

16GB

13500

24GB

21500

32GB

29000

48GB

44000

64GB

60000

72GB

68000

96GB

92000

128GB

124000

 

 

 

 

2) 메모리 크기와 사용량 분석

-- 시스템메모리상태보기

select
        total_physical_memory_kb          -- 물리적메모리크기
        , available_physical_memory_kb    -- 사용가능한메모리크기
        , total_page_file_kb              -- 전체페이지파일
        , available_page_file_kb          -- 사용가능한페이지파일
        , system_memory_state_desc        -- 시스템메모리상태
from sys . dm_os_sys_memory
-- 버퍼풀상태보기
select
        physical_memory_in_bytes           -- 물리적메모리크기
        , virtual_memory_in_bytes          -- 가상메모리크기
        , bpool_committed                  -- 현재버퍼풀에할당된메모리크기
        , bpool_commit_target              -- 버퍼풀이최대로할당할수있는크기
        , bpool_visible                    -- AWE 메모리를매칭하고있는물리적주소공간
from sys . dm_os_sys_info
 
-- 데이터베이스별버퍼풀사용공간조회
select
        db_name (database_id ) as [database_name]
        , count(*) as [buffer_count]
        , cast( count (*)as bigint)* 8 / 1024.0 as[buffer_size(MB)]
from sys . dm_os_buffer_descriptors
where database_id <> 32767
group by db_name( database_id ),database_id
order by buffer_count desc

-- 개체별버퍼풀사용공간조회
select
        object_name (p . [object_id]) as [object_name]
        , p. index_id
        , count(*) as [buffer_count]
        , cast( count (*)as bigint)* 8 /1024.0 as [buffer size(MB)]
from sys . allocation_units as a
inner join sys. dm_os_buffer_descriptors as b
on a . allocation_unit_id= b .allocation_unit_id
inner join sys. partitions as p
on a . container_id= p .hobt_id
where b . database_id= db_id ()
and p . [object_id]> 100
group by p. [object_id] ,p . index_id
order by buffer_count desc

 

-- 버퍼풀이외의공간예측하기

select

       TYPE

       ,SUM(multi_pages_kb) as a

from sys.dm_os_memory_clerks

where multi_pages_kb != 0

 

group by type



츨처: http://ksewookk.blog.me/100178516895

 

[출처] SQL Server 메모리|작성자 dudu


반응형

'연구개발 > DBA' 카테고리의 다른 글

tempdb file read/write i/o 기록 확인  (0) 2015.08.31
tempdb 많이 사용하는 실행계획과 텍스트 반환  (0) 2015.08.31
LATCH  (0) 2015.06.03
DB 에서 사용되는 명령어 정리  (0) 2015.03.13
windows performance analyzer  (0) 2015.01.19
반응형

 LATCH는 목적으로 보면 잠금과 유사하지만 많은 차이점이 있다.

 래치는 SQL SERVER 메모리에서 다른 개체로 부터 페이지 데이터 무결성을 보장하는 객체로 정의할 수 있다.

 (잠금은 트랜잭션을 수행할 때, 데이터를 잠궈 안전하게 보호한다.)

 이는 페이지를 사용할 때 자원을 고립시켜 제어된 액세스를 보장하는 논리적 구조이다.

 잠금과의 차이점은 SQLOS 외부로 노출되지 않는 내부 SQL 서버 메커니즘이다.

 래치는 많은 유형이 있지만 대략 버퍼 래치(BUFFER LATCH), 비버퍼래치(NON BUFFER LATCH) 2종류로 나눌 수 있다.

 

 버퍼 캐시

  버퍼 래취를 이해하기 위해서는 먼저 버퍼 캐시의 목적을 이해해야 한다. 버퍼 캐시(또는 버퍼풀(BUFFER POOL)이라고 함)는

  데이터 페이지를 보유하는데 사용되는 메모리 영역이다. 버퍼 캐쉬는 많은 여러 버퍼를 포함하고 있으며 버퍼 캐시의 크기는 

  8192바이트(8k)이다. 이 영역은 디스크에서 읽을 수 있는 영역이며 만약 수정이 발생하였을 경우 디스크에 다시 기록한다.

  

  버퍼풀의 데이터 로딩은 FIFO 를 기초로 하며 캐시에서 오래된 데이터 또는 CHECKPOINT, DBCC DROPCLEANBUFFER로 비울 수 있다.

  (캐시를 비우기 전에 버퍼에 있는 모든 더티 페이지를 기록한다.) 버퍼 캐시의 각 버퍼는 디스크에서 읽은 데이터 페이지의 복사본을

  포함 할 수 있다.

  

  버퍼 관리자는 해시 테이블(특정 메모리 위치에 각 버퍼에 대한 포인터의 버킷 컬렉션 포함), 버퍼 배열(버퍼 포함) 그리고

  버퍼에 대한 쓰기 등 버퍼캐시의 구성요소를 관리할 책임이 있다. 이것은 메모리 영역에서 데이터를 저장하고 검색하기 위한

  메커니즘으로 데이터베이스 엔진과 메모리 페이지의 인터페이스이다.

  

  버퍼 래치는 버퍼 캐시의 페이지에 접근 할 때 발생한다. 이들은 잠금과 달리 트랜잭션이 지속되는 동안만 수행하고 더 이상 필요하지

  않을 때 해체된다. 하나의 트랜잭션에 많은 래치가 있으며 래치는 다양한 이류로 발생한다.

  

  버퍼 래치 중 가장 많이 알려진 종류 중 하나는 PAGE_IO_LATCH wait 이며 이것은 엔진이 I/O 동기화 작업을 기다리고 있는 것으로 완료

  되기 전까지 래치에 반영된다. 이것은 I/O 경합을 나타내는 것으로 DMV sys.dm_os_wait_stats로 모든 버퍼 래치를 볼 수 있다. 

  대기 유형은 sys.dm_exec_requests에서 last_wait_type 컬럼에서 볼 수 있다.

  

  뷰의 캐시에 있는 버퍼에 대한 정보는 DMV sys.dm_os_buffer_description 에서 확인할 수 있다. 이는 버퍼 캐시에 있는 각 데이터 페이지에 

  대해 하나의 행을 포함한다. Page_ID, Page_Type, Row_Count, free space 등을 보여주며 더티페이지 관해서는 나타내지 않는다.

  

  PAGE_IO_LATCH wait - 엔진이 I/O 동기화 작업을 기다리고 있는 것으로 완료 되기 전까지 래치에 반영

  DMV sys.dm_os_wait_stats - 모든 버퍼 래치 확인

  DMV sys.dm_os_buffer_descriptors - 버퍼에 대한 정보 확인

  

  

  LATCH CLASS 및 LATCH MODE

  버퍼 클래스는 기능에 따라 버퍼 래치와 비버퍼 래치의 여러 종류로 분류할 수 있다.

  버퍼 클래스는 일반적으로 사용된다. DMV는 waiting_requests_count 열을 쿼리하는 경우 대부분의 클래스는 순간 유휴 상태(0)이다.

  NULL LATCH (NL) : 사용하지 않음

  KEEP LATCH (KP) : 래치가 위치하는 동안 버퍼캐시에서 페이지를 유지하기 위한 목적과 참조 카운트를 유지하기 위한 목적.

  SHARED LATCH (SH) : 데이터 페이지를 읽은 요청이 있을 때

  UPDATE LATCH (UP) : EX 래치보다는 가벼움. 업데이트 동안 페이지에 읽기는 허용하나 쓰기 안됨.

  EXCLUSIVE LATCH (EX) : 기록되는 동안 페이지에 대한 액세스 허용하지 않음.

  DESTORY LATCH (DT) : 버퍼를 파괴하고 캐시를 축출하는데 사용.

 

  래치 대기는 여러 가지 이유로 발생 할 수 있다.

  예를 들어 작은 범위의 페이지에 업데이트가 많을 때 발생한다.


  래치 경합 다루기 - SuperLatch 를 사용한 병렬처리

   SuperLatch라는 버퍼 래치의 경합을 처리 할 수 있는 메커니즘이 있으며

   페이지의 병렬 처리를 가능하기 위해 다른 CPU 스케줄러(NUMA 아키텍쳐)에서 액세스 할 수 있다.



출처 : http://sqlmvp.kr/140199995476

반응형

'연구개발 > DBA' 카테고리의 다른 글

tempdb 많이 사용하는 실행계획과 텍스트 반환  (0) 2015.08.31
SQL Server 메모리  (0) 2015.06.04
DB 에서 사용되는 명령어 정리  (0) 2015.03.13
windows performance analyzer  (0) 2015.01.19
SQLStress version 0.1  (0) 2015.01.19
반응형
저장 프로시저
저장 프로시저 이름설명
sp_readerrorlogSQL Server 오류 로그를 반환합니다.
sp_cycle_errorlogSQL Server를 재시작하지 않고 새로운 오류 로그 파일만 생성합니다.
sp_helpservermaster.dbo.sysservers 시스템 테이블에 등록된 정보를 반환합니다.
sp_dropservermaster.dbo.sysservers 시스템 테이블에서 서버를 삭제합니다.
sp_addrservermaster.dbo.sysservers 시스템 테이블에 서버를 등록합니다.
sp_serveroptionmaster.dbo.sysservers 시스템 테이블에서 등록된 서버의 옵션을 변경합니다.
sp_blocker_pss80잠금 정보와 블로킹하는 프로세스와 블로킹 당하는 프로세스의 정보를 반환합니다.
http://support.microsoft.com/default.aspx?scid=kb;en-us;299518
sp_tempdbspapcetempdb 의 공간 사용 정보를 반환합니다.
sp_configure서버의 구성 옵션을 변경합니다.
sp_attach_db데이터베이스를 SQL Server에 연결합니다.
sp_attach_single_file_db로그 파일이 손실된 데이터베이스를 SQL Server에 연결합니다.
sp_detach_db데이터베이스를 분리합니다.
sp_resetstatus데이터베이스에서 주의 대상 플래그를 해제합니다.
sp_helpfile현재 데이터베이스 파일의 물리적 이름 및 특성을 반환합니다.
sp_change_users_login로그인 계정과 사용자 계정의 연결을 설정합니다.
sp_hexadecimalBinary값이나 Decimal값을 16진수 형태의 varchar 타입으로 변경한 값을 반환합니다.
http://support.microsoft.com/KB/246133
sp_help_revlogin원본과 동일한 SID와 패스워드를 가지는 로그인을 생성하는 스크립트를 반환합니다.
http://support.microsoft.com/KB/246133
 
DBCC 명령어
DBCC 명령설명
DBCC ERRORLOG새로운 SQL Server 오류 로그를 생성합니다.
DBCC SHOW_STATISTICS인덱스의 통계 정보를 보여 줍니다.
온라인 설명서 참조.
DBCC SHOWCONTIG인덱스의 단편화 정보를 보여 줍니다.
온라인 설명서 참조
DBCC DBREINDEX인덱스를 재구성합니다.
온라인 설명서 참조
DBCC INDEXDEFRAG인덱스의 페이지를 재정렬합니다.
온라인 설명서 참조
DBCC SQLPERF
(WAITSTATS)
각 대기 유형별로 대기 시간을 확인합니다.
DBCC SQLPERF
(LOGSPACE)
로그 파일의 사용 공간을 확인합니다.
온라인 설명서 참조
DBCC INPUTBUFFER해당 프로세스의 명령문을 확인합니다.
온라인 설명서 참조
DBCC CHECKDB지정한 데이터베이스에서 모든 개체의 할당과 구조적 무결성을 검사합니다.
온라인 설명서 참조
DBCC CHECKTABLE지정한 테이블에서 할당과 구조적 무결성을 검사합니다.
온라인 설명서 참조
DBCC DBRECOVER데이터베이스를 재시작하지 않고 복원합니다.
DBCC REBUILD_LOG로그 파일 손상 시에 새로운 로그 파일을 생성합니다.
DBCC TRACE추적 플래그를 설정합니다.
온라인 설명서 참조
DBCC TRACESTATUS추적 플래그 설정 여부를 보여 줍니다.
온라인 설명서 참조


자세한 설명은 온라인 설명서와 SQL Server DBA 가이드를 참조하기 바랍니다.
 
유틸리티
유틸리티 이름설명
Portqry.exe윈도우즈 서버에서 사용중인 포트 상태를 점검합니다.
http://support.microsoft.com/kb/310099
Componet Checker
(cc_pkg.exe)
MDAC 버전 정보 및 파일 정보를 점검합니다.
http://msdn.microsoft.com/data/mdac/downloads/default.aspx
SQLDiag.exeSQL Server 진단 툴입니다.
C:\Program Files\Microsoft SQL Server\MSSQL\Binn
Ostress.exe커넥션 및 스트레스 테스트를 합니다.
http://www.microsoft.com/downloads/details.aspx?FamilyId
=5691AB53-893A-4AAF-B4A6-9A8BB9669A8B&displaylang=en
Rebuildm.exe시스템 데이터베이스를 재구성합니다.
C:\Program Files\Microsoft SQL Server\MSSQL\Binn
DTCPing.exeMSDTC 의 구성 정보와 상태 정보를 점검합니다.
http://support.microsoft.com/default.aspx?scid=kb;ko;306843
 
시작옵션 및 추적 플래그
시작 옵션 및 매개 변수설명
/dmaster 데이터베이스 데이터 파일의 위치를 지정합니다.
/lmaster 데이터베이스 로그 파일의 위치를 지정합니다.
/eSQL Server 오류 로그 파일의 위치를 지정합니다.
/f최소 구성으로 시작합니다.
/m단일 사용자 모드로 시작합니다.
/cSQL Server를 서비스로 시작하지 않고 응용 프로그램으로 시작합니다.
/g확장 저장 프로시저, OLE 자동화 개체, 분산 쿼리 등을 위한 메모리 공간을 MB단위로 지정합니다.
/xCPU 시간과 캐시 적중률 통계를 유지할 수 없도록 합니다. 해당 정보를 모니터링할 필요가 없는 경우에 지정하면 성능이 다소 향상됩니다.
-T추적 플래그를 설정합니다.
T1118모든 데이터베이스에 유니폼 익스텐트만 할당합니다.
(7.0 에서는 인덱스 생성 시 등에 오류가 발생합니다.)
T1204교착 상태를 모니터링하여 SQL Server 오류 로그에 기록합니다.
T1807UCN 경로를 이용하여 네트워크 드라이브에 데이터 파일 및 로그 파일을 생성할 수 있습니다.
T2520DBCC PAGE 등 문서화 되지 않은 DBCC 명령어의 매개 변수를 DBCC HELP를 통해서 확인 합니다.
T3604DBCC 실행 결과를 화면에 출력합니다.
T3605DBCC 실행 결과를 SQL Server 오류 로그에 기록합니다.
T3607모든 데이터베이스에서 인스턴스 복구 프로세스를 생략합니다.
T3608master 데이터베이스를 제외한 모든 데이터베이스에서 인스턴스 복구 프로세스의 실행을 생략합니다.
T3609tempdb 생성을 생략합니다.
T4013새로운 연결이 생성되는 경우 해당 정보를 SQL Server 오류 로그에 기록합니다.
T4220Startup procedure의 실행을 비활성화합니다.
T7300OLEDB의 보다 상세한 오류 메시지를 반환 받을 수 있습니다.
T8602인덱스 힌트를 적용하지 않습니다.
T8755잠금 힌트를 적용하지 않습니다.


반응형

'연구개발 > DBA' 카테고리의 다른 글

SQL Server 메모리  (0) 2015.06.04
LATCH  (0) 2015.06.03
windows performance analyzer  (0) 2015.01.19
SQLStress version 0.1  (0) 2015.01.19
[보안]xp_cmdshell 제거하기  (0) 2014.03.05
반응형

http://sqlsql.tistory.com/364



성능 테스트 어플을 작성했는데 0번 core 가 100% 사용해 원인을 찾아보기로 한다. 


1) Windows Performance Recorder 를 이용해 부하상황을 캡처한다. 

2) Windows Performance Analyzer 를 이용해 부하를 분석한다. 

    다음은 분석된 결과이다. 


원인이 뭘까 살펴보니 DPC (Deferred Procedure Call, 인터럽트를 처리하는 소프트웨어 루틴으로 CPU에서 지연된 처리 요청 수치) 가 0번 core 에서만 엄청나게 높았고, 이는 Platform Invoke 프로그램에서 사용하는 owfs_w64.dll 이 원인인 것으로 나타났다. (ndis.sys...)








rss 가 켜져 있는디 왜 한코어만 dpc 처리를 할까...

http://blogs.technet.com/b/mikelag/archive/2010/11/26/processor-0-increased-cpu-utilization.aspx

http://rockball.tistory.com/entry/DPC%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

반응형

'연구개발 > DBA' 카테고리의 다른 글

LATCH  (0) 2015.06.03
DB 에서 사용되는 명령어 정리  (0) 2015.03.13
SQLStress version 0.1  (0) 2015.01.19
[보안]xp_cmdshell 제거하기  (0) 2014.03.05
delete 시 로그 쓰지 않으려면  (0) 2014.02.24
반응형

http://sqlsql.tistory.com/372



SQLStressCSharp.zip


SQLStressDatabase.zip



SQL Server 의 성능을 테스트 할 수 있음

visual studio 2013 .net framework 4.5 기반으로 작성되어 있음

visual studio 2013은 현재 무료 입니다. (작은회사나, 개인용)


ostress 보다 편리하고, adam 의 test 테스트프로그램 보다 가벼움

hp 의 load runner 와 거의 동일한 테스트가 가능하며 vuser 살 필요없이 이걸로 모든 테스트가 가능하다.

수정하면, 파일만들기, cpu, memory, disk, network 별 다양한 워크로드를 줄 수 있다.

 

1. SQLStressDatabase 를 다운받아 Config database 를 생성한다.

2. SQLStressCSharp 을 다운받아 CConfig 의 connection string 을 고친다.

3. tConfig 테이블에 Target SQL Server 의 Connection string 을 고친다.

4. SQLStressDatabase 의 perf 데이터베이스를 만들고 cpu, memory procedure 를 만든다.

 

이후 테스트를 하면 된다. 








반응형

'연구개발 > DBA' 카테고리의 다른 글

DB 에서 사용되는 명령어 정리  (0) 2015.03.13
windows performance analyzer  (0) 2015.01.19
[보안]xp_cmdshell 제거하기  (0) 2014.03.05
delete 시 로그 쓰지 않으려면  (0) 2014.02.24
MERGE  (0) 2013.11.21
반응형

[xp_cmdshell 제거하기]

 

USE master 
GO 
IF OBJECT_ID('[dbo].[xp_cmdshell]') IS NOT NULL BEGIN 
   EXEC sp_dropextendedproc 'xp_cmdshell' 
END 
GO

EXEC sp_addextendedproc 'xp_cmdshell', 'xplog70.dll' 
GO

 

USE master 
GO

IF OBJECT_ID('[dbo].[xp_cmdshell]') IS NOT NULL BEGIN 
   EXEC sp_dropextendedproc 'xp_cmdshell' 
END 
GO 

 

[재설치]

sp_dropextendedproc을 해도 해당 DLL이 메모리에 남아 있다.

- 다음 명령어로 동적 연결 라이브러리(DLL)를 메모리에서 내리면 기존 파일이 지워진다.

 

dbcc xp_cmdshell(free)

 

USE MASTER

EXEC SP_HELPTEXT XP_CMDSHELL

- 여기서 나타난 DLL 이름을 기억해 둡니다. 이것은 나중에 다시 등록할 때 필요함.

 

USE MASTER

EXEC SP_DROPEXTENDEDPROC ‘XP_CMDSHELL’

 

[다시 등록시 ]

USE MASTER

EXEC SP_ADDEXTENDEDPROC ‘XP_CMDSHELL’, ‘XPLOG70.DLL’

- 앞에서 알아냈던 DLL


반응형

'연구개발 > DBA' 카테고리의 다른 글

windows performance analyzer  (0) 2015.01.19
SQLStress version 0.1  (0) 2015.01.19
delete 시 로그 쓰지 않으려면  (0) 2014.02.24
MERGE  (0) 2013.11.21
한방인서트 insert  (0) 2013.08.11
반응형

alter database testdb set recovery simple

traceon(610, -1)



delete....


traceoff(610, -1)

alter database testdb set recovery full

반응형

'연구개발 > DBA' 카테고리의 다른 글

SQLStress version 0.1  (0) 2015.01.19
[보안]xp_cmdshell 제거하기  (0) 2014.03.05
MERGE  (0) 2013.11.21
한방인서트 insert  (0) 2013.08.11
모니터링 DMV 2  (0) 2013.07.24
반응형

MERGE dbo.wph_WorkplaceFriend T

USING (

SELECT wph_wf_BuildingID, wph_wf_VillageID, wph_wf_UserID, wph_wf_FriendUserID, wph_wf_CoWorkState, wph_wf_ReduceTime 

FROM Admin_DB.dbo.udf_CLR_SplitString_WorkplaceFriend(@WorkplaceFriend_TT)

) S ON T.wph_wf_VillageID = S.wph_wf_VillageID AND T.wph_wf_BuildingID = S.wph_wf_BuildingID

WHEN MATCHED AND S.wph_wf_FriendUserID = 0 THEN

DELETE

WHEN MATCHED AND S.wph_wf_FriendUserID <> 0 THEN

UPDATE SET T.wph_wf_UserID = S.wph_wf_UserID

, T.wph_wf_FriendUserID = S.wph_wf_FriendUserID

, T.wph_wf_CoWorkState = S.wph_wf_CoWorkState

, T.wph_wf_ReduceTime = S.wph_wf_ReduceTime;

반응형

'연구개발 > DBA' 카테고리의 다른 글

[보안]xp_cmdshell 제거하기  (0) 2014.03.05
delete 시 로그 쓰지 않으려면  (0) 2014.02.24
한방인서트 insert  (0) 2013.08.11
모니터링 DMV 2  (0) 2013.07.24
페이징  (0) 2013.07.22
반응형

                

declare @OutResult int

EXEC dbo.prAddLogItemTest  '2010-03-01 16:25:01|1|101|201|0|123|latale|천사1004|192.168.2.50|00-00|000-000000-000000|tolatale|악마|111.111.111.111|기타정보†2010-02-25 16:25:01|1|101|201|0|123|latale|천사1004|192.168.2.50|00-00|000-000000-000000|tolatale|악마|111.111.111.111|기타정보†2010-02-25 16:25:01|1|101|201|0|123|latale|천사1004|192.168.2.50|00-00|000-000000-000000|tolatale|악마|111.111.111.111|기타정보†2010-02-25 16:25:01|1|101|201|0|123|latale|천사1004|192.168.2.50|00-00|000-000000-000000|tolatale|악마|111.111.111.111|기타정보†2010-02-25 16:25:01|1|101|201|0|123|latale|천사1004|192.168.2.50|00-00|000-000000-000000|tolatale|악마|111.111.111.111|기타정보†2010-02-25 16:25:01|1|101|201|0|123|latale|천사1004|192.168.2.50|00-00|000-000000-000000|tolatale|악마|111.111.111.111|기타정보†2010-02-25 16:25:01|1|101|201|0|123|latale|천사1004|192.168.2.50|00-00|000-000000-000000|tolatale|악마|111.111.111.111|기타정보†2010-02-25 16:25:01|1|101|201|0|123|latale|천사1004|192.168.2.50|00-00|000-000000-000000|tolatale|악마|111.111.111.111|기타정보†2010-02-25 16:25:01|1|101|201|0|123|latale|천사1004|192.168.2.50|00-00|000-000000-000000|tolatale|악마|111.111.111.111|기타정보†2010-02-25 16:25:01|1|101|201|0|123|latale|천사1004|192.168.2.50|00-00|000-000000-000000|tolatale|악마|111.111.111.111|기타정보'

        , '|'

        , '†'

        , 10

        , @OutErrorCode =  @OutResult OutPut

print @OutResult



Return                 :  0 (정상처리), -20001 (아이템로그 입력처리 오류)

*/


ALTER PROC [dbo].[prAddLogItemMulti]

    @LogText varchar(max),

    @FieldValue varchar(10),

    @LineValue varchar(10),

    @RowCnt int,

    @OutErrorCode int output

AS


BEGIN

SET NOCOUNT ON 


    DECLARE @LogStr nvarchar(max);

    

    SELECT @LogStr = 'INSERT INTO dbo.LogItem (LogTime, ServerID, GameServerNo, LogType, ItemID, SerialKey, AccountID, CharName, IPAddr, MapGroupID, MapPosition, ToAccount, ToChar, ToIPAddr, Etc) SELECT ''' + REPLACE(REPLACE(SUBSTRING(@LogText,1,LEN(@LogText)-LEN(@LineValue)),@FieldValue,''','''),@LineValue,''' UNION ALL SELECT ''') + '''';


    EXEC sp_executesql @LogStr;



IF @@ERROR = 0

SET @OutErrorCode = 0;

ELSE

SET @OutErrorCode = -20001;


END








create table test_row_multi_insert (

idx int not null identity(1,1) primary key

, getTime datetime not null

, serverid int not null

, type varchar(2) not null

, name varchar(10) not null

);


/*

alter table test_row_multi_insert

add constraint cl_idx primary key (idx);

*/

/*

create table test_row_multi_insert (

idx int not null identity(1,1) primary key

, getTime datetime not null

, serverid int not null

, type varchar(2) not null

, name varchar(10) not null

, constraint cl_idx primary key (idx)

);

*/




alter procedure test_row_mulit_insert

@rowText nvarchar(max)

, @FieldValue varchar(10)

, @LineValue varchar(10)

, @RowCnt int

, @outErrorCode int output

as

begin

set nocount on;

declare @tmpStr nvarchar(max);


select @tmpStr = 'INSERT INTO dbo.test_row_multi_insert (getTime, serverid, type, name) SELECT ''' + 

REPLACE(REPLACE(SUBSTRING(@rowText, 1, (LEN(@rowText) + 1)-LEN(@LineValue)), @FieldValue, ''','''), @LineValue, ''' UNION ALL SELECT ''') + '''';


exec sp_executesql @tmpStr;


if @@error = 0

set @outErrorCode = 0;

else

set @outErrorCode = -1;

end;




declare @OutResult int

exec dbo.test_row_mulit_insert '2014-11-01 17:11:11|1|A|홍길동†2014-11-02 17:11:11|1|B|백두산†2014-11-03 17:11:11|2|A|태백산'

, '|'

, '†'

, 3

, @outErrorCode = @OutResult output


print @OutResult



select * from test_row_multi_insert;



반응형

'연구개발 > DBA' 카테고리의 다른 글

delete 시 로그 쓰지 않으려면  (0) 2014.02.24
MERGE  (0) 2013.11.21
모니터링 DMV 2  (0) 2013.07.24
페이징  (0) 2013.07.22
SQL Server 2012에서 새로워진 T-SQL 프로그램 기능  (0) 2013.07.22
반응형


/* 쿼리 레코드로 인한 대기 시간 증가 */

SELECT TOP 10

 [Wait type] = wait_type,

 [Wait time (s)] = wait_time_ms / 1000,

 [% waiting] = CONVERT(DECIMAL(12,2), wait_time_ms * 100.0 

               / SUM(wait_time_ms) OVER())

FROM sys.dm_os_wait_stats

WHERE wait_type NOT LIKE '%SLEEP%' 

ORDER BY wait_time_ms DESC;



/* 가장 많은 읽기 및 쓰기를 사용하는 데이터베이스 확인 */

SELECT TOP 10 

        [Total Reads] = SUM(total_logical_reads)

        ,[Execution count] = SUM(qs.execution_count)

        ,DatabaseName = DB_NAME(qt.dbid)

FROM sys.dm_exec_query_stats qs

CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt

GROUP BY DB_NAME(qt.dbid)

ORDER BY [Total Reads] DESC;


SELECT TOP 10 

        [Total Writes] = SUM(total_logical_writes)

        ,[Execution count] = SUM(qs.execution_count)

        ,DatabaseName = DB_NAME(qt.dbid)

FROM sys.dm_exec_query_stats qs

CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt

GROUP BY DB_NAME(qt.dbid)

ORDER BY [Total Writes] DESC;



/* 데이터베이스별 누락된 인덱스 */

SELECT 

    DatabaseName = DB_NAME(database_id)

    ,[Number Indexes Missing] = count(*) 

FROM sys.dm_db_missing_index_details

GROUP BY DB_NAME(database_id)

ORDER BY 2 DESC;



/* 비용이 높은 누락된 인덱스 */

SELECT  TOP 10 

        [Total Cost]  = ROUND(avg_total_user_cost * avg_user_impact * (user_seeks + user_scans),0) 

        , avg_user_impact

        , TableName = statement

        , [EqualityUsage] = equality_columns 

        , [InequalityUsage] = inequality_columns

        , [Include Cloumns] = included_columns

FROM        sys.dm_db_missing_index_groups g 

INNER JOIN    sys.dm_db_missing_index_group_stats s 

       ON s.group_handle = g.index_group_handle 

INNER JOIN    sys.dm_db_missing_index_details d 

       ON d.index_handle = g.index_handle

ORDER BY [Total Cost] DESC;



/* 가장 비용이 높은 사용되지 않은 인덱스 확인 */

-- 필요한 테이블 구조만 작성합니다.

-- 참고: 이 SQL은 다음 단계에서 지정된 데이터베이스 루프 내에 있어야 합니다.

SELECT TOP 1

        DatabaseName = DB_NAME()

        ,TableName = OBJECT_NAME(s.[object_id])

        ,IndexName = i.name

        ,user_updates    

        ,system_updates    

        -- 기타 유용한 필드를 아래에 나열

        --, *

INTO #TempUnusedIndexes

FROM   sys.dm_db_index_usage_stats s 

INNER JOIN sys.indexes i ON  s.[object_id] = i.[object_id] 

    AND s.index_id = i.index_id 

WHERE  s.database_id = DB_ID()

    AND OBJECTPROPERTY(s.[object_id], 'IsMsShipped') = 0

    AND    user_seeks = 0

    AND user_scans = 0 

    AND user_lookups = 0

    AND s.[object_id] = -999  -- 테이블 구조를 얻기 위한 임시 값

;


-- 서버의 모든 데이터베이스를 대상으로 반복합니다.

EXEC sp_MSForEachDB    'USE [?]; 

-- 테이블이 이미 있는 경우

INSERT INTO #TempUnusedIndexes 

SELECT TOP 100    

        DatabaseName = DB_NAME()

        ,TableName = OBJECT_NAME(s.[object_id])

        ,IndexName = i.name

        ,user_updates    

        ,system_updates    

FROM   sys.dm_db_index_usage_stats s 

INNER JOIN sys.indexes i ON  s.[object_id] = i.[object_id] 

    AND s.index_id = i.index_id 

WHERE  s.database_id = DB_ID()

    AND OBJECTPROPERTY(s.[object_id], ''IsMsShipped'') = 0

    AND    user_seeks = 0

    AND user_scans = 0 

    AND user_lookups = 0

    AND i.name IS NOT NULL    -- HEAP 인덱스 무시

ORDER BY user_updates DESC

;

'


-- 레코드 선택

SELECT TOP 100 * FROM #TempUnusedIndexes ORDER BY [user_updates] DESC

-- 임시 테이블 정리

DROP TABLE #TempUnusedIndexes




/* 사용 비용이 높은 인덱스 */

-- 필요한 테이블 구조만 작성합니다.

-- 참고: 이 SQL은 다음 단계에서 지정된 데이터베이스 루프 내에 있어야 합니다.

SELECT TOP 1

        [Maintenance cost]  = (user_updates + system_updates)

        ,[Retrieval usage] = (user_seeks + user_scans + user_lookups)

        ,DatabaseName = DB_NAME()

        ,TableName = OBJECT_NAME(s.[object_id])

        ,IndexName = i.name

INTO #TempMaintenanceCost

FROM   sys.dm_db_index_usage_stats s 

INNER JOIN sys.indexes i ON  s.[object_id] = i.[object_id] 

    AND s.index_id = i.index_id

WHERE s.database_id = DB_ID() 

    AND OBJECTPROPERTY(s.[object_id], 'IsMsShipped') = 0

    AND (user_updates + system_updates) > 0 -- 활성 행에 대해서만 보고

    AND s.[object_id] = -999  -- 테이블 구조를 얻기 위한 임시 값

;


-- 서버의 모든 데이터베이스를 대상으로 반복합니다.

EXEC sp_MSForEachDB    'USE [?]; 

-- 테이블이 이미 있는 경우

INSERT INTO #TempMaintenanceCost 

SELECT TOP 100

        [Maintenance cost]  = (user_updates + system_updates)

        ,[Retrieval usage] = (user_seeks + user_scans + user_lookups)

        ,DatabaseName = DB_NAME()

        ,TableName = OBJECT_NAME(s.[object_id])

        ,IndexName = i.name

FROM   sys.dm_db_index_usage_stats s 

INNER JOIN sys.indexes i ON  s.[object_id] = i.[object_id] 

    AND s.index_id = i.index_id

WHERE s.database_id = DB_ID() 

    AND i.name IS NOT NULL    -- HEAP 인덱스 무시

    AND OBJECTPROPERTY(s.[object_id], ''IsMsShipped'') = 0

    AND (user_updates + system_updates) > 0 -- 활성 행에 대해서만 보고

ORDER BY [Maintenance cost]  DESC

;

'


-- 레코드 선택

SELECT TOP 100 * FROM #TempMaintenanceCost 

ORDER BY [Maintenance cost]  DESC

-- 임시 테이블 정리

DROP TABLE #TempMaintenanceCost




/* 가장 많이 사용되는 인덱스 확인 */

-- 필요한 테이블 구조만 작성합니다.

-- 참고: 이 SQL은 다음 단계에서 지정된 데이터베이스 루프 내에 있어야 합니다.

SELECT TOP 1

        [Usage] = (user_seeks + user_scans + user_lookups)

        ,DatabaseName = DB_NAME()

        ,TableName = OBJECT_NAME(s.[object_id])

        ,IndexName = i.name

INTO #TempUsage

FROM   sys.dm_db_index_usage_stats s 

INNER JOIN sys.indexes i ON s.[object_id] = i.[object_id] 

    AND s.index_id = i.index_id 

WHERE   s.database_id = DB_ID() 

    AND OBJECTPROPERTY(s.[object_id], 'IsMsShipped') = 0

    AND (user_seeks + user_scans + user_lookups) > 0 

-- 활성 행에 대해서만 보고

    AND s.[object_id] = -999  -- 테이블 구조를 얻기 위한 임시 값

;


-- 서버의 모든 데이터베이스를 대상으로 반복합니다.

EXEC sp_MSForEachDB    'USE [?]; 

-- 테이블이 이미 있는 경우

INSERT INTO #TempUsage 

SELECT TOP 100

        [Usage] = (user_seeks + user_scans + user_lookups)

        ,DatabaseName = DB_NAME()

        ,TableName = OBJECT_NAME(s.[object_id])

        ,IndexName = i.name

FROM   sys.dm_db_index_usage_stats s 

INNER JOIN sys.indexes i ON s.[object_id] = i.[object_id] 

    AND s.index_id = i.index_id 

WHERE   s.database_id = DB_ID() 

    AND i.name IS NOT NULL    -- HEAP 인덱스 무시

    AND OBJECTPROPERTY(s.[object_id], ''IsMsShipped'') = 0

    AND (user_seeks + user_scans + user_lookups) > 0 -- 활성 행에 대해서만 보고

ORDER BY [Usage]  DESC

;

'


-- 레코드 선택

SELECT TOP 100 * FROM #TempUsage ORDER BY [Usage] DESC

-- 임시 테이블 정리

DROP TABLE #TempUsage



/* 논리적으로 조각난 인덱스 */

SELECT TOP 1 

        DatbaseName = DB_NAME()

        ,TableName = OBJECT_NAME(s.[object_id])

        ,IndexName = i.name

        ,[Fragmentation %] = ROUND(avg_fragmentation_in_percent,2)

INTO #TempFragmentation

FROM sys.dm_db_index_physical_stats(db_id(),null, null, null, null) s

INNER JOIN sys.indexes i ON s.[object_id] = i.[object_id] 

    AND s.index_id = i.index_id 

WHERE s.[object_id] = -999  -- 테이블 구조를 얻기 위한 임시 값

;


-- 서버의 모든 데이터베이스를 대상으로 반복합니다.

EXEC sp_MSForEachDB    'USE [?]; 

-- 테이블이 이미 있는 경우

INSERT INTO #TempFragmentation 

SELECT TOP 100

        DatbaseName = DB_NAME()

        ,TableName = OBJECT_NAME(s.[object_id])

        ,IndexName = i.name

        ,[Fragmentation %] = ROUND(avg_fragmentation_in_percent,2)

FROM sys.dm_db_index_physical_stats(db_id(),null, null, null, null) s

INNER JOIN sys.indexes i ON s.[object_id] = i.[object_id] 

    AND s.index_id = i.index_id 

WHERE s.database_id = DB_ID() 

      AND i.name IS NOT NULL    -- HEAP 인덱스 무시

    AND OBJECTPROPERTY(s.[object_id], ''IsMsShipped'') = 0

ORDER BY [Fragmentation %] DESC

;

'


-- 레코드 선택

SELECT TOP 100 * FROM #TempFragmentation ORDER BY [Fragmentation %] DESC

-- 임시 테이블 정리

DROP TABLE #TempFragmentation



/* I/O 비용이 높은 쿼리 */

SELECT TOP 100 

 [Average IO] = (total_logical_reads + total_logical_writes) / qs.execution_count

,[Total IO] = (total_logical_reads + total_logical_writes)

,[Execution count] = qs.execution_count

,[Individual Query] = SUBSTRING (qt.text,qs.statement_start_offset/2, 

         (CASE WHEN qs.statement_end_offset = -1 

            THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2 

          ELSE qs.statement_end_offset END - qs.statement_start_offset)/2) 

        ,[Parent Query] = qt.text

,DatabaseName = DB_NAME(qt.dbid)

FROM sys.dm_exec_query_stats qs

CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt

ORDER BY [Average IO] DESC;



/* CPU 비용이 높은 쿼리 */

SELECT TOP 100 

 [Average CPU used] = total_worker_time / qs.execution_count

,[Total CPU used] = total_worker_time

,[Execution count] = qs.execution_count

,[Individual Query] = SUBSTRING (qt.text,qs.statement_start_offset/2, 

         (CASE WHEN qs.statement_end_offset = -1 

            THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2 

          ELSE qs.statement_end_offset END - 

qs.statement_start_offset)/2)

,[Parent Query] = qt.text

,DatabaseName = DB_NAME(qt.dbid)

FROM sys.dm_exec_query_stats qs

CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt

ORDER BY [Average CPU used] DESC;



/* 가장 비용이 높은 CLR 쿼리 확인 */

SELECT TOP 100 

 [Average CLR Time] = total_clr_time / execution_count 

,[Total CLR Time] = total_clr_time 

,[Execution count] = qs.execution_count

,[Individual Query] = SUBSTRING (qt.text,qs.statement_start_offset/2, 

         (CASE WHEN qs.statement_end_offset = -1 

            THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2 

          ELSE qs.statement_end_offset END - qs.statement_start_offset)/2)

,[Parent Query] = qt.text

,DatabaseName = DB_NAME(qt.dbid)

FROM sys.dm_exec_query_stats as qs

CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt

WHERE total_clr_time <> 0

AND qt.dbid = DB_ID(N'Petz_Test')

ORDER BY [Average CLR Time] DESC;



/* 가장 많이 실행된 쿼리 */

SELECT TOP 100 

 [Execution count] = execution_count

,[Individual Query] = SUBSTRING (qt.text,qs.statement_start_offset/2, 

         (CASE WHEN qs.statement_end_offset = -1 

            THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2 

          ELSE qs.statement_end_offset END - qs.statement_start_offset)/2)

,[Parent Query] = qt.text

,DatabaseName = DB_NAME(qt.dbid)

FROM sys.dm_exec_query_stats qs

CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt

WHERE qt.dbid = DB_ID(N'Petz_Test')

ORDER BY [Execution count] DESC;



/* 차단당하는 쿼리 */

SELECT TOP 100 

 isnull(object_name(qt.objectid, qt.dbid), qt.text) as 'PlanQuery'

,[Average Time Blocked] = (total_elapsed_time - total_worker_time) / qs.execution_count

,[Total Time Blocked] = total_elapsed_time - total_worker_time 

,[Execution count] = qs.execution_count

,[Individual Query] = SUBSTRING (qt.text,qs.statement_start_offset/2, 

         (CASE WHEN qs.statement_end_offset = -1 

            THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2 

          ELSE qs.statement_end_offset END - qs.statement_start_offset)/2) 

,[Parent Query] = qt.text

,DatabaseName = DB_NAME(qt.dbid)

FROM sys.dm_exec_query_stats qs

CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt

WHERE qt.dbid = DB_ID(N'Petz_Test')

ORDER BY [Average Time Blocked] DESC;


/* 가장 적게 재사용되는 계획 */

SELECT TOP 100

 [Plan usage] = cp.usecounts

,[Individual Query] = SUBSTRING (qt.text,qs.statement_start_offset/2, 

         (CASE WHEN qs.statement_end_offset = -1 

            THEN LEN(CONVERT(NVARCHAR(MAX), 

qt.text)) * 2 ELSE qs.statement_end_offset END - 

qs.statement_start_offset)/2)

,[Parent Query] = qt.text

,DatabaseName = DB_NAME(qt.dbid)

,cp.cacheobjtype

FROM sys.dm_exec_query_stats qs

CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt

INNER JOIN sys.dm_exec_cached_plans as cp on qs.plan_handle=cp.plan_handle

WHERE cp.plan_handle=qs.plan_handle

AND qt.dbid = DB_ID(N'Petz_Test')

ORDER BY [Plan usage] ASC;

반응형

'연구개발 > DBA' 카테고리의 다른 글

MERGE  (0) 2013.11.21
한방인서트 insert  (0) 2013.08.11
페이징  (0) 2013.07.22
SQL Server 2012에서 새로워진 T-SQL 프로그램 기능  (0) 2013.07.22
모니터링 DMV  (0) 2013.07.16
반응형

SELECT *

FROM (

SELECT ROW_NUMBER() OVER (ORDER BY ProductID DESC, SellStartDate DESC) as RowNum

,ProductID, Name, ProductNumber, SellStartDate, ReorderPoint

FROM Production.Product

) as tb

WHERE tb.RowNum BETWEEN 0 AND 10


SELECT ProductID, Name, ProductNumber, SellStartDate, ReorderPoint

FROM Production.Product

ORDER BY ProductID, SellStartDate

OFFSET 0 ROWS FETCH FIRST 10 ROWS ONLY;


SELECT ProductID, Name, ProductNumber, SellStartDate, ReorderPoint

FROM Production.Product

ORDER BY ProductID, SellStartDate

OFFSET 491 ROWS FETCH FIRST 500 ROWS ONLY;


SELECT *

FROM (

SELECT ROW_NUMBER() OVER (ORDER BY ProductID DESC, SellStartDate DESC) as RowNum

,ProductID, Name, ProductNumber, SellStartDate, ReorderPoint

FROM Production.Product

) as tb

WHERE tb.RowNum BETWEEN 490 AND 500


SELECT ProductID, Name, ProductNumber, SellStartDate, ReorderPoint

FROM Production.Product

ORDER BY ProductID, SellStartDate

OFFSET 0 ROWS FETCH FIRST 10 ROWS ONLY;



CREATE PROCEDURE dbo.up_Get_Paging

@intPage int --Page

,@perPage int --RowCount

AS

SET NOCOUNT ON

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED


SELECT ProductID, Name, ProductNumber, SellStartDate, ReorderPoint

FROM Production.Product

ORDER BY ProductID, SellStartDate

OFFSET (@intPage - 1) * @perPage ROWS FETCH FIRST @perPage ROWS ONLY;


SET NOCOUNT OFF

GO


EXEC up_Get_Paging @intPage = 1, @perPage = 10

GO


SELECT ProductID, Name, ProductNumber, SellStartDate, ReorderPoint

FROM Production.Product

ORDER BY ProductID, SellStartDate



EXEC up_Get_Paging @intPage = 2, @perPage = 10

GO

반응형

'연구개발 > DBA' 카테고리의 다른 글

한방인서트 insert  (0) 2013.08.11
모니터링 DMV 2  (0) 2013.07.24
SQL Server 2012에서 새로워진 T-SQL 프로그램 기능  (0) 2013.07.22
모니터링 DMV  (0) 2013.07.16
병목현상 및 부하 쿼리  (0) 2013.07.09
반응형



반응형

'연구개발 > DBA' 카테고리의 다른 글

모니터링 DMV 2  (0) 2013.07.24
페이징  (0) 2013.07.22
모니터링 DMV  (0) 2013.07.16
병목현상 및 부하 쿼리  (0) 2013.07.09
tempdb 이동, 분할 스크립트  (0) 2013.07.02
반응형

-- I/O측정량

select * from sys.dm_io_virtual_file_stats (DB_ID('Petz_Test'),NULL)

go


-- I/O 측정량

select db_name(database_id), file_id ,io_stall_read_ms ,num_of_reads 

,cast(io_stall_read_ms/(1.0+num_of_reads) as numeric(10,1)) as 'avg_read_stall_ms' 

,io_stall_write_ms ,num_of_writes 

,cast(io_stall_write_ms/(1.0+num_of_writes) as numeric(10,1)) as 'avg_write_stall_ms' 

,io_stall_read_ms + io_stall_write_ms as io_stalls 

,num_of_reads + num_of_writes as total_io 

,cast((io_stall_read_ms+io_stall_write_ms)/(1.0+num_of_reads + num_of_writes) as numeric(10,1)) as 'avg_io_stall_ms' 

from sys.dm_io_virtual_file_stats(null,null) order by avg_io_stall_ms desc

go


-- 잠재적으로 유용한 인덱스

select db_name(d.database_id), d.* , s.avg_total_user_cost , s.avg_user_impact , s.last_user_seek ,s.unique_compiles 

from sys.dm_db_missing_index_group_stats s 

,sys.dm_db_missing_index_groups g 

,sys.dm_db_missing_index_details d

where s.group_handle = g.index_group_handle and d.index_handle = g.index_handle 

order by s.avg_user_impact desc 

go



-- 인덱스에 포함되어야 할 칼럼과 사용량

declare @handle int 

select @handle = d.index_handle 

from sys.dm_db_missing_index_group_stats s ,sys.dm_db_missing_index_groups g ,sys.dm_db_missing_index_details d 

where s.group_handle = g.index_group_handle and d.index_handle = g.index_handle 


select * from sys.dm_db_missing_index_columns(@handle) 

order by column_id

go


-- IO 기준 상위 50위 쿼리

SELECT TOP 50 (qs.total_logical_reads + qs.total_logical_writes) /qs.execution_count as [Avg IO]

, substring (qt.text,qs.statement_start_offset/2, 

(case when qs.statement_end_offset = -1 then len(convert(nvarchar(max), qt.text)) * 2 

else qs.statement_end_offset end - qs.statement_start_offset)/2) as query_text

, db_name(qt.dbid)

, object_name(qt.objectid)

FROM sys.dm_exec_query_stats qs

cross apply sys.dm_exec_sql_text (qs.sql_handle) as qt 

WHERE db_name(dbid) = N'Petz_Test'

ORDER BY [Avg IO] DESC


-- 가장 낮은 실행계획 재사용률을 나타내는 쿼리

SELECT TOP 50 

qs.sql_handle 

,qs.plan_handle 

,cp.cacheobjtype 

,cp.usecounts 

,(cp.size_in_bytes / 1024.0 / 1024.0) as size_in_MB

,qs.statement_start_offset 

,qs.statement_end_offset 

,db_name(qt.dbid )

,object_name(qt.objectid )

,qt.text 

,SUBSTRING(qt.text,qs.statement_start_offset/2

, (case when qs.statement_end_offset = -1 then len(convert(nvarchar(max), qt.text)) * 2 

else qs.statement_end_offset 

end -qs.statement_start_offset)/2) as statement 

FROM sys.dm_exec_query_stats qs 

cross apply sys.dm_exec_sql_text(qs.sql_handle) as qt 

inner join sys.dm_exec_cached_plans as cp 

on qs.plan_handle=cp.plan_handle 

WHERE cp.plan_handle=qs.plan_handle 

and qt.dbid = db_id('Petz_Test') ----- 조회 대상 database ID 를 지정 

ORDER BY [Usecounts] ASC


-- 실행 Statement 단위의 성능 순 조회

select  top (100)

        case

            when c.dbid = 32767 then 'ResourceDB'

            when c.dbid is null then 'NONE'

        else db_name(c.dbid) end as 'DBName'

,       isnull(object_name(c.objectid, c.dbid), c.text) as 'PlanQuery'

,       b.execution_count as 'Total Execute'

,       b.execution_count * 1.0 / datediff(ss, b.creation_time, dateadd(ss, 1, b.last_execution_time)) as 'ExecCount/sec'

,       b.total_worker_time * 1.0 / b.execution_count / 1000 as 'CPUTimes(ms)/exec'

,       b.max_worker_time * 1.0 / 1000 as 'MaxCPUTimes(ms)'

,       b.total_physical_reads / b.execution_count as 'PhysicalReads/exec'

,       b.max_physical_reads as 'MaxPhysicalReads'

,       (b.total_logical_writes + total_logical_reads) / b.execution_count as 'LogicalIO/exec'

,       b.max_logical_writes + b.max_logical_reads as 'MaxLogicalIO'

,       b.total_elapsed_time * 1.0 / b.execution_count / 1000 as 'Duration(ms)/exec'

,       b.max_elapsed_time * 1.0 / 1000 as 'MaxDuration(ms)'

,       substring(c.text, (b.statement_start_offset / 2) + 1, ((case b.statement_end_offset when -1 then datalength(c.text) else b.statement_end_offset end - b.statement_start_offset)/2) + 1) as 'StatementQuery'

,       d.query_plan

, (SELECT CAST(qp.query_plan AS XML) 

FROM sys.dm_exec_text_query_plan(b.plan_handle, b.statement_start_offset, b.statement_end_offset) AS qp)

from              sys.dm_exec_query_stats b with(nolock)

    cross apply   sys.dm_exec_sql_text(b.sql_handle) c

    cross apply   sys.dm_exec_text_query_plan(b.plan_handle, b.statement_start_offset, b.statement_end_offset) d

where c.dbid = db_id('Petz_Test')

--order by 'LogicalIO/exec' desc

--order by 'MaxLogicalIO' desc

--order by 'ExecCount/sec' desc

order by 'CPUTimes(ms)/exec' desc

--order by 'MaxCPUTimes(ms)' desc

--order by 'PhysicalReads/exec' desc

--order by 'MaxPhysicalReads' desc

--order by 'Duration(ms)/exec' desc

--order by 'MaxDuration(ms)' desc




-- 현재 실행되고 있는 쿼리 확인

CREATE FUNCTION dbo.AFN_THREEPARTNAME(

    @object_id INT,

    @database_id INT

)

RETURNS NVARCHAR(1000)

AS

BEGIN

    RETURN (QUOTENAME(DB_NAME(@database_id)) + '.'

          + QUOTENAME(OBJECT_SCHEMA_NAME(@object_id, @database_id))

          + '.' + QUOTENAME(OBJECT_NAME(@object_id, @database_id)));

END


SELECT  r.session_id AS [세션ID] ,

        r.[status] AS [상태],

        r.wait_type AS [대기상태],

        r.scheduler_id AS [SchedulerID],

        CASE WHEN qt.objectid IS NULL THEN 'AD-HOC'

             ELSE dbo.AFN_THREEPARTNAME(qt.objectid, qt.dbid)

        END AS [SP이름] ,

        SUBSTRING(qt.[text], r.statement_start_offset / 2,

                  ( CASE WHEN r.statement_end_offset = -1

                         THEN LEN(CONVERT (NVARCHAR(MAX), qt.[text])) * 2

                         ELSE r.statement_end_offset

                    END - r.statement_start_offset ) / 2) AS [statement_executing] ,

        DB_NAME(qt.[dbid])AS [DatabaseName] ,

        OBJECT_NAME(qt.objectid) AS [ObjectName] ,

        r.cpu_time / 1000. AS [CPU시간(s)],

        r.logical_reads / 128. AS [논리적읽기(MB)] ,

        r.granted_query_memory / 128. AS [쿼리메모리(MB)],

        r.start_time ,

        r.total_elapsed_time / 1000. AS [실행되고있는시간(s)] ,

        ( r.total_elapsed_time / 1000. ) / 60 AS [실행되고있는시간(m)] ,

        r.reads ,

        r.writes ,

        r.plan_handle ,

        (SELECT CAST(qp.query_plan AS XML) 

FROM sys.dm_exec_text_query_plan(r.plan_handle, r.statement_start_offset, r.statement_end_offset) AS qp) AS [실행계획보기],

        sp.*

FROM    sys.dm_exec_requests AS r

        CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS qt

        INNER JOIN sys.sysprocesses AS sp

            ON r.session_id = sp.spid

WHERE   r.session_id > 50

       --AND r.session_id != @@SPID

ORDER BY r.total_elapsed_time DESC ,

        r.scheduler_id ,

        r.[status] ,

        r.session_id ;



-- 재컴파일 

select top 25 

sql_text.text, 

sql_handle, 

plan_generation_num, --문이 재컴파일이 발생할 때마다, plan_generation_num 칼럼의 값이 증가

substring(text,qs.statement_start_offset/2

, (case when qs.statement_end_offset = -1 then datalength(convert(nvarchar(max), text)) * 2 

else qs.statement_end_offset 

end - qs.statement_start_offset)/2) as stmt_executing, 

execution_count, 

dbid,

objectid,

db_name(sql_text.dbid), 

object_name(sql_text.objectid )

from sys.dm_exec_query_stats as qs 

Cross apply sys.dm_exec_sql_text(sql_handle) sql_text 

where plan_generation_num >1 

order by sql_handle, plan_generation_num



-- 행 잠금 대기를 검색

-- sp_configure : blocked process threshold

declare @dbid int 

select @dbid = db_id() 


Select dbid=db_name(database_id)

, objectname=object_name(s.object_id)

, indexname=i.name, i.index_id --, partition_number 

, row_lock_count

, row_lock_wait_count 

, [block %]=cast (100.0 * row_lock_wait_count / (1 + row_lock_count) as numeric(15,2)) 

, row_lock_wait_in_ms 

, [avg row lock waits in ms]=cast (1.0 * row_lock_wait_in_ms / (1 + row_lock_wait_count) as numeric(15,2)) 

from sys.dm_db_index_operational_stats (@dbid, NULL, NULL, NULL) s, sys.indexes i 

where objectproperty(s.object_id,'IsUserTable') = 1 

and i.object_id = s.object_id 

and i.index_id = s.index_id 

order by row_lock_wait_count desc



-- 대기자 리스트에 있는 SQL문

create proc get_statements_from_waiter_list (@wait_type nvarchar(60)=NULL) 

as 

select  

        r.wait_type 

        ,r.wait_time 

        ,SUBSTRING(qt.text,r.statement_start_offset/2,  

            (case when r.statement_end_offset = -1  

            then len(convert(nvarchar(max), qt.text)) * 2  

            else r.statement_end_offset end -r.statement_start_offset)/2)  

        as query_text 

        ,qt.dbid, dbname=db_name(qt.dbid) 

        ,qt.objectid 

        ,r.sql_handle 

        ,r.plan_handle 

FROM sys.dm_exec_requests r 

cross apply sys.dm_exec_sql_text(r.sql_handle) as qt 

where r.session_id > 50 

  and r.wait_type = isnull(upper(@wait_type),r.wait_type) 

go 

 

exec get_statements_from_waiter_list 

--exec get_statements_in_waiter_list @wait_type = 'CXPACKET'



반응형

'연구개발 > DBA' 카테고리의 다른 글

페이징  (0) 2013.07.22
SQL Server 2012에서 새로워진 T-SQL 프로그램 기능  (0) 2013.07.22
병목현상 및 부하 쿼리  (0) 2013.07.09
tempdb 이동, 분할 스크립트  (0) 2013.07.02
데드락 deadlock  (0) 2013.06.21
반응형

SELECT

SUBSTRING(text, qs.statement_start_offset / 2

, (CASE WHEN qs.statement_end_offset = -1 THEN

LEN(CONVERT(NVARCHAR(MAX), text)) * 2

ELSE qs.statement_end_offset

END - qs.statement_start_offset) / 2)

, qs.plan_generation_num as recompiles

, qs.execution_count as execution_count

, qs.total_elapsed_time - qs.total_worker_time as total_wait_time

, qs.total_logical_reads as reads

, qs.total_logical_writes as writes

FROM sys.dm_exec_query_stats qs

CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st

LEFT OUTER JOIN sys.dm_exec_requests r

ON qs.sql_handle = r.sql_handle

ORDER BY 3 DESC

반응형

'연구개발 > DBA' 카테고리의 다른 글

SQL Server 2012에서 새로워진 T-SQL 프로그램 기능  (0) 2013.07.22
모니터링 DMV  (0) 2013.07.16
tempdb 이동, 분할 스크립트  (0) 2013.07.02
데드락 deadlock  (0) 2013.06.21
데이터 형식 (데이터 정렬) 변경  (0) 2013.05.24
반응형

use master;

go

 

--1. tempdb의논리파일이름확인

 

select name,physical_name, state_desc from master.sys.master_files where database_id = DB_ID(N'tempdb');

 

--2. ALTER DATABASE 사용하여파일위치변경

 

alter database tempdb modify file(NAME = tempdev, filename = 'c:\tempdb.mdf');

alter database tempdb modify file(NAME = templog, filename = 'c:\templog.ldf');

 

 

--3. Processor만큼파일분할및사이즈변경및파일사이즈,증가옵션설정

 

declare @cnt int, @sql nvarchar(4000), @i int, @size nvarchar(10), @grw nvarchar(10), @path nvarchar(20);

 

set @i =2;

 

select @cnt = cpu_count from sys.dm_os_sys_info;

 

select @size = N'300MB'

, @grw = N'100MB'

, @path = N'c:\';

 

print 'ALTER DATABASE [tempdb] MODIFY FILE( NAME = N''tempdev'', SIZE = '+@size+' , FILEGROWTH = '+@grw+' )';

 

while (@i <= @cnt)

begin

 set @sql = N'ALTER DATABASE [tempdb] ADD FILE ( NAME = N''tempdev'

 + cast(@i as nvarchar(10)) +''', FILENAME = N'''+@path+'tempdev'

 + cast(@i as nvarchar(10)) +'.ndf'' , SIZE = '+@size+', FILEGROWTH = '+@grw+' )';

 print @sql;

 set @i = @i + 1;

end

 

print 'ALTER DATABASE [tempdb] MODIFY FILE( NAME = N''templog'', SIZE = 2GB )';

 

go

 

반응형

'연구개발 > DBA' 카테고리의 다른 글

모니터링 DMV  (0) 2013.07.16
병목현상 및 부하 쿼리  (0) 2013.07.09
데드락 deadlock  (0) 2013.06.21
데이터 형식 (데이터 정렬) 변경  (0) 2013.05.24
SQL Server 2008 R2 지원하는 CPU / 메모리  (0) 2013.04.26
반응형

http://www.sqler.com/bColumn/459038

반응형
반응형

데이터 형식 정렬 변경 시 배타 잠금이 걸려있다고 안 될 시에

DB에 다유저 속성이 활성화 되어 있기 때문이다.


그럴시에는 싱글유저로 변경 후 정렬 변경하고 다시 멀티유저로 변경해주면 된다.


UI 툴에서는 잘 되지 않는데 롤백처리가 되지 않아 그런 것 같다.


SELECT * FROM fn_helpcollations();


ALTER DATABASE Petz_Dev

SET SINGLE_USER WITH ROLLBACK IMMEDIATE;


ALTER DATABASE Petz_Dev

COLLATE Korean_Wansung_CI_AS;


EXEC SP_HELPDB Petz_Dev


ALTER DATABASE Petz_Dev

SET MULTI_USER;



반응형

'연구개발 > DBA' 카테고리의 다른 글

tempdb 이동, 분할 스크립트  (0) 2013.07.02
데드락 deadlock  (0) 2013.06.21
SQL Server 2008 R2 지원하는 CPU / 메모리  (0) 2013.04.26
SQL Server 최대용량 사양 비교(7.0,2000) + (2005,2008)  (0) 2013.04.26
작업모니터  (0) 2013.03.29

+ Recent posts

반응형