반응형
반응형

메모리에 대해서는 이청환님께서 한 눈에 알아보기 쉽게 정리한 게 있습니다..

 http://www.sqler.com/337273

 

김성식님 글도 참고하시고요.

http://www.sqler.com/337006

 

 

전, 그냥 단순하게 보고 싶으신 분을 위해서 정리.

 

1. CPU - 소켓 기준(2 Core, 4 Core, 6 Core 동일)

SQL Server 버전
지원되는 프로세서 개수
Datacenter운영 체제가 지원하는 최대 크기
Enterprise8
Developer운영 체제가 지원하는 최대 크기
Standard4
Web4
Workgroup2
Express1
Express with Tools1
Express with Advanced Services1

 

출처 : http://msdn.microsoft.com/ko-kr/library/ms143760.aspx

 

 

2. Memory

SQL Server 버전
지원되는 최대 메모리
Datacenter운영 체제가 지원하는 최대 크기
Enterprise2TB
Developer운영 체제가 지원하는 최대 크기
Standard64GB
Web64GB
Workgroup4GB(64비트), OS가 지원하는 최대 크기(32비트)
Express1GB
Express with Tools1GB
Express with Advanced Services1GB
Reporting Services용 4GB

 

 출처 : http://msdn.microsoft.com/ko-kr/library/ms143685.aspx

 

이상입니다.

반응형

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

데드락 deadlock  (0) 2013.06.21
데이터 형식 (데이터 정렬) 변경  (0) 2013.05.24
SQL Server 최대용량 사양 비교(7.0,2000) + (2005,2008)  (0) 2013.04.26
작업모니터  (0) 2013.03.29
트리거를 이용한 DDL 추적  (0) 2013.03.21
반응형


SQL Server 데이터베이스 엔진 개체

SQL Server 7.0

SQL Server 2000

일괄 처리 크기

65,536 * 네트워크 패킷 크기1

65,536 * 네트워크 패킷 크기1

짧은 문자열 열 각각의 바이트 수

8000

8000

text, ntext 또는 image 열 각각의 바이트 수

2GB-2

2GB-2

GROUP BY, ORDER BY 각각의 바이트 수

8060

 

인덱스 당 바이트 수

900

900

외래 키 당 바이트 수

900

900

기본 키 당 바이트 수

900

900

각 행의 바이트 수

8060

8060

저장 프로시저의 원본 텍스트의 바이트 수

일괄 처리 크기 또는 250MB 미만

일괄 처리 크기 또는 250MB 미만

각 테이블의 클러스터된 인덱스 수

1

1

GROUP BY, ORDER BY의 열 수

바이트 수로만 제한

 

GROUP BY WITH CUBE 또는 WITH ROLLUP 문의 열 또는 식의 수

10

 

인덱스 당 열 수

16

16

외래 키 당 열 수

16

16

기본 키 당 열 수

16

16

기본 테이블 당 열 수

1024

1024

SELECT 문 각각의 열 수

4096

4096

INSERT 문 각각의 열 수

1024

1024

클라이언트 당 연결 수

구성된 연결의 최대 값

구성된 연결의 최대 값

데이터베이스 크기

1,048,516TB

1,048,516TB

SQL Server 인스턴스 당 데이터베이스 수

32767

32767

데이터베이스 당 파일 그룹 수

256

256

데이터베이스 당 파일 수

32767

32767

파일 크기(데이터)

32TB

32TB

파일 크기(로그)

4TB

32TB

테이블 당 외래 키 테이블 참조 수

253

253

식별자 길이(문자 수)

128

128

각 컴퓨터의 인스턴스 수

N/A

16

SQL 문이 포함된 문자열의 길이(일괄 처리 크기)

65,536 * 네트워크 패킷 크기

65,536 * 네트워크 패킷 크기

연결 당 잠금 수

각 서버의 최대 잠금 수

각 서버의 최대 잠금 수

SQL Server 인스턴스 당 잠금 수

2,147,483,647(정적)

2,147,483,647(정적)

 

SQL Server 메모리의 40%(동적)

SQL Server 메모리의 40%(동적)

중첩 저장 프로시저 수준 수

32

32

중첩 하위 쿼리 수

32

32

중첩 트리거 수준 수

32

32

각 테이블의 클러스터되지 않은 인덱스 수

249

249

SQL Server의 한 인스턴스에서 현재 열려 있는 개체 수

2,147,483,647(또는 사용 가능한 메모리)

2,147,483,647(또는 사용 가능한 메모리)

데이터베이스의 개체 수

2,147,483,647

2,147,483,647

각 저장 프로시저의 매개 변수 개수

1024

1024

각 테이블의 REFERENCES 

253

253

각 테이블의 행 수

사용 가능한 저장소로 제한됨

사용 가능한 저장소로 제한됨

데이터베이스 당 테이블 수

데이터베이스의 개체 수로 제한됨

데이터베이스의 개체 수로 제한됨

 SELECT 문의 테이블 수

256

256

테이블 당 트리거 수

데이터베이스의 개체 수로 제한됨

데이터베이스의 개체 수로 제한됨

테이블 당 UNIQUE 인덱스 또는 제약 조건 수

249(클러스터되지 않음)/1(클러스터됨)

249(클러스터되지 않음)/1(클러스터됨)

잠금

96바이트

64바이트 + 32바이트(소유자 당)

열린 데이터베이스

2,880바이트

3924바이트 + 1640바이트(파일 당)  336바이트(파일 그룹 당)

열린 개체1

276바이트

256바이트 + 1724바이트(개체에 대해 열린 인덱스 당)2

사용자 연결

12 KB + (3 * 네트워크 패킷 크기)3

12 KB + (3 * 네트워크 패킷 크기

 

위 자료는 김대우님께서 올려주신 자료를 바탕으로 조금 짜집기했습니다.

원문출처 : http://www.sqler.com/bSQL2000Lec/126621

 

그런데, 아무리 찾아봐도 제 능력으로는 일부 빠진 항목들을 채우지 못했네요. 아시는 분 있으시면 리플로. ^^.

 

이전에 올려드렸던2005 2008 자료도 한번 더 올려 드립니다. ^^

SQL Server 데이터베이스 엔진 개체

SQL Server 2008

SQL Server 2005

최대 크기/개수SQL Server(32비트)

최대 크기/개수SQL Server(64비트)

최대 크기/개수SQL Server 2005(32비트)

최대 크기/개수SQL Server 2005(64비트)

일괄 처리 크기

65,536 * 네트워크 패킷 크기

65,536 * 네트워크 패킷 크기

65,536 * 네트워크 패킷 크기

65,536 * 네트워크 패킷 크기

짧은 문자열 열당 바이트 수

8,000

8,000

8,000

8,000

GROUP BY, ORDER BY당 바이트 수

8,060

8,060

8,060

8,060

인덱스 키당 바이트 수

900

900

900

900

외래 키당 바이트 수

900

900

900

900

기본 키당 바이트 수

900

900

900

900

행당 바이트 수

8,060

8,060

8,060

8,060

저장 프로시저의 원본 텍스트의 바이트 수

일괄 처리 크기 또는 250MB 미만

일괄 처리 크기 또는 250MB 미만

 

 

varchar(max),varbinary(max), xml,text 또는 image 열당 바이트 수

2^31-1

2^31-1

2^31-1

2^31-1

ntext 또는nvarchar(max) 열당 문자 수

2^30-1

2^30-1

2^30-1

2^30-1

테이블당 클러스터형 인덱스 수

1

1

1

1

GROUP BY, ORDER BY의 열 수

바이트 수로만 제한

바이트 수로만 제한

바이트 수로만 제한

바이트 수로만 제한

GROUP BY WITH CUBE 또는WITH ROLLUP 문의 열 또는 식의 수

10

10

10

10

인덱스 키당 열 수

16

16

16

16

외래 키당 열 수

16

16

16

16

기본 키당 열 수

16

16

16

16

넓지 않은 테이블당 열 수

1,024

1,024

1,024

1,024

넓은 테이블당 열 수

30,000

30,000

 

 

SELECT 문당 열 수

4,096

4,096

4,096

4,096

INSERT 문당 열 수

4096

4096

1,024

1,024

클라이언트당 연결 수

구성된 연결의 최대 값

구성된 연결의 최대 값

구성된 연결의 최대 값

구성된 연결의 최대 값

데이터베이스 크기

524,272TB

524,272TB

524,258TB

524,258TB

SQL Server 인스턴스당 데이터베이스 수

32,767

32,767

32,767

32,767

데이터베이스당 파일 그룹 수

32,767

32,767

32,767

32,767

데이터베이스당 파일 수

32,767

32,767

32,767

32,767

파일 크기(데이터)

16TB

16TB

16TB

16TB

파일 크기(로그)

2TB

2TB

2TB

2TB

테이블당 외래 키 테이블 참조 수

253

253

253

253

식별자 길이(문자 수)

128

128

128

128

컴퓨터당 인스턴스 수

Workgroup을 제외한 모든 SQL Server 버전에 대해 독립 실행형 서버당 50개의 인스턴스. Workgroup은 컴퓨터당 최대 16개의 인스턴스를 지원합니다.

독립 실행형 서버당 50개의 인스턴스

워크그룹 버전을 제외한 모든 SQL Server 2005 버전에 대해 독립 실행형 서버당 50개의 인스턴스. 워크그룹 버전에서는 최대 16개의 인스턴스를 지원합니다.

독립 실행형 서버당50개의 인스턴스

SQL Server는 장애 조치(Failover) 클러스터에서 25개의 인스턴스를 지원합니다.

장애 조치 클러스터당 25개의 인스턴스

SQL Server 2005에서는 장애 조치(Failover) 클러스터당 25개의 인스턴스를 지원합니다.

장애 조치 클러스터당 25개의 인스턴스

 

반응형
반응형

MSSQL 작업모니터를 활용하는 방법이다.
아래는 관련 문서이니 잘 살펴보길 바란다. 
http://msdn.microsoft.com/ko-kr/library/cc879320.aspx


구차니즘을 조금이나마 돕기위해 복사신공을 일단 이용해 보겠다.

MSDN보다 더 잘 설명할 방법은 엄는듯 싶고

그림정도 추가해 보도록 하겠다.

 

1. 용도

 - SQL Server 프로세스와 이러한 프로세스가 현재 SQL Server 인스턴스에 미치는 영향에 대한 정보를 취득하도록 하는 Tool

 - 창을 확장하면 작업 모니터는 인스턴스에서 정보를 쿼리하고 창(개요, 활성 사용자 태스크, 리소스 대기, 데이터 파일 I/O 및

    비용이 드는 최근 쿼리)을 축소하면 해당 창에 대한 모든 쿼리 작업이 중지되며

   또한 하나 이상의 창을 동시에 확장하여 인스턴스에 대한 여러 종류의 작업을 볼 수도 있다.

 

2. 권한

 - SQL Server 2005 및 SQL Server 2008에서 작업 모니터를 보려면 사용자에게 VIEW SERVER STATE 권한이 있어야 함.

  http://cafe.naver.com/xlsvba/7106 참고

 

3. 그럼 일단 어떰놈인지 열어나 보자... 툴박스내 오른쪽에 차트 아이콘 모양의 버튼을 클릭하믄 된다.




 

4. 어떤넘들루 구성되었는지 보도록 하자.

 



5. 창에 대한 설명

  

 ㄴ 5-1 개요 : 이 창에는 다음과 같은 인스턴스 정보가 그래픽으로 표시



 

   - 프로세서 시간  : 프로세서가 모든 CPU에서 인스턴스에 대한 비유휴 스레드를 실행하는 데 걸린 시간의 백분율입니다.

   - 대기 중인 태스크 : 프로세서, I/O 또는 메모리 리소스를 사용하기 위해 대기하는 태스크 수입니다.

   - 데이터베이스 I/O : 메모리에서 디스크로, 디스크에서 메모리로 또는 디스크에서 디스크로 데이터 전송 속도(MB/초)입니다.

   - 일괄 처리 요청/초 : 인스턴스에 의해 수신되는 SQL Server 일괄 처리의 수입니다.

   - 새로 고침 간격 : 작업 모니터의 업데이트 간격을 설정할 수 있도록 합니다.

                            이 옵션은 작업 모니터가 인스턴스에서 새 정보를 쿼리하는 빈도를 구성합니다.

                            업데이트 간격을 10초보다 작게 설정하면 이러한 쿼리를 실행하는 데

                           사용되는 시간이 서버 성능에 영향을 줄 수 있습니다.  
                           비용이 드는 최근 쿼리의 업데이트 간격은 항상 30초입니다.
   - 일시 중지 : 작업 모니터를 일시 중지합니다. 모든 작업 모니터 프로세스도 일시 중지됩니다.

   - 다시 시작 : 일시 중지가 선택된 후 작업 모니터를 다시 시작합니다. 모든 작업 모니터 프로세스도 다시 시작됩니다.

   - 새로 고침 : 다음 업데이트 간격 이전에 현재 작업 모니터 정보를 가져옵니다.

 

 

 ㄴ 5-2 활성 사용자 태스크 창 : 해당 인스턴스의 활성 사용자 연결에 대한 정보가 표시되고 다음과 같은 열이 포함되고

                                           오른쪽 마우스를 누르고 "자세히"를 클릭하면 상세정보를 볼 수 있다.

                                           SP_WHO, SP_WHO2 프로시저를 이용해서 내가 지금 날린 SQL등도 세션ID값을 취득후 취득함



 

    - 세션 ID : 사용자가 연결할 때 각 연결에 할당된 고유한 정수(int)입니다. SP_WHO 프로시저등을 이용

    - 사용자 프로세스 : 시스템 프로세스의 경우에는 0이 표시되고 사용자 프로세스의 경우에는 1이 표시됩니다.

                기본적으로 이 열의 필터 설정은 1입니다. 이 설정은 사용자 프로세스만 표시합니다.

    - 로그인 : 현재 세션을 실행하는 SQL Server 로그인 이름입니다.

    - 데이터베이스 : 현재 실행 중인 프로세스의 연결 속성에 포함된 데이터베이스의 이름입니다.

    - 태스크 상태 : 태스크 상태입니다.

                실행 가능 또는 중지 중 상태에 있는 태스크의 경우 태스크 상태가 비어 있습니다.

                그렇지 않으면 다음 값 중 하나일 수 있습니다. (실행 중 / 일시 중지됨)

    - 명령 : 태스크에서 처리하고 있는 명령의 종류입니다.

    - 응용 프로그램  : 연결을 만든 응용 프로그램의 이름입니다.

    - 대기 시간(밀리초) : 태스크가 리소스를 기다리고 있는 시간(밀리초)입니다.

                태스크가 기다리고 있지 않으면 대기 시간은 0입니다.

    - 대기 유형 : 마지막 또는 현재 대기 유형의 이름입니다.

    - 대기 리소스 : 필요한 리소스의 이름입니다.

    - 차단 주체 : 차단 세션이 있는 경우 태스크를 차단하는 세션의 ID입니다.

    - 헤드 블로커 : 차단 세션이 있는 경우 첫 번째 차단 조건을 유발하는 세션을 식별합니다.

              값 1은 다른 세션의 헤드 블로커를 나타냅니다.

    - 메모리 사용(KB) : 태스크에서 사용 중인 메모리의 양(KB)입니다.

    - 호스트 이름 : SQL Server 인스턴스에 연결된 컴퓨터의 이름입니다.

    - 작업 그룹 : 세션에 대한 리소스 관리자 작업 그룹의 이름입니다.

         자세한 내용은 리소스 관리자로 SQL Server 작업 및 리소스 관리를 참조하십시오.

 

 

 ㄴ 5-3 리소스 대기 창 : 리소스 대기에 대한 정보가 표시되고 다음과 같은 열이 포함되어 있습니다.



 

 

    - 대기 범주 : 대기 유형 통계가 누적되는 범주입니다. 개별 대기 유형은 활성 사용자 태스크 창에 표시됩니다.

          자세한 내용은 sys.dm_os_wait_stats(http://msdn.microsoft.com/ko-kr/library/ms179984(SQL.90).aspx)를 참조.

    - 대기 시간(밀리초/초) : 마지막 업데이트 간격 이후에 대기 범주에 있는 하나 이상의 리소스를 기다리는 모든 태스크의 대기 시간(밀리초/초)

    - 최근 대기 시간(밀리초/초) : 마지막 업데이트 간격 이후에 대기 범주에 있는 하나 이상의 리소스를 기다리는 모든 태스크의 가중 평균 대기 시간(밀리초/초)

    - 평균 대기자 수 : 마지막 샘플 간격의 일반 시점에서 대기 범주에 있는 하나 이상의 리소스를 기다리는 태스크의 수

    - 누적 대기 시간(초) : SQL Server가 인스턴스에서 마지막으로 시작되었거나 DBCC SQLPERF가 인스턴스에서 실행된 이후

                                태스크가 대기 범주에 있는 하나 이상의 리소스를 기다린 총 시간(초)

 

 

 ㄴ 5-4  데이터 파일 I/O 창 : 인스턴스에 속한 데이터베이스의 데이터베이스 파일에 대한 정보



 

 

    - 데이터베이스 : 데이터베이스 이름입니다.

    - 파일 이름 : 데이터베이스에 속한 파일의 이름입니다.

    - MB/초 읽기 : 데이터베이스 파일에 대한 최근 읽기 작업(MB/초)

    - MB/초 쓰기 : 데이터베이스 파일에 대한 최근 쓰기 작업(MB/초)

    - 응답 시간(밀리초) : 데이터베이스 파일에 대한 최근 읽기 및 쓰기 작업의 평균 응답 시간(밀리초)

 

 

 ㄴ 5-5  비용이 드는 최근 쿼리 창 : 마지막 30초 동안 인스턴스에서 실행된 가장 비용이 많이 드는 쿼리에 대한 정보가 표시

            이 정보는 sys.dm_exec_requests와 sys.dm_exec_query_stats가 통합된 개체에서 파생됩니다.

            여기에는 진행 중인 쿼리와 이 기간 동안 완료된 쿼리가 포함된다.

            일전의 강좌를 잘 살펴보믄 도움이 될것이고 http://cafe.naver.com/xlsvba/3413

            실제 비용이 많이 드는것만 모아주니 더 편하게 사용이 가능할 것이다..



 

    - 쿼리 : 모니터링 중인 쿼리 문입니다.

    - 실행/분 : 분당 쿼리 실행 횟수입니다.

    - CPU(밀리초/초) : 쿼리에 의한 CPU 사용 비율입니다.

    - 물리적 읽기/초 : 쿼리에 의한 물리적 읽기의 초당 비율입니다.

    - 논리적 쓰기/초 : 쿼리에 의한 논리적 쓰기의 초당 비율입니다.

    - 논리적 읽기/초 : 쿼리에 의한 논리적 읽기의 초당 비율입니다.

    - 평균 기간(밀리초) : 이 쿼리를 실행하는 평균 기간(밀리초)입니다.

    - 계획 수 : 이 쿼리에 대해 캐시된 쿼리 계획 수입니다.

          계획이 많은 경우 쿼리를 명시적으로 매개 변수화해야 할 수 있습니다.

          자세한 내용은 계획 지침을 사용하여 쿼리 매개 변수화 동작 지정을 참조하십시오.

반응형
반응형

테이블 생성

 

CREATE TABLE [dbo].[DDLLog](

       [DDLLogIDX] [int] IDENTITY(1,1) NOT NULL,

       [PostTime] [datetime] NULL,

       [DB_User] [nvarchar](100) NULL,

       [Event] [nvarchar](100) NULL,

       [ObjectName] [nvarchar](100) NULL,

       [ObjectType] [nvarchar](100) NULL,

       [TSQL] [nvarchar](2000) NULL,

       [SPID] [int] NULL,

       [ServerName] [nvarchar](200) NULL,

       [LoginName] [nvarchar](100) NULL,

       [UserName] [nvarchar](100) NULL,

       [HostName] [nvarchar](100) NULL,

       [Program] [nvarchar](100) NULL,

       [DatabaseName] [nvarchar](200) NULL,

       [XMLData] [xml] NULL

) ON [PRIMARY]

 

GO

 

 

트리거 생성

 

CREATE TRIGGER [TRI_DDLLog]

ON DATABASE

FOR DDL_DATABASE_LEVEL_EVENTS

AS

 

DECLARE @data XML

SET @data = EVENTDATA()

DECLARE @SPID INT

SET @SPID = @data.value('(/EVENT_INSTANCE/SPID)[1]','int')

 

INSERT dbo.DDLLog

(

       PostTime

,      DB_User

,      Event

,      ObjectName

,      ObjectType

,      TSQL

,      SPID

,      ServerName

,      LoginName

,      UserName

,      HostName

,      Program

,      DatabaseName

,      XMLData

)

SELECT

       PostTime            = GETDATE()

,      DB_User                    = CONVERT(nvarchar(100), CURRENT_USER)

,      Event               = @data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)')

,      ObjectName          = @data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'nvarchar(100)')

,      ObjectType          = @data.value('(/EVENT_INSTANCE/ObjectType)[1]', 'nvarchar(100)')

,      TSQL                = @data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(2000)')

,      SPID                = @data.value('(/EVENT_INSTANCE/SPID)[1]','int')

,      ServerName          = @data.value('(/EVENT_INSTANCE/ServerName)[1]','nvarchar(200)')

,      LoginName           = @data.value('(/EVENT_INSTANCE/LoginName)[1]','nvarchar(100)')

,      UserName            = @data.value('(/EVENT_INSTANCE/UserName)[1]','nvarchar(100)')

,      HostName            = (SELECT hostname FROM sys.sysprocesses WHERE spid = @SPID)

,      Program                    = (SELECT program_name FROM sys.sysprocesses WHERE spid =@SPID)

,      DatabaseName = @data.value('(/EVENT_INSTANCE/DatabaseName)[1]','nvarchar(200)')

,      XMLData                    = @data

 

 

GO

 

원하시는 DB에 트리거를 생성 후 DDL 문을 실행하면 해당 내역을 DB로 남기는 것 입니다.

 

아래는 테스트 스크립트 입니다.

 

--//1

CREATE TABLE TB1

(

       COL1   INT    NOT NULL

)

GO

 

--//2

ALTER TABLE TB1 ADD COL2 INT

GO

 

--//3

DROP TABLE TB1

GO

 

--//4

SELECT * FROM DDLLog

GO

ALTER

 

아래와 같은 결과를 보실 수 있으며 XMLData 컬럼을 클릭하시면 XML로 된 DDL 내역을 보실 수 있습니다.

 DDL1.png


http://www.sqler.com/427945

반응형
반응형

/*                                      
select *
   into test
  from ( select 1 seq  ,'테스트'    고객    ,'2009-02-04' 일자,'E-MAIL' 방법 union all
   select 2 ,'테스트'                 ,'2009-02-05' ,'전화' union all
   select 3 ,'테스트'                 ,'2009-02-06' ,'기타' union all
   select 4 ,'테스트'                 ,'2009-02-09' ,'기타' union all
   select 5 ,'ALBERFLEX'    ,'2009-02-04' ,'E-MAIL' union all
   select 6    ,'test'                    ,'2009-02-09'  ,'기타' ) r 
 
select  고객 , 일자,row_number() over (partition by 고객 order by 고객, seq) 고객seq,방법
  into  test1
  from  test 

*/

 

DECLARE @sql VARCHAR(max)
set @sql = 'select 고객'
 
select @sql = @sql 
           + ', max(case when 고객seq = ' + convert(varchar,고객seq) + ' then ' + '''''+일자+''''' + ' else '''' end) 일자'
           + ', max(case when 고객seq = ' + convert(varchar,고객seq) + ' then ' + '''''+방법+''''' + ' else '''' end) 방법'
  from test1 group by  고객seq 

 select @sql = @sql + '  from test1 group by 고객 order by 고객'


 select @sql


 EXEC(@sql)

 

/////////////////////////////////////////

drop table #test
select *
into #test
from
(select '참여자' 구분 ,'박기효' 이름 ,30 cnt , '2009-04' 년월 union all
select '참여자' ,'박기효' ,31, '2009-05' union all
select '참여자' ,'박기효' ,30, '2009-06' union all
select '참여자' ,'박기효' ,31, '2009-07' union all
select '참여자' ,'박기효' ,11, '2009-08' union all
select '참여자' ,'이기수' ,30, '2009-09' union all
select '참여자' ,'이기수' ,31, '2009-10' union all
select '참여자' ,'이기수' ,31, '2009-08' 

) r

 

DECLARE @sql VARCHAR(max)
set @sql = 'select 구분 , 이름'

select @sql = @sql
            + ',  sum(case when  seq = ' + convert(varchar, r.seq) + ' then cnt else 0 end) [' + 년월 +']'
  from ( select row_number() over (order by 년월) seq
             ,  년월
           from  #test group by 년월 ) r

 select @sql = @sql + 'from ( select r.seq, a.*
                                from ( select row_number() over (order by 년월) seq ,  년월
                                         from #test ) r  inner join  #test a on r.년월 = a.년월) rr 
                       group by 구분 , 이름 '
 
select @sql 

EXEC(@sql)

 

반응형

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

작업모니터  (0) 2013.03.29
트리거를 이용한 DDL 추적  (0) 2013.03.21
NEWID  (0) 2013.03.08
트랜잭션 로그 성능을 향상시키는 8가지 방법  (0) 2013.02.21
트랜잭션 가상 로그 파일 개수 확인  (0) 2013.02.21
반응형

http://msdn.microsoft.com/en-us/library/cc441928.aspx



Selecting Rows Randomly from a Large Table

24명 중 24명이 도움이 되는 것으로 평가 - 이 항목 평가

Marcelo De Barros, Kenton Gidewall

Microsoft Corporation

April 2008

Applies to:

   Microsoft SQL Server 2000

   Microsoft SQL Server 2005

Summary: The authors offer new ideas on how to select random rows from a large table. (4 printed pages)

If you use Microsoft SQL Server 2000, you likely have run into the following problem: You want to select a random sampling of rows from a large table with lots of rows, but you are unsure of how to do so. Having a random sampling of rows can be useful when you want to make a smaller version of the table or if you want to troubleshoot a problem by seeing what kinds of rows are in the table.

To get a random sampling, you might be tempted to select the top n rows from the table. However, this sample is not random, and the first n rows are not necessarily representative of the whole table. Other solutions exist that involve adding columns to the tables; however, adding columns is not always possible or practical.

The standard way to grab random rows from a small table is to use a query such as the following:

  SELECT TOP 10 PERCENT *
  FROM Table1
  ORDER BY NEWID()

The key here is the NEWID function, which generates a globally unique identifier (GUID) in memory for each row. By definition, the GUID is unique and fairly random; so, when you sort by that GUID with the ORDER BY clause, you get a random ordering of the rows in the table. Taking the top 10 percent (or whatever percentage you want) will give you a random sampling of the rows in the table.

Often, when questions about how to select random rows are asked in discussion groups, the NEWID query is proposed; it is simple and works very well for small tables. However, the NEWID query has a big drawback when you use it for large tables. The ORDER BY clause causes all of the rows in the table to be copied into the tempdb database, where they are sorted. This causes two problems:

  1. The sorting operation usually has a high cost associated with it. Sorting can use a lot of disk I/O and can run for a long time.
  2. In the worst-case scenario, tempdb can run out of space. In the best-case scenario, tempdb can take up a large amount of disk space that never will be reclaimed without a manual shrink command.

What you need is a way to select rows randomly that will not use tempdb and will not get much slower as the table gets larger. Here is a new idea on how to do that:

  SELECT * FROM Table1
  WHERE (ABS(CAST(
  (BINARY_CHECKSUM(*) *
  RAND()) as int)) % 100) < 10

The basic idea behind this query is that we want to generate a random number between 0 and 99 for each row in the table, and then choose all of those rows whose random number is less than the value of the specified percent. In this example, we wantapproximately 10 percent of the rows selected randomly; therefore, we choose all of the rows whose random number is less than 10.

Taking a closer look at how the (ABS(CAST((BINARY_CHECKSUM(*) * RAND()) as int)) portion of this query works: TheBINARY_CHECKSUM function generates a checksum value that is based on the values of the columns that you specify. If two rows are different, they typically will generate different checksum numbers. The BINARY_CHECKSUM function generally is used to verify whether any of the columns in a row in a table have changed. However, for our purposes, it generates a number that looks like a random number for each row.

The shortcoming of using the BINARY_CHECKSUM function for our purpose is that, every time that it is used on a row that has not been modified, it returns the same checksum number. Thus, when it is used by itself, subsequent runs of the query return the same "random" set of rows, which obviously is not desirable.

To fix this shortcoming, we added the RAND function to the BINARY_CHECKSUM query. The RAND function scrambles the numbers that are returned by the BINARY_CHECKSUM function. Thus, we get a different set of rows each time the query is run—making it truly random. The ABS and CAST functions are used, because BINARY_CHECKSUM (*) * RAND returns a float that can be a negative number.

The asterisk (*) in BINARY_CHECKSUM (*) tells the function to use in its calculations all of the columns in the row. Alternatively, you can specify a subset of the columns in place of the asterisk. Because this function is CPU-intensive, specifying the minimum number of columns or minimum number of bytes will give you the best performance. The best candidates would be the columns in a unique index. If you decide to use specific columns instead of all of the columns, you can add NEWID as a column in theBINARY_CHECKSUM function, so that the BINARY_CHECKSUM query will return a random number each time. Thus, you do not need to use RAND in the query, which simplifies it slightly, as shown here:

  SELECT * FROM Table1
  WHERE (ABS(CAST(
  (BINARY_CHECKSUM
  (keycol1, NEWID())) as int))
  % 100) < 10

Because no sorting is involved in the BINARY_CHECKSUM query, only a single pass through the table is required to choose n % of the rows. The time and the I/O both stay linear, in proportion to the size of the table.

To test the BINARY_CHECKSUM query against the NEWID query, we set up three large tables that contain 1 million rows (435MB), 7 million rows (3GB), and 14 million rows (5.4GB), respectively, on an HP ProLiant DL580 G2 server with 1GB memory, four 2.2MHz Intel processors, and eight 36GB disks in RAID 1+0 configuration. Table 1 shows the results. Figure 1 compares graphically how long the queries took. As Figure 1 and Table 1 both show, the BINARY_CHECKSUM query saves a lot of time and I/O, compared with the NEWID query.

The SQL Server team at Microsoft realized that not being able to take random samples of rows easily was a common problem in SQL Server 2000; so, the team addressed the problem in SQL Server 2005 by introducing the TABLESAMPLE clause. This clause selects a subset of rows by choosing random data pages and returning all of the rows on those pages. However, for those of us who still have products that run on SQL Server 2000 and need backward-compatibility, or who need truly row-level randomness, the BINARY_CHECKSUM query is a very effective workaround.

Table 1. Test results

 Time (sec)Table1 logical I/O countWorktable logical I/O countTotal I/O countCPU time (msec)

1 million rows

 

 

 

 

 

NEWID query

14.3

27,076

1,046,172

1,073,248

32,142

BINARY_CHECKSUMquery

0.7

27,076

0

19,807

2,781

7 million rows

 

 

 

 

 

NEWID query

134

193,790

7,332,291

7,526,081

227,250

BINARY_CHECKSUMquery

10

193,790

0

193,790

28,812

13 million rows

 

 

 

 

 

NEWID query

253

347,420

13,810,132

14,157,552

422,891

BINARY_CHECKSUMquery

21

347,420

0

347,420

49,203

Cc441928.49d347cb-c75d-4d94-9cad-3a0d7d7a2d5b(en-us,MSDN.10).gif

Figure 1. NEWID vs. BINARY_CHECKSUM queries

About the authors

Marcelo De Barros (marcelod@microsoft.com) is a Senior Test Manager at Microsoft. He received an undergraduate degree in Computer Science in Brazil (1999), and a M.S. in Computer Science from the University of Washington (2006). Marcelo's areas of expertise include performance and scalability tests, and capacity planning.

Kenton Gidewall (kentong@microsoft.com) is a Software Design Engineer/Test at Microsoft. He has a B.S. in Computer Science from Brigham Young University (1989) and a M.S. in Computer Science from Michigan State (1992). Kenton's areas of expertise include high TPS, large-scale system development, and performance testing.

This article was published originally in SQL Server Magazine. Copyright 2007 by Penton Media. Reproduced with permission.

이 정보가 도움이 되었습니까?  

커뮤니티 추가 항목

추가

reading comprehension and statistics

The previous poster has a problem with reading comprehension and statistics.

First, the article quite clearly says "In this example, we want approximately 10 percent of the rows selected randomly".  Second, the article also quite clearly is targeted towards large tables, since the title of the article is "Selecting Rows Randomly from a Large Table".
This is where the statistics part kicks in.  The solution presented, as the poster has demonstrated quite clearly, does not work with small data samples, because the statistical standard deviation is huge.  However, as the sample size increases, the standard deviation drops off very quickly, meaning that it will get closer and closer to the percent desired.  I'd show the math for that, but honestly, that requires work, so either trust me, or do the math yourself.  Though as a super quick example, consider a random coin flip... a single coin flip is either heads or tails (1 or 0).  Over a _large!!!_ number of coin flips this will converge to an average of half heads and half tails... approximately!  (.5)

The bottom line is, for large (approximately > 10k rows) this approach works very well, and results in a data set that will meet most needs for a sample data set.  Just don't use it for small data or expect it to be exactly some percent of the total you need.
10/11/2012

The algorithm of this article is incorrect for percentage. Don't use it.

The flaw in the logic is the assumption that algorithm ABS(CAST((BINARY_CHECKSUM(ID, NEWID())) as int)) % 100 will result in an even distribution of results.  If the distribution of results were even then performing % 100 < 10 would always result in 10 rows per 100.  The result distribution is in no way even.  Here is the distribution of 20 rows:


Abs    AbsMod100    RowNumber

541059703    0    19

1991435269    4    9

886205707    5    7

150167240    7    14

161972694    10    15

317579465    13    4

508825937    25    3

385506293    31    18

806118863    35    1

1572451654    52    6

1692251164    52    11

662344368    60    2

1353054314    68    8

1624363067    75    16

894891176    81    12

905686391    83    13

1168792690    87    17

1285066729    91    10

1656198436    95    20

7309091    98    5


AbsMod100 < 10 in this case would result in 4 rows per 20 or 20% rather than 10%.  Here's a query to repro the flaw with:


SELECT *

FROM (

    SELECT ABS(CAST((BINARY_CHECKSUM(object_id, NEWID())) as int)) As [Abs],

        ABS(CAST((BINARY_CHECKSUM(object_id, NEWID())) as int)) % 100 As [AbsMod100],

        ROW_NUMBER() OVER (ORDER BY object_id) As RowNumber

    FROM sys.objects

) t

WHERE RowNumber BETWEEN 1 AND 20

ORDER BY [AbsMod100]

반응형
반응형

트랜잭션 로그 성능을 향상시키는 8가지 단계

http://sqlskills.com/blogs/kimberly/post/8-steps-to-better-Transaction-Log-throughput.aspx


1. 트랜잭션 로그를 물리적인 전용 디스크에 별도로 구성한다. 대용량 OLTP 시스템에서 트랜잭션 로그를 별도로 분리하면 다른 파일과 

물리적 디스크 자원을 사용하기 위해 경합하지 않아도 도니다. 만일 이미 데이터베이스가 존재한다면 sp_detach_db 구문을 사용해서

트랜잭션 로그 파일을 분리하고 sp_attach_db 구문을 사용해서 다시 연결한다.


2. 트랜잭션 로그가 위치하고 있는 디스크를 조각모음한다. 이 작업은 트랜잭션 로그의 내부 조각과 외부 조각 문제를 해결해 줄 것이다. 이러한 조각 모음 작업은 데이터베이스 서버를 오프라인 상태로 만들어야 하지만 파일이 여러 번 자동증가 되었거나 로그가 저장된 디스크에 수정된 파일이 많이 있다면 이 파일들은 많이 조각나 있을 것이다. 이러한 조각모음을 위해서는 SQL Server를 셧다운해야 하며 microsoft나 서드파티의 조각모음을 위한 시스템 도구를 사용해야 한다.


3. 하나의 트랜잭션 로그 파일을 생성한다. 만일 여러 트랜잭션 로그 파일을 생성한다 하더라도 SQL Server는 실제로 여러 트랜잭션 로그 파일들을 병렬로 사용하지는 않는다. 대신, SQL Server는 순차적으로 트랜잭션 로그 파일을 사용한다. 트랜잭션 로그 작업 성능을 향상시키기 원한다면 보다 빠른 디스크와 좋은 성능의 RAID 구성의 디스크에 로그 파일을 구성한다. 트랜잭션 로그는 RAID 0 어레이에 구성할 수 있지만 성능과 fault tolerance를 위한다면 RAID 1 이상을 고려한다.


4. 트랜잭션 로그는 별도의 물리적 디스크에 구성할 뿐 아니라 가능하면 특별한 논리적/물리적 디스크 구성을 갖도록 한다. 특별한 용량 문제가 없다면 별도의 RAID 1 미러링 셋을 사용한다. 최적의 성능과 용량을 필요로 한다면 RAID 0과 RAID 1의 혼합 구성을 고려한다. RAID 0+1이 최적의 성능을 제공하는 반면, RAID 1+0은 최적의 신뢰성을 제공한다.


5. 트랜잭션 로그의 속도에만 집작하지 말고 트랜잭션 로그의 유효성도 고려해야 장애 발생시 도움이 될 수 있다. 데이터가 손상되더라도 트랜잭션 로그를 사용할 수 있고 연속적인 로그 백업을 가지고 있으며 이 백업이 마지막 트랜잭션 로그를 포함한다면 마지막 트랜잭션 로그 백업 이후의 모든 변경 내용을 나타낼 로그를 백업할 수 있다. 이 백업을 성공적으로 수행할 수 있다면 (이를 비상 로그 백업이라고 함) 장애 시점까지 데이터베이스를 복구할 수 있다. 이는 로그가 유용할 경우에만 가능하다. 로그를 미러 디스크에 배치하면 데이터 복구 가능성을 높일 수 있으며 데이터 손실을 최소로 할 수 있다.


6. 트랜잭션 로그를 적절한 초기 크기로 생성한다. 데이터베이스를 생성할 때 데이터 파일과 트랜잭션 로그 파일의 크기를 예상되는 최종 크기로 생성한다. 만일 필요한 트랜잭션 로그 파일의 크기를 예측하기 힘들다면 아래에 트랜잭션 크기에 영향을 줄 수 있는 사항이 있다.

 

 * 작업 유형 - 트랜잭션 처리 또는 의사 결정 지원

 * 작업 주기 - 자주 변경할수록 트랜잭션 로그는 빨리 증가함

 * 복구 모델 - 데이터베이스의 복구 모델

 * 트랜잭션 로그 백업 주기

 * 복제 사용 여부 (로그 판독기는 트랜잭션 로그를 기반으로 함)


만일 데이터베이스 크기만을 예상할 수 있고 로그 크기를 예상하기 힘들다면 데이터베이스의 크기의 10~25%를 로그 크기로 권장한다. 매우 자주 트랜잭션 로그를 백업하는 큰 데이터베이스는 데이터 크기의 1% 만을 가질 수도 있다. 로그 크기를 예측하는 가장 좋은 방법은 프로덕션 환경(백업 작업을 포함)과 비슷한 개발 환경을 구성하고 트랜잭션 로그가 얼마나 증가하는지 살펴보는 것이다.


7. 자동증가를 맹신하면 안된다. 물론 자동 증가를 끄는 것을 권장하는 것은 아니지만 SQL Server의 기본 자동 증가 속성은 권장하지 않는다. 증가율은 일반적으로 1GB 정도를 권장한다. 또한 퍼센트는 권장하지 않는데 이는 계산하기 힘들며 파일이 커질수록 자동 증가율도 커지고 아울러 파일이 증가하는데 필요한 시간도 늘어나기 때문이다.


8 내부 조각 모음을 확인하고 수정한다. 트랜잭션 로그 크기를 미리 최종 크기로 할당하지 않고 잦은 자동 증가가 발생했다면 트랜잭션 로그는 내부적으로 조각날 것이다. 내부적으로 트랜잭션 로그는 여러 작은 조각인 VLF로 조각난다. VLF의 크기는 트랜잭션 로그가 증가할 때 주로 발생한다. 만일 트랜잭션 로그에 자동 증가나 수동 증가를 통해 20MB 크기를 추가했다면 추가된 VLF의 수는 4이다. 만일 64MB보다 크고 1GB보다 작은 크기를 추가하면 8개의 VLF가 추가된다. 1GB보다 큰 크기를 추가면 16VLF가 추가될 것이다. 일반적으로 대부분의 트랜잭션 로그는 20~30VLF를 가지며 전체 트랜잭션 로그 크기에 따라 50개가 적절할 수 있다. 그러나 대부분의 경우 과도한 자동증가는 매우 많은 VLF를 추가하여 수 백개의 VLF를 생성할 것이다. VLF의 수를 확인하려면 DBCC LOGINFO 명령이 리턴하는 행 수를 확인하면 된다. 이 행 수는 트랜잭션 로그 파일이 갖는 VLF의 수와 동일하다.

만일 50개 이상의 VLF를 갖는다면 이를 수정하고 자동 증가를 조정하여 자동증가가 자주 발생하지 않도록 해야 한다. 과도한 VLF를 제거하려면 다음 단계를 수행하여 조각 수를 줄이고 새로운 트랜잭션 로그를 생성한다.



 1. 작업이 별로 없는 시간에 (먼저 데이터베이스를 single user 모드로 구성) 트랜잭션 로그 백업을 통해 모든 트랜잭션 로그 작업을 제거한다. 만일 단순 복구 모델을 사용한다면 로그 백업은 필요 없다. 대신 checkpoint를 수행하여 로그를 제거한다.


     BACKUP Log 데이터베이스이름 To 디바이스이름


2. 로그를 가능한 작은 크기로 줄인다.


     DBCC SHRINKFILE (트랜잭션_로그파일_이름, TRUNCATEONLY)


3. 데이터베이스를 수정하여 트랜잭션 로그를 적절한 크기로 설정한다.


     ALTER DATABASE 데이터베이스이름

     MODIFY FILE

     ( NAME = 트랜잭션로그_파일이름,

       SIZE = 새로운_크기

     )

반응형
반응형

트랜잭션 로그는 내부적으로 여러 개의 가상 로그 파일(VLF)로 나뉘어져 있습니다. 최소 크기는 256KB, 가상 로그 파일의 크기는 고정되어 있지 않으며 로그 파일을 만들거나 확장할 때 데이터베이스 엔진에 의해서 가상 로그 파일 크기가 결정되게 됩니다. 또한 데이터베이스 엔진은 적은 수의 가상 파일을 유지하려고 합니다. 가상 로그 파일의 개수가 많을 경우 백업, 복원, 트리거 등과 같은 로그 관련 작업에 성능에 대한 영향을 주기 때문입니다. 결론은 트랜잭션 패턴을 파악하여 자동으로 로그 확장이 발생하지 않도록 적정한 로그 크기를 할당하는 것이겠지요~ 뻔한 이야기만 했네요... ^^

실제 VLF 개수가 수십 만개로 늘어난 환경에서 RESTORE, Attach 데이터베이스 작업 수행 시 성능에 큰 영향을 준 사례가 있었기에 아래와 같이 정리해봤습니다. 다음 테스트를 통해 VLF 개수 변화를 확인하였습니다.


1. 샘플 데이터베이스를 생성합니다. 트랜잭션 로그는 10MB 로 초기 설정하였습니다.

CREATE DATABASE LAIGO
ON PRIMARY
(NAME = LAIGO_DATA1,
  FILENAME = N'D:\SQLDATA\LAIGO_DATA1.mdf',
          SIZE = 10MB,
          FILEGROWTH = 50MB)
LOG ON
( NAME = LAIGO_log_file1,
  FILENAME = N'D:\SQLDATA\LAIGO_LOG.ldf',
          SIZE = 10MB,
          FILEGROWTH = 1MB)
GO



2. DBCC LOGINFO 명령을 수행하여 VLF 개수와 용량을 확인합니다.

USE LAIGO
GO

DBCC LOGINFO


--1개당 약 2.5MB  VLF 파일이 4개 생성되었습니다.



트랜잭션 로그 파일의 증가 크기에 따른 VLF 개수는 아래와 같이 생성된다고 합니다.

로그파일 증가크기

VLF 개수

VLF당 크기

1MB 까지

2~4

248KB ~ 334KB

64MB 까지

4

256KB ~ 16MB

1GB 까지

8

8MB ~ 128MB

1GB 초과

16

64MB ~

(하만철님 블로그에서 무단 도용함 ㅋㅋㅋ)


샘플 데이터베이스의 로그 파일 초기 크기를 각각 1MB, 10MB, 100MB, 1GB, 10GB 로 달리하여 VLF 개수와 크기를 확인하였습니다. 

 /* FileSize 
1MB
253952
253952
253952
278528

10MB
2555904
2555904
2555904
2809856

100MB
13041664
13041664
13041664
13041664
13041664
13041664
13041664
13557760

1GB
134152192
134152192
134152192
134152192
134152192
134152192
134152192
134668288


10GB
671023104
671023104
671023104
671023104
671023104
671023104
671023104
671023104
671023104
671023104
671023104
671023104
671023104
671023104
671023104
672063488
*/




트랜잭션 로그 파일 초기 크기가 100MB 일 때, VLF 크기는 약 13MB 8개의 파일이 생성되며 로그 파일 증가 크기를 1MB 로 설정한 뒤 자동 증가가 이루어졌다면.... 아래와 같이 작은 단위의 VLF 파일이 많이 생성되기 때문에 성능에 영향을 미칠 수 있다는 것을 염두해야겠습니다. 

/* 
13041664
13041664
13041664
13041664
13041664
13041664
13041664
13557760
253952
253952
253952
286720
253952
253952
253952
......
*/ 



트랜잭션 로그의 가상 로그 파일은 백업을 통해 그 개수가 변경되지 않습니다. 비활성 로그가 있다면 SHRINKFILE 을 통해 잘라낼 수 있으며, 이 때 VLF 개수는 줄어들 수 있습니다. 로그 백업을 수행하는 주기 동안 발생하는 전체 트랜잭션을 모니터링 하여 사전에 충분한 로그 파일을 생성해 놓는 것이 중요하다는 결론을 지어봅니다. 하지만 무조건 큰 크기가 좋다고 볼 수 없습니다. 수십 TB 의 크기를 트랜잭션 로그로 생성한다면 하나의 VLF 크기도 수백 GB 가 될 수 있기 때문입니다. 

가장 어려운 설정~ 적당히~~


[참고자료]
Transaction Log Physical Architecture

작성자 : Lai Go / 작성일자 : 2011.04.12 

반응형

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

NEWID  (0) 2013.03.08
트랜잭션 로그 성능을 향상시키는 8가지 방법  (0) 2013.02.21
SQL Server 최대용량 사양 비교(7.0,2000) + (2005,2008)  (0) 2013.01.21
최소 최대값  (0) 2013.01.09
시스템 저장 프로시저  (0) 2012.11.27
반응형

이전에 올린 자료에 더해서 7.0 2000 자료 찾아서 올립니다.

한 눈에 비교해 보세요.

SQL Server 데이터베이스 엔진 개체

SQL Server 7.0

SQL Server 2000

일괄 처리 크기

65,536 * 네트워크 패킷 크기1

65,536 * 네트워크 패킷 크기1

짧은 문자열 열 각각의 바이트 수

8000

8000

textntext 또는 image 열 각각의 바이트 수

2GB-2

2GB-2

GROUP BY, ORDER BY 각각의 바이트 수

8060

 

인덱스 당 바이트 수

900

900

외래 키 당 바이트 수

900

900

기본 키 당 바이트 수

900

900

각 행의 바이트 수

8060

8060

저장 프로시저의 원본 텍스트의 바이트 수

일괄 처리 크기 또는 250MB 미만

일괄 처리 크기 또는 250MB 미만

각 테이블의 클러스터된 인덱스 수

1

1

GROUP BY, ORDER BY의 열 수

바이트 수로만 제한

 

GROUP BY WITH CUBE 또는 WITH ROLLUP 문의 열 또는 식의 수

10

 

인덱스 당 열 수

16

16

외래 키 당 열 수

16

16

기본 키 당 열 수

16

16

기본 테이블 당 열 수

1024

1024

SELECT 문 각각의 열 수

4096

4096

INSERT 문 각각의 열 수

1024

1024

클라이언트 당 연결 수

구성된 연결의 최대 값

구성된 연결의 최대 값

데이터베이스 크기

1,048,516TB

1,048,516TB

SQL Server 인스턴스 당 데이터베이스 수

32767

32767

데이터베이스 당 파일 그룹 수

256

256

데이터베이스 당 파일 수

32767

32767

파일 크기(데이터)

32TB

32TB

파일 크기(로그)

4TB

32TB

테이블 당 외래 키 테이블 참조 수

253

253

식별자 길이(문자 수)

128

128

각 컴퓨터의 인스턴스 수

N/A

16

SQL 문이 포함된 문자열의 길이(일괄 처리 크기)

65,536 * 네트워크 패킷 크기

65,536 * 네트워크 패킷 크기

연결 당 잠금 수

각 서버의 최대 잠금 수

각 서버의 최대 잠금 수

SQL Server 인스턴스 당 잠금 수

2,147,483,647(정적)

2,147,483,647(정적)

 

SQL Server 메모리의 40%(동적)

SQL Server 메모리의 40%(동적)

중첩 저장 프로시저 수준 수

32

32

중첩 하위 쿼리 수

32

32

중첩 트리거 수준 수

32

32

각 테이블의 클러스터되지 않은 인덱스 수

249

249

SQL Server의 한 인스턴스에서 현재 열려 있는 개체 수

2,147,483,647(또는 사용 가능한 메모리)

2,147,483,647(또는 사용 가능한 메모리)

데이터베이스의 개체 수

2,147,483,647

2,147,483,647

각 저장 프로시저의 매개 변수 개수

1024

1024

각 테이블의 REFERENCES 

253

253

각 테이블의 행 수

사용 가능한 저장소로 제한됨

사용 가능한 저장소로 제한됨

데이터베이스 당 테이블 수

데이터베이스의 개체 수로 제한됨

데이터베이스의 개체 수로 제한됨

각 SELECT 문의 테이블 수

256

256

테이블 당 트리거 수

데이터베이스의 개체 수로 제한됨

데이터베이스의 개체 수로 제한됨

테이블 당 UNIQUE 인덱스 또는 제약 조건 수

249(클러스터되지 않음)/1(클러스터됨)

249(클러스터되지 않음)/1(클러스터됨)

잠금

96바이트

64바이트 + 32바이트(소유자 당)

열린 데이터베이스

2,880바이트

3924바이트 + 1640바이트(파일 당 336바이트(파일 그룹 당)

열린 개체1

276바이트

256바이트 + 1724바이트(개체에 대해 열린 인덱스 당)2

사용자 연결

12 KB + (3 * 네트워크 패킷 크기)3

12 KB + (3 * 네트워크 패킷 크기

 

위 자료는 김대우님께서 올려주신 자료를 바탕으로 조금 짜집기했습니다.

원문출처 : http://www.sqler.com/bSQL2000Lec/126621

 

그런데아무리 찾아봐도 제 능력으로는 일부 빠진 항목들을 채우지 못했네요아시는 분 있으시면 리플로. ^^.

 

이전에 올려드렸던2005 2008 자료도 한번 더 올려 드립니다. ^^

SQL Server 데이터베이스 엔진 개체

SQL Server 2008

SQL Server 2005

최대 크기/개수SQL Server(32비트)

최대 크기/개수SQL Server(64비트)

최대 크기/개수SQL Server 2005(32비트)

최대 크기/개수SQL Server 2005(64비트)

일괄 처리 크기

65,536 * 네트워크 패킷 크기

65,536 * 네트워크 패킷 크기

65,536 * 네트워크 패킷 크기

65,536 * 네트워크 패킷 크기

짧은 문자열 열당 바이트 수

8,000

8,000

8,000

8,000

GROUP BY, ORDER BY당 바이트 수

8,060

8,060

8,060

8,060

인덱스 키당 바이트 수

900

900

900

900

외래 키당 바이트 수

900

900

900

900

기본 키당 바이트 수

900

900

900

900

행당 바이트 수

8,060

8,060

8,060

8,060

저장 프로시저의 원본 텍스트의 바이트 수

일괄 처리 크기 또는 250MB 미만

일괄 처리 크기 또는 250MB 미만

 

 

varchar(max),varbinary(max)xml,text 또는 image 열당 바이트 수

2^31-1

2^31-1

2^31-1

2^31-1

ntext 또는nvarchar(max) 열당 문자 수

2^30-1

2^30-1

2^30-1

2^30-1

테이블당 클러스터형 인덱스 수

1

1

1

1

GROUP BY, ORDER BY의 열 수

바이트 수로만 제한

바이트 수로만 제한

바이트 수로만 제한

바이트 수로만 제한

GROUP BY WITH CUBE 또는WITH ROLLUP 문의 열 또는 식의 수

10

10

10

10

인덱스 키당 열 수

16

16

16

16

외래 키당 열 수

16

16

16

16

기본 키당 열 수

16

16

16

16

넓지 않은 테이블당 열 수

1,024

1,024

1,024

1,024

넓은 테이블당 열 수

30,000

30,000

 

 

SELECT 문당 열 수

4,096

4,096

4,096

4,096

INSERT 문당 열 수

4096

4096

1,024

1,024

클라이언트당 연결 수

구성된 연결의 최대 값

구성된 연결의 최대 값

구성된 연결의 최대 값

구성된 연결의 최대 값

데이터베이스 크기

524,272TB

524,272TB

524,258TB

524,258TB

SQL Server 인스턴스당 데이터베이스 수

32,767

32,767

32,767

32,767

데이터베이스당 파일 그룹 수

32,767

32,767

32,767

32,767

데이터베이스당 파일 수

32,767

32,767

32,767

32,767

파일 크기(데이터)

16TB

16TB

16TB

16TB

파일 크기(로그)

2TB

2TB

2TB

2TB

테이블당 외래 키 테이블 참조 수

253

253

253

253

식별자 길이(문자 수)

128

128

128

128

컴퓨터당 인스턴스 수

Workgroup을 제외한 모든 SQL Server 버전에 대해 독립 실행형 서버당 50개의 인스턴스. Workgroup은 컴퓨터당 최대 16개의 인스턴스를 지원합니다.

독립 실행형 서버당 50개의 인스턴스

워크그룹 버전을 제외한 모든 SQL Server 2005 버전에 대해 독립 실행형 서버당 50개의 인스턴스워크그룹 버전에서는 최대 16개의 인스턴스를 지원합니다.

독립 실행형 서버당50개의 인스턴스

SQL Server는 장애 조치(Failover) 클러스터에서 25개의 인스턴스를 지원합니다.

장애 조치 클러스터당 25개의 인스턴스

SQL Server 2005에서는 장애 조치(Failover) 클러스터당 25개의 인스턴스를 지원합니다.

장애 조치 클러스터당 25개의 인스턴스

 

봐야 할 게 많네요


출처 : sqler 

http://www.sqler.com/index.php?_filter=search&mid=bColumn&search_target=nick_name&search_keyword=%EC%93%B8%EB%A7%8C%ED%95%9C%EA%B2%8C&page=3&document_srl=334903

반응형

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

트랜잭션 로그 성능을 향상시키는 8가지 방법  (0) 2013.02.21
트랜잭션 가상 로그 파일 개수 확인  (0) 2013.02.21
최소 최대값  (0) 2013.01.09
시스템 저장 프로시저  (0) 2012.11.27
UTIL QUERY  (0) 2012.11.06
반응형

declare @max int, @min int
set @max = 10
set @min = 7;
select CAST(((@max + 1) - @min) * rand() + @min as int);

반응형

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

트랜잭션 가상 로그 파일 개수 확인  (0) 2013.02.21
SQL Server 최대용량 사양 비교(7.0,2000) + (2005,2008)  (0) 2013.01.21
시스템 저장 프로시저  (0) 2012.11.27
UTIL QUERY  (0) 2012.11.06
명세서  (0) 2012.10.04
반응형

시스템 저장 프로시저

Microsoft® SQL Server™ 내의 많은 관리 및 정보 작업은 시스템 저장 프로시저를 통해 수행됩니다. 시스템 저장 프로시저는 다음과 같은 범주로 그룹화됩니다.

Active Directory 프로시저SQL Server 인스턴스 및 SQL Server 데이터베이스를 Microsoft Windows® 2000 Active Directory™에 등록할 때 사용합니다.
카탈로그 프로시저ODBC 데이터 사전 기능을 구현하고 ODBC 응용 프로그램을 원본 시스템 테이블 변경으로부터 격리합니다.
커서 프로시저커서 변수 기능을 구현합니다.
데이터베이스 유지 관리 계획 프로시저데이터베이스 성능을 확인하는 데 필요한 주요 유지 관리 작업을 설정합니다.
분산 쿼리 프로시저분산 쿼리를 구현하고 관리합니다.
전체 텍스트 검색 프로시저전체 텍스트 인덱스를 구현하고 쿼리합니다.
로그 전달 프로시저로그 전달을 구성하고 관리합니다.
OLE 자동화 프로시저표준 OLE 자동화 개체를 표준 Transact-SQL 일괄 처리에서 사용할 수 있게 합니다.
복제 프로시저복제를 관리합니다.
보안 프로시저보안을 관리합니다.
SQL 메일 프로시저SQL Server 내의 전자 메일 작업을 수행합니다.
SQL 프로필러 프로시저SQL Profiler에서 성능 및 동작을 모니터링합니다.
SQL Server 에이전트 프로시저SQL Server 에이전트가 예약된 이벤트 단위의 동작을 관리하는 데 사용합니다.
시스템 프로시저SQL Server의 일반적인 유지 관리에 사용됩니다.
웹 길잡이 프로시저웹 길잡이에서 사용됩니다.
XML 프로시저Extensible Markup Language(XML) 텍스트 관리에 사용됩니다.
일반 확장 프로시저다양한 유지 관리 동작을 위해 SQL Server에서 외부 프로그램으로의 인터페이스를 제공합니다.
범주 설명

참고 특별히 지정되지 않는 한 모든 시스템 저장 프로시저는 성공을 의미하는 값 0을 반환합니다. 실패에 대해서는 0이 아닌 값이 반환됩니다.

sp_ActiveDirectory_Objsp_ActiveDirectory_SCP
Active Directory 프로시저
sp_column_privilegessp_special_columns
sp_column_privilegessp_sproc_columns
sp_databases sp_statistics
sp_fkeys sp_stored_procedures
sp_pkeyssp_table_privileges
sp_server_info sp_tables
카탈로그 프로시저
sp_cursor_listsp_describe_cursor_columns
sp_describe_cursorsp_describe_cursor_tables
커서 프로시저
sp_add_maintenance_plansp_delete_maintenance_plan_db
sp_add_maintenance_plan_dbsp_delete_maintenance_plan_job
sp_add_maintenance_plan_jobsp_help_maintenance_plan
sp_delete_maintenance_plan
데이터베이스 유지 관리 계획 프로시저
sp_addlinkedserversp_indexes
sp_addlinkedsrvloginsp_linkedservers
sp_catalogssp_primarykeys
sp_column_privileges_exsp_serveroption
sp_columns_exsp_table_privileges_ex
sp_droplinkedsrvloginsp_tables_ex
sp_foreignkeys
분산 쿼리 프로시저
sp_fulltext_catalogsp_help_fulltext_catalogs_cursor
sp_fulltext_columnsp_help_fulltext_columns
sp_fulltext_databasesp_help_fulltext_columns_cursor
sp_fulltext_servicesp_help_fulltext_tables
sp_fulltext_tablesp_help_fulltext_tables_cursor
sp_help_fulltext_catalogs
전체 텍스트 검색 프로시저
sp_add_log_shipping_databasesp_delete_log_shipping_database
sp_add_log_shipping_plansp_delete_log_shipping_plan
sp_add_log_shipping_plan_databasesp_delete_log_shipping_plan_database
sp_add_log_shipping_primarysp_delete_log_shipping_primary
sp_add_log_shipping_secondarysp_delete_log_shipping_secondary
sp_can_tlog_be_appliedsp_get_log_shipping_monitor_info
sp_change_monitor_rolesp_remove_log_shipping_monitor
sp_change_primary_rolesp_resolve_logins
sp_change_secondary_rolesp_update_log_shipping_monitor_info
sp_create_log_shipping_monitor_accountsp_update_log_shipping_plan
sp_define_log_shipping_monitorsp_update_log_shipping_plan_database
로그 전달 프로시저
sp_OACreatesp_OAMethod
sp_OADestroysp_OASetProperty
sp_OAGetErrorInfosp_OAStop
sp_OAGetPropertyObject Hierarchy Syntax
OLE 자동화 확장 저장 프로시저
sp_add_agent_parametersp_enableagentoffload
sp_add_agent_profilesp_enumcustomresolvers
sp_addarticlesp_enumdsn
sp_adddistpublishersp_enumfullsubscribers
sp_adddistributiondbsp_expired_subscription_cleanup
sp_adddistributorsp_generatefilters
sp_addmergealternatepublishersp_getagentoffloadinfo
sp_addmergearticlesp_getmergedeletetype
sp_addmergefiltersp_get_distributor
sp_addmergepublicationsp_getqueuedrows
sp_addmergepullsubscriptionsp_getsubscriptiondtspackagename
sp_addmergepullsubscription_agentsp_grant_publication_access
sp_addmergesubscriptionsp_help_agent_default
sp_addpublicationsp_help_agent_parameter
sp_addpublication_snapshotsp_help_agent_profile
sp_addpublisher70sp_helparticle
sp_addpullsubscriptionsp_helparticlecolumns
sp_addpullsubscription_agentsp_helparticledts
sp_addscriptexecsp_helpdistpublisher
sp_addsubscribersp_helpdistributiondb
sp_addsubscriber_schedulesp_helpdistributor
sp_addsubscriptionsp_helpmergealternatepublisher
sp_addsynctriggerssp_helpmergearticle
sp_addtabletocontentssp_helpmergearticlecolumn
sp_adjustpublisheridentityrangesp_helpmergearticleconflicts
sp_article_validationsp_helpmergeconflictrows
sp_articlecolumnsp_helpmergedeleteconflictrows
sp_articlefiltersp_helpmergefilter
sp_articlesynctranprocssp_helpmergepublication
sp_articleviewsp_helpmergepullsubscription
sp_attachsubscriptionsp_helpmergesubscription
sp_browsesnapshotfoldersp_helppublication
sp_browsemergesnapshotfoldersp_help_publication_access
sp_browsereplcmdssp_helppullsubscription
sp_change_agent_parametersp_helpreplfailovermode
sp_change_agent_profilesp_helpreplicationdboption
sp_changearticlesp_helpreplicationoption
sp_changedistpublishersp_helpsubscriberinfo
sp_changedistributiondbsp_helpsubscription
sp_changedistributor_passwordsp_ivindexhasnullcols
sp_changedistributor_propertysp_helpsubscription_properties
sp_changemergearticlesp_link_publication
sp_changemergefiltersp_marksubscriptionvalidation
sp_changemergepublicationsp_mergearticlecolumn
sp_changemergepullsubscriptionsp_mergecleanupmetadata
sp_changemergesubscriptionsp_mergedummyupdate
sp_changepublicationsp_mergesubscription_cleanup
sp_changesubscribersp_publication_validation
sp_changesubscriber_schedulesp_refreshsubscriptions
sp_changesubscriptiondtsinfosp_reinitmergepullsubscription
sp_changesubstatussp_reinitmergesubscription
sp_change_subscription_propertiessp_reinitpullsubscription
sp_check_for_sync_triggersp_reinitsubscription
sp_copymergesnapshotsp_removedbreplication
sp_copysnapshotsp_repladdcolumn
sp_copysubscriptionsp_replcmds
sp_deletemergeconflictrowsp_replcounters
sp_disableagentoffloadsp_repldone
sp_drop_agent_parametersp_repldropcolumn
sp_drop_agent_profilesp_replflush
sp_droparticlesp_replicationdboption
sp_dropanonymouseagentsp_replication_agent_checkup
sp_dropdistpublishersp_replqueuemonitor
sp_dropdistributiondbsp_replsetoriginator
sp_dropmergealternatepublishersp_replshowcmds
sp_dropdistributorsp_repltrans
sp_dropmergearticlesp_restoredbreplication
sp_dropmergefiltersp_revoke_publication_access

sp_scriptsubconflicttable
sp_dropmergepublicationsp_script_synctran_commands
sp_dropmergepullsubscriptionsp_setreplfailovermode

sp_showrowreplicainfo
sp_dropmergesubscriptionsp_subscription_cleanup
sp_droppublicationsp_table_validation
sp_droppullsubscriptionsp_update_agent_profile
sp_dropsubscribersp_validatemergepublication
sp_dropsubscriptionsp_validatemergesubscription
sp_dsninfosp_vupgrade_replication
sp_dumpparamcmd
복제 프로시저
sp_addaliassp_droprolemember
sp_addapprolesp_dropserver
sp_addgroupsp_dropsrvrolemember
sp_addlinkedsrvloginsp_dropuser
sp_addloginsp_grantdbaccess
sp_addremoteloginsp_grantlogin
sp_addrolesp_helpdbfixedrole
sp_addrolemembersp_helpgroup
sp_addserversp_helplinkedsrvlogin
sp_addsrvrolemembersp_helplogins
sp_adduser sp_helpntgroup
sp_approlepasswordsp_helpremotelogin
sp_changedbownersp_helprole
sp_changegroupsp_helprolemember
sp_changeobjectownersp_helprotect
sp_change_users_loginsp_helpsrvrole
sp_dbfixedrolepermissionsp_helpsrvrolemember
sp_defaultdbsp_helpuser
sp_defaultlanguagesp_MShasdbaccess
sp_denyloginsp_password
sp_dropaliassp_remoteoption
sp_dropapprolesp_revokedbaccess
sp_dropgroupsp_revokelogin
sp_droplinkedsrvloginsp_setapprole
sp_droploginsp_srvrolepermission
sp_dropremoteloginsp_validatelogins
sp_droprole
보안 프로시저
sp_processmailxp_sendmail
xp_deletemailxp_startmail
xp_findnextmsgxp_stopmail
xp_readmail
SQL 메일 프로시저
sp_trace_createsp_trace_setfilter
sp_trace_generateeventsp_trace_setstatus
sp_trace_setevent
SQL 프로필러 프로시저
sp_add_alertsp_help_jobhistory
sp_add_categorysp_help_jobschedule
sp_add_jobsp_help_jobserver
sp_add_jobschedulesp_help_jobstep
sp_add_jobserversp_help_notification
sp_add_jobstepsp_help_operator
sp_add_notificationsp_help_targetserver
sp_add_operatorsp_help_targetservergroup
sp_add_targetservergroupsp_helptask
sp_add_targetsvrgrp_membersp_manage_jobs_by_login
sp_addtasksp_msx_defect
sp_apply_job_to_targetssp_msx_enlist
sp_delete_alertsp_post_msx_operation
sp_delete_categorysp_purgehistory
sp_delete_jobsp_purge_jobhistory
sp_delete_jobschedulesp_reassigntask
sp_delete_jobserversp_remove_job_from_targets
sp_delete_jobstepsp_resync_targetserver
sp_delete_notificationsp_start_job
sp_delete_operatorsp_stop_job
sp_delete_targetserversp_update_alert
sp_delete_targetservergroupsp_update_category
sp_delete_targetsvrgrp_membersp_update_job
sp_droptasksp_update_jobschedule
sp_help_alertsp_update_jobstep
sp_help_categorysp_update_notification
sp_help_downloadlistsp_update_operator
sp_helphistorysp_update_targetservergroup
sp_help_jobsp_updatetask

xp_sqlagent_proxy_account
SQL Server 에이전트 프로시저
sp_add_data_file_recover_suspect_dbsp_helpconstraint
sp_addextendedprocsp_helpdb
sp_addextendedpropertysp_helpdevice
sp_add_log_file_recover_suspect_dbsp_helpextendedproc
sp_addmessagesp_helpfile
sp_addtypesp_helpfilegroup
sp_addumpdevicesp_helpindex
sp_altermessagesp_helplanguage
sp_autostatssp_helpserver
sp_attach_dbsp_helpsort
sp_attach_single_file_dbsp_helpstats
sp_bindefaultsp_helptext
sp_bindrulesp_helptrigger
sp_bindsessionsp_indexoption
sp_certify_removablesp_invalidate_textptr
sp_configuresp_lock
sp_create_removablesp_monitor
sp_createstatssp_procoption
sp_cycle_errorlogsp_recompile
sp_datatype_infosp_refreshview
sp_dbcmptlevelsp_releaseapplock
sp_dboptionsp_rename
sp_dbremovesp_renamedb
sp_delete_backuphistorysp_resetstatus
sp_dependssp_serveroption
sp_detach_dbsp_setnetname
sp_dropdevicesp_settriggerorder
sp_helpextendedprocsp_spaceused
sp_dropextendedpropertysp_tableoption
sp_dropmessagesp_unbindefault
sp_droptypesp_unbindrule
sp_executesqlsp_updateextendedproperty
sp_getapplocksp_updatestats
sp_getbindtokensp_validname
sp_help sp_who
시스템 프로시저
sp_dropwebtasksp_makewebtask
sp_enumcodepagessp_runwebtask
웹 길잡이 프로시저
sp_xml_preparedocumentsp_xml_removedocument
XML 프로시저
xp_cmdshellxp_logininfo
xp_enumgroupsxp_msver
xp_findnextmsgxp_revokelogin
xp_grantloginxp_sprintf
xp_logeventxp_sqlmaint
xp_loginconfigxp_sscanf
일반 확장 프로시저
API 시스템 저장 프로시저

ADO, OLE DB, ODBC 및 DB-Library 응용 프로그램에 대해 SQL 프로필러를 실행하는 사용자는 Transact-SQL 참조에서 시스템 저장 프로시저의 사용이 지원되지 않는다는 것을 알게 될 것입니다. 이 저장 프로시저들은 Microsoft OLE DB Provider for SQL Server, SQL Server ODBC 드라이버 및 DB-Library 동적 연결 라이브러리(DLL)에서 데이터베이스 API 기능을 구현하는 데 사용됩니다. 이 저장 프로시저는 사용자 요청을 SQL Server에 전달하기 위해 공급자 또는 드라이버가 사용하는 간단한 메커니즘입니다. 이들은 OLE DB Provider for SQL Server, SQL Server ODBC 드라이버 및 DB-Library DLL의 내부적 사용만을 위한 것입니다. SQL Server 응용 프로그램에서 이들을 명시적으로 호출할 수는 없습니다.

이 저장 프로시저의 완전한 기능은 이들이 지원하는 API를 사용하여 SQL Server 응용 프로그램에서 사용될 수 있습니다. 예를 들어, sp_cursor 시스템 저장 프로시저의 커서 기능은 OLE DB API 커서 속성 및 함수를 통해 ODBC 응용 프로그램에 사용할 수 있으며 DB-Library 커서 라이브러리를 통해 DB-Library 응용 프로그램에서 사용할 수 있습니다.

다음 시스템 저장 프로시저는 ADO, OLE DB, ODBC, DB-Library 커서 라이브러리의 커서 기능을 지원합니다.

sp_cursorsp_cursorclosesp_cursorexecute
sp_cursorfetchsp_cursoropensp_cursoroption
sp_cursorpreparesp_cursorunprepare

다음 시스템 저장 프로시저는 ADO, OLE DB, ODBC에서 Transact-SQL 문을 실행하는 준비/실행 모델을 지원합니다.

sp_executesp_preparesp_unprepare

sp_createorphansp_droporphans 저장 프로시저는 ODBC ntext, textimage 처리에 사용됩니다.

sp_reset_connection 저장 프로시저는 SQL Server에서 트랜잭션의 원격 저장 프로시저 호출을 지원하는 데 사용됩니다.

sp_sdidebug 저장 프로시저는 SQL Server에서 Transact-SQL 문을 디버깅하는 데 사용됩니다.

ⓒ1988-2000 Microsoft Corporation. All Rights Reserved.


반응형

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

SQL Server 최대용량 사양 비교(7.0,2000) + (2005,2008)  (0) 2013.01.21
최소 최대값  (0) 2013.01.09
UTIL QUERY  (0) 2012.11.06
명세서  (0) 2012.10.04
동적 쿼리의 해결사 sp_executesql vs. exec  (0) 2012.08.03
반응형

CteSysProcesses.대기정보확인.sql


DB 데이터 n 로그 파일정보.sql


DB 모니터 - 자신 정보 수집.sql


DB 초기화 작업.테이블 정리.sql


DB 초기화.sql


dba_spaceused.sql


DMV.sql


DMV_누락인덱스정보.sql


DMV_인덱스사용량.sql


FK 목록.생성.삭제.sql


INDEX.sql


ITEM키끊기.sql


RENAME_INDEX.sql


RENAME_OBJECT.sql


SP_BLOCK.sql


sp_diskspace.sql


sp_who2.sql


SQLQuery75.sql


TABLE ROW COUNT.sql


Table_Info-명세서.sql


tempdb이동.sql


View_Info-명세서.sql


각 서버 정보 수집.sql


데드락확인작업.sql


데이터 및 로그 파일에 대한 IO 통계.sql


데이터베이스 확인.sql


락.sql


로그인 n 사용자 정보.sql


로컬로그수집.sql


모든 인덱스 정보 보기.sql


모든 작업 스크립팅.sql


버그 사용자 대체선수.sql


버그 사용자 컨디션 하락.sql


복원스크립트 생성.sql


부하쿼리확인.sql


사용되지 않는 인덱스 보기.sql


삭제 선수 명단.sql


서버작업목록.sql


서버작업목록1.sql


설정확인.sql


세션실행정보.sql


스케쥴러 조회.sql


시스템 정보.sql


인덱스 리빌드 스크립트 생성.sql


인덱스 및 인덱스에 포함된 컬럼 정보.sql


인덱스 조각화 검사.sql


임시서버작업목록.sql


작업기록.sql


컬럼 설명 추가_수정.xlsx


테이블 n 컬럼 설명 목록.sql


테이블 설명 추가.xlsx


테이블정보 및 시드값.sql


테이블정보 및 시드값.TXT


테이블정보확인.sql


트리거 조회.sql


프로시저 n 파라메터 설명 목록.sql


프로시저 n 파라메터 설명 목록.txt


활성 트랜잭션 찾기.sql



반응형

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

최소 최대값  (0) 2013.01.09
시스템 저장 프로시저  (0) 2012.11.27
명세서  (0) 2012.10.04
동적 쿼리의 해결사 sp_executesql vs. exec  (0) 2012.08.03
저장프로시저 찾기  (0) 2012.07.18
반응형

테이블_뷰_명세서

프로시저 명세서


테이블_뷰_명세서.sql


프로시저_명세서.sql


반응형

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

시스템 저장 프로시저  (0) 2012.11.27
UTIL QUERY  (0) 2012.11.06
동적 쿼리의 해결사 sp_executesql vs. exec  (0) 2012.08.03
저장프로시저 찾기  (0) 2012.07.18
테이블 정보확인  (0) 2012.07.18
반응형

[지디넷코리아]Visual Basic, ASP, VB.NET에서 ADO, ADO.NET을 이용한 Database 프로그램을 개발하는 경우 프로그램내에 SQL 구문을 문자열로 연결한 후 실행하도록 구성한 코드를 많이 보게 된다.

이러한 코드 구성을 일반적으로 '동적 쿼리', '하드 코딩된 쿼리'라 부른다.

예를 들어 비주얼 베이직의 경우

Dim strSQL As String

strSQL="select orderid, orderdate, employeeid from orders"
strSQL=strSQL+" where orderid=" & txtOrderID

cnn.Execute strSQL

하지만 이같은 동적 쿼리는 가능한 사용하지 않는 것이 좋다. 대신 SQL Server의 저장 프로시저를 이용해 처리 용량과 응답 속도의 향상 및 유지 보수 등 저장 프로시저의 특징을 활용하는 것이 좋다.

하지만 설계상의 문제나 또는 고객의 다양한 요구 구현 방법상의 이질적 문제로 인해 동적 쿼리를 써야하는 상황이 자주 발생한다. Q/A의 질문 유형 중에도 이같은 동적 쿼리 작성법에 관한 내용이 상당수를 차지하고 있다.

저장 프로시저를 통해 코드를 구성하더라도 저장 프로시저 내에서 다시 동적 쿼리를 사용하게 되는 경우가 발생한다. 온라인 설명서에는 이를 '런타임 시 명령문 작성'이라는 주제로 설명했다. 이 경우 SQL Server에서는 sp_executesql, exec()의 두가지 명령을 사용할 수 있다.

클라이언트나 서버 사이드에서 동적 쿼리를 사용해야 하는 상황이 되었을 때, 다시말해 저장 프로시저를 직접 사용할 수 없는 상황에서는 또 다른 해결 방법을 이용할 수 있다.
아래 두 가지 상황에서의 해결 방법이다.

클라인트 사이드에서 동적 쿼리가 필요한 경우

ADO, ADO.NET에서는 파라미터를 가진 동적 쿼리를 지정할 수 있으며 일반적으로 아래와 코드 구성을 가진다.

1. ADO, ODBC, Command 오브젝트 연동
Dim strSQL As String

strSQL="select orderid, orderdate, employeeid from orders"
strSQL=strSQL+" where orderid = ?"

2. ADO.NET, SqlClient 네임스페이스, SqlCommand 오브젝트와 연동
Dim strSQL As String

strSQL="select orderid, orderdate, employeeid from orders"
strSQL=strSQL+" where orderid = @orderid"

위에 코드를 실행하면 실제 SQL Server에서는 sp_executesql 시스템 프로시저를 통해서 실행이 된다. 특히 ADO.NET의 경우는 디자인 타임에 'SqlDataAdapter Configuration Wizard'를 사용하면 위와 같은 코드를 작성해 준다.

SQL Server, 저장 프로시저에서 동적 쿼리가 필요한 경우
exec() 아니라 sp_executesql 시스템 프로시저를 이용한다.

결국 클라이언트 사이드건 서버 사이드건 sp_executesql이 사용된 것을 알 수 있다. exec()를 쓴 경우와 sp_executesql를 사용한 경우의 성능과 SQL Server의 Cache 매니저의 상황 비교에 대한 내용을 마지막에 추가해 두었다.

일반적으로 sp_executesql은 exec()비해 몇 가지 장점을 제공한다.

1. 쿼리문안에 매개변수(입력/출력)를 정의할 수 있다.
2. 매개변수 사용으로 인해 쿼리 최적화 프로그램이 컴파일된 실행 플랜을 재 사용할 확률이 높아진다.

실제로 exec()와 sp_executesql은 Cache 매니저의 처리 방법 및 활동 상태가 다르다는 것을 마지막에 추가한 성능 모니터링을 통해서 알 수가 있을 것이다.

이번 기회의 sp_executesql 시스템 프로시저 다양한 사용법과 관련 지식을 얻는데 미력하나마 도움이 됐으면 한다. 그럼, 구문부터 살펴보자.

sp_executesql [@stmt =] stmt
[
{, [@params =] N'@parameter_name data_type [,...n]' }
{, [@param1 =] 'value1' [,...n] }
]

인수설명
@stmt: T-SQL문 또는 배치 명령. ntext 형으로 변환될 수 있는 변수 또는 유니코드 상수 문자열. 내부에 @name 형식의 파라미터를 포함할 수 있다.
@params: @stmt에 포함된 모든 파라미터의 이름과 데이터 타입을 정의한다.
@param1: @params 파라미터에서 첫번째 파라미터에 할당할 값
n : 각 파라미터에 대한 값을 할당한다.

참고
UNICODE 문자열 상수를 지정할 때는 N'...'형식을 사용한다.sp_executesql 프로시저에 선언됐던 파라미터가 ntext형이기 때문에 문자열을 직접 지정할 때는 위와 같은 형태를 사용하면 된다.

sp_executesql은 sql로 구성된 시스템 프로시저가 아니라 확장 프로시저이다.

기본 예제
1. TOP 절의 값을 동적으로 지정하고자 하는 경우(아래 구문은 set rowcount n 세션 옵션으로 대치할 수도 있다)

declare @cnt as nvarchar(5)
declare @stmt as nvarchar(100)
set @cnt = '5'
set @stmt = 'select top ' + @cnt + ' * from northwind.dbo.orders'

exec sp_executesql @stmt

아래 예제는 단순히 SQL을 동적으로 작성하고자 하는 경우로 @db의 값이 실행 시마다
다른 데이터베이스명이 올 수 있다고 가정한다. 테이블명은 동일한다.

declare @db as nvarchar(20)
declare @stmt as nvarchar(100)
set @db = 'northwind'
set @stmt = 'select * from '+ @db +'.dbo.orders'

exec sp_executesql @stmt

2. 하나 이상의 명령을 배치로 실행

declare @stmt as nvarchar(500)
set @stmt = 'use northwind; '
set @stmt = @stmt + 'select top 5 * from dbo.orders where
orderid=10248; '
set @stmt = @stmt + 'select top 5 * from dbo.[order details] where
orderid=10248'

exec sp_executesql @stmt

입력 파라미터를 적용한 예제

1. @orderid 입력 파라미터를 이용해 해당 주문 번호를 가진 [order details] 테이블의 주문 제품 정보를 출력

use northwind

declare @stmt as nvarchar(100)
declare @params as nvarchar(100)
set @stmt = 'select productid, quantity, unitprice from '
set @stmt = @stmt + 'dbo.[order details] where orderid=@orderid'
set @params = '@orderid int'

exec sp_executesql @stmt, @params, @orderid=10248

2. 위 예제를 저장 프로시저 안에서 연동한 경우

use northwind

create proc upOrderDetailsSel
@porderid int
as
declare @stmt as nvarchar(100)
declare @params as nvarchar(100)
set @stmt = 'select productid, quantity, unitprice from '
set @stmt = @stmt + 'dbo.[order details] where orderid=@orderid'
set @params = '@orderid int'

exec sp_executesql @stmt, @params, @orderid=@porderid
go
exec upOrderDetailsSel @porderid = 10248

input 파라미터를 적용한 예제

1. @table을 입력 파라미터를 이용해서 실제 입력할 대상 테이블을 결정 입력될 컬럼값들 또한 입력 파라미터로 처리한 예제

-- 아래 테스트용 테이블을 우선 작성할 것.
create table northwind.dbo.table1 (a int, b int, c int)

use northwind

declare @table as nvarchar(20)
declare @stmt as nvarchar(100)
declare @params as nvarchar(100)

set @table = 'dbo.table1'
set @stmt = 'insert into ' + @table + ' '
set @stmt = @stmt + 'values (@a, @b, @c)'
set @params = '@a int, @b int, @c int'

exec sp_executesql @stmt, @params, @a=1, @b=2, @c=3

확인

select * from table1

2 .output 파라미터를 적용한 예제

동적 SQL문 내에도 출력(OUTPUT) 파라미터를 선언하고 결과 값을 리턴 받을 수 있다. 저장 프로시저에서 출력 파라미터를 사용하는 것과 동일하게, 선언부와 호출부에 반드시 OUTPUT 키워드를 지정한다.

use northwind

declare @stmt as nvarchar(100)
declare @params as nvarchar(100)
declare @orderret as int

set @stmt = 'select @ordercnt = count(*) from dbo.orders'
set @params = '@ordercnt as int OUTPUT' -- OUTPUT 키워드에 주의

여기도 OUTPUT 키워드를 지정한다.

exec sp_executesql @stmt, @params, @ordercnt = @orderret OUTPUT

확인

select @orderret

지원이 안되는 것들은 다음과 같다

*. sp_executesql은 배치, 저장 프로시저, 트리거처럼 한 배치로 실행된다.

1.동적 SQL문에서는 RETURN 문을 사용할 수 없다

2.로컬 변수를 액세스 할 수 없다

declare @chr char(3)
set @chr = 'abc'

sp_executesql N'PRINT @CharVariable'
GO

3. 현재 데이터베이스가 변경되지 않는다
use pubs
go
sp_executesql N'use northwind'
select * from shippers -- shippers 테이블은 northwind에 있다.
go

전문 개발자및 관리자를 위한 추가 정보

성능 비교
만일, 여러분이 Windows NT/2000의 성능 모니터의 사용법을 알고 있다면 아래 3가지 사용 예에 대한 모니터를 수행하고 각각 Cache Manager상의 활동이 어떻게 다른지를 비교 해 보면 많은 도움이 될 것이다.

아래에 성능 모니터에 모니터링할 관련 오브젝트 및 카운트을 적어 뒀다.

성능 개체
SQL Server:Cache Manager
- 모든 카운터
- 다음 목록에서 인스턴스 선택
_Total
Adhoc Sql Plans
Execution Context
Procedure Plans
기타... (관심이 있다면)

참고
3개의 방법을 개별적으로 테스트할 때, Procedure Cache상에 동일한 플랜이 재 사용되는 것을 방지하기 위해

DBCC FREEPROCCACHE

명령을 사용할 수 있다. 이 명령은 프로시저 캐시에서 모든 요소를 제거한다. 이 작업을 수행해야 Cache Object Counter가 늘어나는 것을 볼 수 있다. 그리고 현재 Cache된 Object에 대한 정보를 보고자 하는 경우 아래의 쿼리를 이용하면 된다.

select * from master..syscacheobjects
where dbid = db_id('northwind')

1. 저장 프로시저 테스트용
DROP PROC dbo.upOrderDetailsQuery
CREATE PROC dbo.upOrderDetailsQuery
@orderid int
AS
select productid, quantity, unitprice from dbo.[order details]
where orderid = @orderid
go
EXEC dbo.upOrderDetailsQuery @orderid = 10248

2. sp_executesql

USE Northwind

declare @stmt as nvarchar(100)
declare @params as nvarchar(100)
set @stmt = 'select productid, quantity, unitprice from '
set @stmt = @stmt + 'dbo.[order details] where orderid=@orderid'
set @params = '@orderid int'

exec sp_executesql @stmt, @params, @orderid=10248
go

3. EXEC() 사용

USE Northwind

declare @stmt as nvarchar(100)
declare @orderid varchar(10)
set @orderid = '10248'
set @stmt = 'select productid, quantity, unitprice from '
set @stmt = @stmt + 'dbo.[order details] where orderid = '+ @orderid

EXEC (@stmt)

반응형

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

UTIL QUERY  (0) 2012.11.06
명세서  (0) 2012.10.04
저장프로시저 찾기  (0) 2012.07.18
테이블 정보확인  (0) 2012.07.18
대기분석용 프로시저  (0) 2012.05.30
반응형

CREATE PROCEDURE [dbo].[usp_HelpStoredProcedureName]
    @vcKeyword varchar(256)
AS
BEGIN
    SET NOCOUNT ON

    SET @vcKeyword = '%' + @vcKeyword + '%';

    SELECT name [Stored Procedure Name]
    FROM sys.objects with (nolock)
    WHERE object_id IN (
                                SELECT object_id
                                FROM sys.sql_modules with (nolock)
                                WHERE definition LIKE @vcKeyword
                                )
    ORDER BY 1 ASC;

    SET NOCOUNT OFF
END

반응형

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

명세서  (0) 2012.10.04
동적 쿼리의 해결사 sp_executesql vs. exec  (0) 2012.08.03
테이블 정보확인  (0) 2012.07.18
대기분석용 프로시저  (0) 2012.05.30
트랜잭션 걸려있는 것들 찾기 transaction  (0) 2012.05.30
반응형

CREATE proc [dbo].[up_tableinfo]
@TABLE_NAME VARCHAR(30)
AS

SELECT       
    [col Name] = C.COLUMN_NAME
    , [Type & Length] = COLUMN_TYPE
    , [Default Value] = COLUMN_DEFAULT
    , [NOT NULL] = CASE WHEN C.IS_NULLABLE = 'NO' THEN 'Y' ELSE '' END
    , PK = ISNULL(K.PK, '')
    , FK = ISNULL(K.FK, '')
    , [Description] = D.COLUMN_DESC
FROM
(
    SELECT 
    TABLE_NAME
    , COLUMN_NAME
    , COLUMN_DEFAULT
    , IS_NULLABLE
    , COLUMN_TYPE = CASE WHEN DATA_TYPE IN ('VARCHAR', 'NVARCHAR', 'char', 'nchar') THEN
    DATA_TYPE + '(' + CONVERT(VARCHAR(10), ISNULL(CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION)) + ')'
    WHEN DATA_TYPE IN ('DECIMAL') THEN
    DATA_TYPE + '(' + CONVERT(VARCHAR(10), NUMERIC_PRECISION) + ', ' + CONVERT(VARCHAR(10), NUMERIC_SCALE) + ')'      
    ELSE DATA_TYPE END
    , ORDINAL_POSITION
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME = @TABLE_NAME
) AS C
LEFT JOIN -- 키정보
(
    SELECT COLUMN_NAME
    , PK = MAX(PK)
    , FK = MAX(FK)
    FROM
    (
        SELECT
        COLUMN_NAME
        , PK = CASE WHEN K.CONSTRAINT_TYPE = 'PRIMARY KEY' THEN 'Y' END
        , FK = CASE WHEN K.CONSTRAINT_TYPE = 'FOREIGN KEY' THEN 'Y' END
        FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS K
        INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS C ON K.CONSTRAINT_NAME = C.CONSTRAINT_NAME
        WHERE K.TABLE_NAME = @TABLE_NAME
    ) AS K
    GROUP BY COLUMN_NAME
) AS K ON C.COLUMN_NAME = K.COLUMN_NAME
LEFT JOIN -- Description 정보
(
    SELECT
    COLUMN_NM = COL_NAME(XP.MAJOR_ID, XP.MINOR_ID) 
    , COLUMN_DESC = CAST(XP.[VALUE] AS NVARCHAR(4000))
    FROM SYS.EXTENDED_PROPERTIES XP 
    WHERE XP.CLASS = 1
    AND  XP.MINOR_ID > 0
    AND XP.MAJOR_ID = OBJECT_ID(@TABLE_NAME) 
    AND XP.NAME IN (N'MS_DESCRIPTION') 
) AS D ON C.COLUMN_NAME = D.COLUMN_NM
ORDER BY C.ORDINAL_POSITION

반응형
반응형

-- +++++++++++++++++++++++++++++++++++++++++++++++++++++
-- WAIT 조사용 프로시저 생성
-- +++++++++++++++++++++++++++++++++++++++++++++++++++++

USE MASTER
GO

IF OBJECT_ID ('AP_GET_WAITSTATS_1') IS NOT NULL
DROP PROC AP_GET_WAITSTATS_1
GO

CREATE PROC AP_GET_WAITSTATS_1
  @TYPE INT = 6
, @GROUP_MIN INT = 3
, @LOGINAME NVARCHAR(256) = NULL
, @NAME NVARCHAR(256) = NULL
, @HOSTNAME NVARCHAR(256) = NULL
, @PROGRAM_NAME NVARCHAR(256) = NULL
, @SQL_HANDLE BINARY(20) = NULL
, @START_TIME SMALLDATETIME = NULL
, @END_TIME SMALLDATETIME = NULL
, @SPID INT = NULL
AS

IF @TYPE <> 6 BEGIN

 ; WITH DATA AS
 (SELECT CONVERT(SMALLDATETIME,FLOOR((CAST(D AS FLOAT) * 24 * 60) / @GROUP_MIN ) * @GROUP_MIN / 24 / 60, 108) TIMEX, LOGINAME, NAME, HOSTNAME, PROGRAM_NAME, SQL_HANDLE, LASTWAITTYPE
   FROM ##TBLWAITS
  WHERE SQL_HANDLE = CASE WHEN @SQL_HANDLE IS NULL THEN SQL_HANDLE ELSE @SQL_HANDLE END
    AND LOGINAME = CASE WHEN @LOGINAME IS NULL THEN LOGINAME ELSE @LOGINAME END
    AND NAME = CASE WHEN @NAME IS NULL THEN NAME ELSE @NAME END
    AND HOSTNAME = CASE WHEN @HOSTNAME IS NULL THEN HOSTNAME ELSE @HOSTNAME END
    AND PROGRAM_NAME = CASE WHEN @PROGRAM_NAME IS NULL THEN PROGRAM_NAME ELSE @PROGRAM_NAME END
    AND SPID = CASE WHEN @SPID IS NULL THEN SPID ELSE @SPID END
    AND D BETWEEN CASE WHEN @START_TIME IS NULL THEN '19750523' ELSE @START_TIME END AND CASE WHEN @END_TIME IS NULL THEN '20790606' ELSE @END_TIME END )
 , PER_WAITTYPE AS
 (SELECT TIMEX, LASTWAITTYPE VAL, COUNT(*) CNT FROM DATA GROUP BY TIMEX, LASTWAITTYPE WITH ROLLUP)
 , PER_LOGINAME AS
 (SELECT TIMEX, LOGINAME, COUNT(*) CNT FROM DATA GROUP BY TIMEX, LOGINAME WITH ROLLUP)
 , PER_DATABASE AS
 (SELECT TIMEX, NAME, COUNT(*) CNT FROM DATA GROUP BY TIMEX, NAME WITH ROLLUP)
 , PER_HOSTNAME AS
 (SELECT TIMEX, HOSTNAME, COUNT(*) CNT FROM DATA GROUP BY TIMEX, HOSTNAME WITH ROLLUP)
 , PER_PROGRAM_NAME AS
 (SELECT TIMEX, PROGRAM_NAME, COUNT(*) CNT FROM DATA GROUP BY TIMEX, PROGRAM_NAME WITH ROLLUP)
 , PER_SQL_HANDLE_RAW AS
 (SELECT TIMEX, SQL_HANDLE, COUNT(*) CNT FROM DATA GROUP BY TIMEX, SQL_HANDLE WITH ROLLUP)
 , PER_SQL_HANDLE AS
 (SELECT TIMEX, CAST(SQL_HANDLE AS SQL_VARIANT) SQL_HANDLE, CNT, QT.TEXT FROM PER_SQL_HANDLE_RAW A OUTER APPLY SYS.DM_EXEC_SQL_TEXT(A.SQL_HANDLE) QT
 )
 SELECT *
   FROM (SELECT * FROM PER_WAITTYPE WHERE @TYPE = 1
   UNION ALL SELECT * FROM PER_LOGINAME WHERE @TYPE = 2
   UNION ALL SELECT * FROM PER_DATABASE WHERE @TYPE = 3
   UNION ALL SELECT * FROM PER_HOSTNAME WHERE @TYPE = 4
   UNION ALL SELECT * FROM PER_PROGRAM_NAME WHERE @TYPE = 5) A
  ORDER BY CASE WHEN TIMEX IS NULL THEN '20790606' ELSE TIMEX END , CNT
 OPTION (RECOMPILE)
END

IF @TYPE = 6 BEGIN
 ; WITH DATA AS
 (SELECT CONVERT(SMALLDATETIME,FLOOR((CAST(D AS FLOAT) * 24 * 60) / @GROUP_MIN ) * @GROUP_MIN / 24 / 60, 108) TIMEX, LOGINAME, NAME, HOSTNAME, PROGRAM_NAME, SQL_HANDLE, LASTWAITTYPE
   FROM ##TBLWAITS
  WHERE SQL_HANDLE = CASE WHEN @SQL_HANDLE IS NULL THEN SQL_HANDLE ELSE @SQL_HANDLE END
    AND LOGINAME = CASE WHEN @LOGINAME IS NULL THEN LOGINAME ELSE @LOGINAME END
    AND NAME = CASE WHEN @NAME IS NULL THEN NAME ELSE @NAME END
    AND HOSTNAME = CASE WHEN @HOSTNAME IS NULL THEN HOSTNAME ELSE @HOSTNAME END
    AND PROGRAM_NAME = CASE WHEN @PROGRAM_NAME IS NULL THEN PROGRAM_NAME ELSE @PROGRAM_NAME END
    AND SPID = CASE WHEN @SPID IS NULL THEN SPID ELSE @SPID END
    AND D BETWEEN CASE WHEN @START_TIME IS NULL THEN '19750523' ELSE @START_TIME END AND CASE WHEN @END_TIME IS NULL THEN '20790606' ELSE @END_TIME END )
 , PER_SQL_HANDLE AS
 (SELECT TIMEX, SQL_HANDLE, COUNT(*) CNT FROM DATA GROUP BY TIMEX, SQL_HANDLE WITH ROLLUP )
 SELECT A.*, SQL_TEXT
   FROM PER_SQL_HANDLE A
   LEFT JOIN ##TBLSQLTEXT B
  ON B.SQL_HANDLE = A.SQL_HANDLE
  ORDER BY CASE WHEN TIMEX IS NULL THEN '20790606' ELSE TIMEX END , CNT
END
GO

IF OBJECT_ID('AP_PUT_WAITSTATS_1') IS NOT NULL
DROP PROC AP_PUT_WAITSTATS_1
GO

CREATE PROC AP_PUT_WAITSTATS_1
@MIN INT = 10
AS

SET NOCOUNT ON
-- SCRIPT BY MINSOUK KIM (SQL SERVER MVP SINCE 2006)
-- DEBUG
-- DECLARE @MIN INT
-- SET @MIN = 1
-- END OF DEBUG
DECLARE @END_TIME DATETIME

SELECT @END_TIME = DATEADD(MINUTE, ABS(@MIN), GETDATE())
SELECT @END_TIME

BEGIN TRY
 DROP TABLE ##TBLWAITS
END TRY BEGIN CATCH END CATCH  

BEGIN TRY
 DROP TABLE ##TBLSQLTEXT
END TRY BEGIN CATCH END CATCH  

SELECT * INTO ##TBLWAITS
  FROM (SELECT TOP 0 CAST(S.LOGINAME AS NVARCHAR(256)) LOGINAME
    , CAST(D.NAME AS NVARCHAR(256)) NAME
    , CAST(S.HOSTNAME AS NVARCHAR(256)) HOSTNAME
    , CAST(S.PROGRAM_NAME AS NVARCHAR(256)) PROGRAM_NAME , S.SQL_HANDLE
    , S.SPID, CONVERT(SMALLINT, S.WAITTYPE) WAITTYPE
    , S.LASTWAITTYPE, S.ECID, S.WAITTIME , S.BLOCKED, GETDATE() D
    FROM MASTER..SYSDATABASES AS D WITH(NOLOCK)
    , MASTER..SYSPROCESSES AS S WITH(NOLOCK)
   WHERE S.CMD<>'AWAITING COMMAND'
     AND S.CMD NOT LIKE '%BACKUP%'
     AND S.CMD NOT LIKE '%RESTORE%'
     AND S.SPID>50
     AND S.SPID<>@@SPID
     AND S.DBID = D.DBID 
   ORDER BY S.SPID
    , S.ECID ASC) A

SELECT * INTO ##TBLSQLTEXT
  FROM (SELECT TOP 0 S.SQL_HANDLE, S.STMT_START, S.STMT_END, CAST('' AS VARCHAR(8000)) SQL_TEXT
    FROM MASTER..SYSDATABASES AS D WITH(NOLOCK)
    , MASTER..SYSPROCESSES AS S WITH(NOLOCK)
   WHERE S.CMD<>'AWAITING COMMAND'
     AND S.CMD NOT LIKE '%BACKUP%'
     AND S.CMD NOT LIKE '%RESTORE%'
     AND S.SPID>50
     AND S.SPID<>@@SPID
     AND S.DBID = D.DBID 
   ORDER BY S.SPID
    , S.ECID ASC) A

WHILE (GETDATE() < @END_TIME) BEGIN
 INSERT INTO ##TBLWAITS
 SELECT S.LOGINAME, D.NAME, S.HOSTNAME, S.PROGRAM_NAME, S.SQL_HANDLE
   , S.SPID, CONVERT(SMALLINT, S.WAITTYPE) WAITTYPE
   , S.LASTWAITTYPE, S.ECID, S.WAITTIME , S.BLOCKED, GETDATE() D
   FROM MASTER..SYSDATABASES AS D WITH(NOLOCK)
   , MASTER..SYSPROCESSES AS S WITH(NOLOCK)
  WHERE S.CMD<>'AWAITING COMMAND'
    --AND S.CMD NOT LIKE '%BACKUP%'
    --AND S.CMD NOT LIKE '%RESTORE%'
    AND S.SPID>50
    AND S.SPID<>@@SPID
    AND S.DBID = D.DBID 
  ORDER BY S.SPID
   , S.ECID ASC

 INSERT INTO ##TBLSQLTEXT (SQL_HANDLE, STMT_START, STMT_END, SQL_TEXT)
 SELECT A.*, C.TEXT
   FROM (SELECT S.SQL_HANDLE, S.STMT_START, S.STMT_END
     FROM MASTER..SYSDATABASES AS D WITH(NOLOCK)
     , MASTER..SYSPROCESSES AS S WITH(NOLOCK)
    WHERE S.CMD<>'AWAITING COMMAND'
      AND S.CMD NOT LIKE '%BACKUP%'
      AND S.CMD NOT LIKE '%RESTORE%'
      AND S.SPID>50
      AND S.SPID<>@@SPID
      AND S.DBID = D.DBID) A
   LEFT JOIN ##TBLSQLTEXT B
  ON B.SQL_HANDLE = A.SQL_HANDLE
  CROSS APPLY SYS.DM_EXEC_SQL_TEXT(A.SQL_HANDLE) C
  WHERE B.SQL_HANDLE IS NULL

 WAITFOR DELAY '00:00:00.100'
END
GO

 

 


-- +++++++++++++++++++++++++++++++++++++++++++++++++++++
-- WAIT 조사용 프로시저 돌리기 
-- +++++++++++++++++++++++++++++++++++++++++++++++++++++

EXEC MASTER.DBO.AP_PUT_WAITSTATS_1 10

-- +++++++++++++++++++++++++++++++++++++++++++++++++++++
-- 다른 세션에서 다음을 확인 한다.
-- +++++++++++++++++++++++++++++++++++++++++++++++++++++

-- 구조 확인용
-- SELECT TOP 10 * FROM ##TBLWAITS
-- SELECT TOP 10 * FROM ##TBLSQLTEXT

 


---- 어떤 WAIT  이 있나?
--EXEC MASTER.DBO.AP_GET_WAITSTATS_1 @TYPE =1
--EXEC MASTER.DBO.AP_GET_WAITSTATS_1 @TYPE =2
--EXEC MASTER.DBO.AP_GET_WAITSTATS_1 @TYPE =3
--EXEC MASTER.DBO.AP_GET_WAITSTATS_1 @TYPE =4
--EXEC MASTER.DBO.AP_GET_WAITSTATS_1 @TYPE =5
--EXEC MASTER.DBO.AP_GET_WAITSTATS_1 @TYPE =6

---- 디테일 정보 확인
--EXEC MASTER.DBO.AP_GET_WAITSTATS_1
--   @TYPE = 1
-- , @GROUP_MIN = 5
-- --, @LOGINAME = 'NB10202-PC\Administrator'
-- --, @NAME = 'TEMPDB'
-- --, @HOSTNAME = 'NB10202-PC'                                                                                                                 
-- --, @PROGRAM_NAME = 'Microsoft SQL Server Management Studio - 쿼리'
-- --, @SQL_HANDLE = 0x01000100FAE6651BF09DF1050000000000000000
-- --, @START_TIME = '2010-01-06 04:21:00'
-- --, @END_TIME = '2010-01-06 04:24:00'

---- +++++++++++++++++++++++++++++++++++++++++++++++++++++
---- 클리어
---- +++++++++++++++++++++++++++++++++++++++++++++++++++++
--BEGIN TRY
-- DROP TABLE ##TBLWAITS
--END TRY BEGIN CATCH END CATCH  

--BEGIN TRY
-- DROP TABLE ##TBLSQLTEXT
--END TRY BEGIN CATCH END CATCH 


돌린 결과는 다음과 같다.


반응형

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

저장프로시저 찾기  (0) 2012.07.18
테이블 정보확인  (0) 2012.07.18
트랜잭션 걸려있는 것들 찾기 transaction  (0) 2012.05.30
데드락 경고 시스템 감지 방법 DeadLock  (0) 2012.05.30
파티션 카탈로그 뷰  (0) 2012.05.22
반응형

1. EXEC SP_LOCK2

CREATE PROC sp_lock2
(
@dbname sysname = NULL,
@spid int = NULL
)
AS
/************************************************************************************
		Copyright © 2001 Narayana Vyas Kondreddi. All rights reserved.
                                          
Purpose:	To display detailed lock information

Written by:	Narayana Vyas Kondreddi
		
Tested on: 	SQL Server 7.0 and SQL Server 2000

Date modified:	August-13-2001 12:00 AM

Examples:

To see all the locks:
EXEC sp_lock2

To see all the locks in a particular database, say 'pubs':
EXEC sp_lock2 pubs

To see all the locks held by a particular spid, say 53:
EXEC sp_lock2 @spid = 53

To see all the locks held by a particular spid (23), in a particular database (pubs):
EXEC sp_lock2 pubs, 23
***********************************************************************************/

BEGIN
SET NOCOUNT ON
CREATE TABLE #lock
(
	spid int,
	dbid int,
	ObjId int,
	IndId int,
	Type char(5),
	Resource char(20),
	Mode char(10),
	Status char(10)
)

INSERT INTO #lock EXEC sp_lock

IF @dbname IS NULL
BEGIN
	IF @spid IS NULL
	BEGIN
		SELECT a.spid AS SPID, 
		(SELECT DISTINCT program_name FROM master..sysprocesses WHERE spid = a.spid) AS [Program Name],
		db_name(dbid) AS [Database Name], ISNULL(object_name(ObjId),'') AS [Object Name],IndId, Type, Resource, Mode, Status
		FROM #lock a
	END
	ELSE
	BEGIN
		SELECT a.spid AS SPID, 
		(SELECT DISTINCT program_name FROM master..sysprocesses WHERE spid = a.spid) AS [Program Name],	
		db_name(dbid) AS [Database Name], ISNULL(object_name(ObjId),'') AS [Object Name],IndId, Type, Resource, Mode, Status
		FROM #lock a
		WHERE spid = @spid
	END
END
ELSE
BEGIN
	IF @spid IS NULL 
	BEGIN
		SELECT a.spid AS SPID,
		(SELECT DISTINCT program_name FROM master..sysprocesses WHERE spid = a.spid) AS [Program Name],		
		ISNULL(object_name(a.ObjId),'') AS [Object Name],a.IndId, 
		ISNULL((SELECT name FROM sysindexes WHERE id = a.objid and indid = a.indid ),'') AS [Index Name],
		a.Type, a.Resource, a.Mode, a.Status
		FROM #lock a
		WHERE dbid = db_id(@dbname)
	END
	ELSE
	BEGIN
		SELECT a.spid AS SPID,
		(SELECT DISTINCT program_name FROM master..sysprocesses WHERE spid = a.spid) AS [Program Name],
		ISNULL(object_name(a.ObjId),'') AS [Object Name],a.IndId, 
		ISNULL((SELECT name FROM sysindexes WHERE id = a.objid and indid = a.indid ),'') AS [Index Name],
		a.Type, a.Resource, a.Mode, a.Status
		FROM #lock a
		WHERE dbid = db_id(@dbname) AND spid = @spid			
	END
END

DROP TABLE #lock

END



2.

DECLARE @cTime INT
DECLARE @checkTime DATETIME
SET @cTime = 1
SET @checkTime = DATEADD(MINUTE, -@cTime, GETDATE())

select spid, kpid, blocked, a.dbid, login_time, last_batch, open_tran, status, hostname, program_name, sql_handle, b.text
from master.dbo.sysprocesses A cross apply SYS.DM_EXEC_SQL_TEXT(a.sql_handle) B
where a.open_tran > 0 and A.last_batch < @checkTime


3.
select st.session_id, datediff(minute, last_request_end_time, getdate()), text, last_read, last_write, getdate(), *
from sys.dm_tran_session_transactions st
    inner join sys.dm_exec_sessions es
        on es.session_id = st.session_id
    inner join sys.dm_exec_connections ec
        on ec.session_id = es.session_id
    cross apply sys.dm_exec_sql_text(ec.most_recent_sql_handle)
where datediff(minute, last_request_end_time, getdate()) > 1

반응형
반응형

USE DBA
GO

--추적 트레이스를 시작
DBCC TRACEON(1222, 1204, -1)
GO

--교착 상태를 캡쳐할 테이블 생성
CREATE TABLE DeadlockCheck ( DeadlockInfo XML, CheckTime DATETIME);
GO

--프로시저 생성
CREATE PROCEDURE [dbo].[Up_DeadLockCheck_Ins]
AS
SET NOCOUNT ON

INSERT INTO [dbo].[DeadlockCheck] (DeadlockInfo, CheckTime)
SELECT CAST(REPLACE(REPLACE(TBLX.XEvent.value('(data/value)[1]', 'varchar(max)'), '<victim-list>', '<deadlock><victim-list>'),
    '<process-list>', '</victim-list><process-list>') as xml) as DeadlockInfo
    , GETDATE() CheckTime
FROM (
    select CAST(target_data as xml) as TargetData
    from sys.dm_xe_session_targets st join sys.dm_xe_sessions s
        on s.address = st.event_session_address
    where name = 'system_health') as Data
        cross apply TargetData.nodes('//RingBufferTarget/event') as TBLX(XEvent)
WHERE TBLX.XEvent.value('@name', 'varchar(4000)') = 'xml_deadlock_report'


--데드락 잡
use msdb
go

exec sp_add_job @job_name = '[경고] 데드락 발생'
exec sp_add_jobstep @job_name = '[경고] 데드락 발생'
    , @step_id = 1
    , @step_name = '데드락 발생'
    , @subsystem = 'TSQL'
    , @command = 'EXEC dbo.Up_DeadLockCheck_Ins'
    , @database_name = 'DBA'

exec sp_add_jobserver @job_name = '[경고] 데드락 발생', @server_name = N'(local)'
GO

--데드락 경고
EXEC sp_add_alert
    @name = '[경고] 데드락발생경고'
    , @message_id = 0
    , @severity = 0
    , @enabled = 1
    , @delay_between_responses = 0
    , @include_event_description_in = 0
    , @category_name = N'[Uncategorized]'
    , @performance_condition = N'SQLServer:Locks|Number of Deadlocks/sec|_Total|>|0'
    , @job_name = '[경고] 데드락 발생'

반응형
반응형

* 개별 파티션 함수에 대한 정보

 - sys.partition_functions


* 파티션 함수의 개별 매개 변수에 대한 정보

 - sys.partition_parameters


* 파티션 함수의 경계 값에 대한 정보

 - sys.partition_range_values


* 데이터베이스에 있는 모든 파티션 구성표에 대한 정보

 - sys.partition_schemes

 - sys.data_spaces


* 개별 파티션 구성표에 대한 정보

 - sys.destination_data_spaces


* 데이터베이스에 있는 모든 파티션에 대한 정보

 - sys.partitions


* 테이블 또는 인덱스에 대한 분할 정보

 - sys.tables

 - sys.indexes

 - sys.index_columns

반응형
반응형

자동화 처리
CREATE PROC usp_Partition_SlidingWindowProcess

AS

/* 이미 파티션이 추가가됐는지 확인한다.*/

/* 먼저 추가될 파티션DB의 파일그룹을 생성한다.
   현재 예제에서 2011-04월까지의 파티션이 존재하므로 이후의 파티션을 자동으로 추가하는 프로시저이다.
   경계값 및 파일그룹명은 시스템에 맞게 수정해야 한다.
*/

DECLARE  @FileGroupName  CHAR(2)
    ,@strSQL   VARCHAR(1000)
    ,@PartitionRange VARCHAR(10)

SET @FileGroupName = REPLACE(STR(DATEPART(MM,DATEADD(MM,1,'2011-04-01 00:00:00.000')),2),' ','0');

SET @PartitionRange = CONVERT(VARCHAR(8),DATEADD(MM,1, '2011-04-01 00:00:00.000'),121) + '01'

SET @strSQL = 'USE Partition_DB

ALTER DATABASE Partition_DB ADD FILEGROUP Partition_' + @FileGroupName + ''

EXEC(@strSQL)

SET @strSQL = ''

/* 추가된 파일그룹에 매핑할 파일을생성한다. 파일사이즈는 목적에맞게 설정해주면 된다. */

SET @strSQL = 'USE Partition_DB
ALTER DATABASE Partition_DB ADD FILE (NAME= ''Partition_'+@FileGroupName+'''
, FILENAME = ''D:\DBFile\Partition_'+@FileGroupName+'.ndf'') TO FILEGROUP Partition_'+@FileGroupName+'';
EXEC(@strSQL)

/* 파티션스키마의 다음범위를 지정한다. 현재월까지분리가돼 있고 다음은 5월범위 가되야한다. */
SET @strSQL = 'USE Partition_DB
ALTER PARTITION scheme PS_Date NEXT used Partition_'+@FileGroupName+''
EXEC(@strSQL) 

/* 파티션함수의 마지막범위를 분리한다. */
SET @strSQL = 'USE Partition_DB
ALTER PARTITION FUNCTION PF_Date() SPLIT RANGE('''+@PartitionRange+''')'
EXEC(@strSQL) 

GO

--[스크립트7-186] 슬라이딩 윈도우 처리 프로시저 실행
EXEC dbo.usp_Partition_SlidingWindowProcess
GO

반응형

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

데드락 경고 시스템 감지 방법 DeadLock  (0) 2012.05.30
파티션 카탈로그 뷰  (0) 2012.05.22
파티션 관련 정보  (0) 2012.05.22
인덱스 레벨별 사이즈 비교  (0) 2012.05.10
복구모델 확인  (0) 2012.05.03
반응형

SELECT
    OBJECT_NAME(t2.object_id) TableName
    , t1.partition_number
    , t2.index_id
    , t7.name
    , rows
    , CASE boundary_value_on_right WHEN 1 THEN 'less than'
        ELSE 'less than or equal to'
        END as 'comparison'
    , value
FROM sys.partitions t1
    INNER JOIN sys.indexes t2
        ON t1.object_id = t2.object_id AND t1.index_id = t2.index_id
    INNER JOIN sys.partition_schemes t3
        ON t2.data_space_id = t3.data_space_id
    INNER JOIN sys.partition_functions t4
        ON t3.function_id = t4.function_id
    LEFT OUTER JOIN sys.partition_range_values t5
        ON t4.function_id = t5.function_id AND t1.partition_number = t5.boundary_id
    INNER JOIN sys.destination_data_spaces t6
        ON t6.partition_scheme_id = t3.data_space_id AND t6.destination_id = t1.partition_number
    INNER JOIN sys.filegroups t7
        ON t6.data_space_id = t7.data_space_id
WHERE t2.object_id = object_id('TBL_Partition')
ORDER BY t1.partition_number

반응형
반응형

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[TIndexDep]') AND type in (N'U'))
    DROP TABLE dbo.TIndexDep
GO

CREATE TABLE dbo.TIndexDep
(
    col1    INT,
    col2    CHAR(20),
    col3    CHAR(900),
    col4    CHAR(7000)
)
GO

SET NOCOUNT ON

DECLARE @i INT = 1
WHILE (@i < 500000)
BEGIN
    INSERT INTO dbo.TIndexDep
        SELECT @i, CAST(@i as CHAR(20)), CAST(@i as CHAR(900)), CAST(@i as CHAR(7000))
        SET @i += 1
END
SET NOCOUNT OFF


SELECT * FROM TIndexDep

CREATE NONCLUSTERED INDEX IX_col2 ON dbo.TIndexDep(col2)

CREATE NONCLUSTERED INDEX IX_col3 ON dbo.TIndexDep(col3)



SELECT INDEXPROPERTY(OBJECT_ID('TIndexDep'), 'IX_col2', 'INDEXDEPTH')
SELECT INDEXPROPERTY(OBJECT_ID('TIndexDep'), 'IX_col3', 'INDEXDEPTH')

SELECT index_depth, index_level, record_count, page_count
FROM sys.dm_db_index_physical_stats(DB_ID(), OBJECT_ID('TIndexDep'), 2 /* IX_col2 */, NULL, 'DETAILED')

SELECT index_depth, index_level, record_count, page_count
FROM sys.dm_db_index_physical_stats(DB_ID(), OBJECT_ID('TIndexDep'), 3 /* IX_col3 */, NULL, 'DETAILED')

반응형

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

슬라이딩 윈도우 기법을 이용한 파티션 관리  (0) 2012.05.22
파티션 관련 정보  (0) 2012.05.22
복구모델 확인  (0) 2012.05.03
자신의 데이터베이스만 보이게 하기  (0) 2012.03.20
커서 cursor  (0) 2012.03.20
반응형

SELECT name, (select databasepropertyex(name, 'RECOVERY')) Recoverymodel
FROM master..sysdatabases
ORDER BY name;

반응형
반응형
http://www.sqler.com/index.php?mid=bSQLQA&document_srl=484547

sql 8.0 은 meta data 를 고쳐야 하고
sql 9.0 이상은 설정이 가능하다.

http://technet.microsoft.com/ko-kr/library/ms189077.aspx


DROP DATABASE DB1
GO

DROP DATABASE DB2
GO

SELECT 'KILL '+CAST(SPID AS VARCHAR) FROM SYSPROCESSES WHERE SPID > 50 AND LOGINAME ='DB1USER'

DROP LOGIN DB1USER
GO

CREATE DATABASE DB1
GO
CREATE DATABASE DB2
GO

CREATE LOGIN [DB1USER] WITH PASSWORD=N'1234', DEFAULT_DATABASE=[MASTER]
GO

ALTER LOGIN DB1USER ENABLE
GO

DENY VIEW ANY DATABASE TO DB1USER
GO

USE DB1
GO

EXEC SP_CHANGEDBOWNER 'DB1USER'
GO

-- db1user 로 로그인해보면 자기 데이터베이스만 보임
-- 아래는 참고

--grant view any database to db1user
--deny view any database to db1user
--grant view any database to public
--revoke view any database from public




열이글~


use master
go

create database db_1
create database db_2
create database db_3

 

CREATE LOGIN db_2 WITH PASSWORD='1', DEFAULT_DATABASE=db_2

 

use db_2
go
ALTER AUTHORIZATION ON DATABASE::db_2 to db_2

 

use db_3
go
ALTER AUTHORIZATION ON DATABASE::db_3 to db_2

 

use master
go

deny view any database to db_2

 

-- REVOKE VIEW ANY DATABASE FROM public 방법보다 발전(?)함.

-- 하나 계정으로 여러개 원하는 DB 목록 보이게 가능
-- 단점 하나 DB에 여러 계정 설정 불가능. master, tempdb 가 목록에 나옴.
반응형

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

인덱스 레벨별 사이즈 비교  (0) 2012.05.10
복구모델 확인  (0) 2012.05.03
커서 cursor  (0) 2012.03.20
암호화된 텍스트를 갖는 개체들의 이름과 형식 찾기  (0) 2012.03.12
SchemaBinding 체크 확인  (0) 2012.03.12
반응형
static -> tempdb에 저장 , 변경된 내용 볼 수 없음  @@FETCH_STATUS = 0

keyset -> tempdb에 키만 저장, 변경된 내용 볼수 있음.
    where cust_balance > 100000절이 있다고 가정할 때
      cust_id 값이 7, 12, 18, 24, 56인 행들이 이 조건을 만족한다고 가정하면 가져오기 작업이 수행될 때마다 이 키값들이 사용됨. 즉
      cust_id in (7, 12, 18, 24, 56) 으로 가져옴. 
@@FETCH_STATUS = -2 (행이 더 이상 존재하지 않는다는 것을 나타냄)
keyset 커서를 사용하려면 커서를 위한 select문에서 사용된 모든 테이블에 고유 인덱스가 존재해야 함.

동적커서(Dynamic) -> 동적커서는 where cust_id in (12, 18, 24, 56, 7) 형식으로 가져오지 않고 where cust_balance > 100000 형식으로 가져온다. 즉, 변경 사항이 그대로 반영되어 나타난다.(단 Fetch 작업을 수행할 때만)

order by 절과 일치하는 키들이 인덱스에 포함되어 있을 때만 order by 절을 사용하여 선언된 커서가 동적일 수 있다.
이러한 인덱스가 존재하지 않는다면 커서는 자동으로 키셋 커서나 정적 커서로 바뀐다. 앞에서도 언급했듯이 키셋 커서를 얻기 위해서는
고유 인덱스를 갖고 있는 칼럼이 테이블에 존재할 필요가 있다. 따라서, 고유 인덱스가 존재하고 이 인덱스가 order by에 있는 칼럼에 존재하지 않는다면 키셋 커서를 얻는다.
order by 와 일치하는 인덱스가 없고 어떤 칼럼에도 고유 인덱스가 없다면 커서는 정적 커서로 바뀐다.
반응형
반응형
select name, type
from syscomments c join sysobjects o
    on o.id = c.id
where encrypted = 1
반응형

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

자신의 데이터베이스만 보이게 하기  (0) 2012.03.20
커서 cursor  (0) 2012.03.20
SchemaBinding 체크 확인  (0) 2012.03.12
성능 모니터(perfmon.exe) 관련 자료 2  (0) 2012.03.06
성능 모니터(perfmon.exe) 관련 자료1  (0) 2012.03.06
반응형
SchemaBinding 체크 확인

select obj_name = SUBSTRING(OBJECT_NAME(d.id), 1, 20),

        dep_obj = SUBSTRING(OBJECT_NAME(d.depid), 1, 20),
        col_name = SUBSTRING(name, 1, 15),
        IsSchemaBound = CASE deptype WHEN 1 THEN 'Schema Bound'
                                    ELSE 'Free' END
from sysdepends d join syscolumns c
        on d.depid = c.id and d.depnumber = c.colid
반응형
반응형

전에 작성한 자료는 주로 지표에 대해서 정리해 보았구요, 이번에는 성능 모니터 구동 후 취합 된 자료와 수치들을 사용하는

적용 방법에 대해서 한번 보겠습니다.  구슬을 서말 만들었으니 꿰어야 겠네요. ^^;;



[그림 1] 성능 모니터 화면

 

그림 1에서 보면 화면이 좌우로 구분되어 있는데, 좌측 화면의 카운터 로그를 클릭해보면 모니터 하기위해 만들어져 있는 체크 리스트가 나옵니다.  대부분 System Overview 만 있는데, 추가하는 방법은 다음과 같습니다.

 



[그림 2] 우측 화면에서 마우스 우측 버튼을 눌러 '새 로그 설정' 선택

 

 



[그림 3] '새 로그 설정' 선택 후 이름 정의

 



[그림 4] 로그명을 123 으로 한 다음 속성 창 또는 등록정보 창을 열러 성능 모니터링 할 카운터 또는 개체 추가

 

여기까지 끝나고 나면 바로 성능 모니터링이 되고 있음을 알수 있습니다.

콘솔 루트의 시스템 모니터를 마우스로 누르면 그래프가 나오니까요. ^^

 


.

[그림 7] 성능 모니터에서 시스템 모니터링 되고 있는 화면

 

 

 



[그림 8] 성능 모니터 저장 파일 위치 선정

 

여기서 취합 된 값들이 저장되어 있는 로그 파일의 위치를 변경 또는 재지정 하실때는 카운터 로그에 있는 '123'을 선택 한 다음,

속성 창 또는 등록정보 창을 열고 로그파일 텝에서 구성을 누르면 폴더위치를 재 지정 할 수 있습니다.

 

 



[그림 9] 성능 모니터 결과 파일 폴더 보기

 

저는 개인적으로 이지파일, 콤마 구분으로 해서 엑셀로 열고, 이를 차트로 만들어 보고 있습니다.

아무래도 엑셀로 하게되면 다양한 그래프와 구성이 가능 하기 때문에 QA 업무 보고서와 Q-Gate 진행 시 시각적인 효과에 도움이

많이 되죠. ^^

 

작년에 마무리 할려고 한다 한다 하던 작업 중 하나를 오늘 아침에 후다닥 해치웠네요.  ^^;;

 

나름 간단하게 제가 잊어 먹으면 또 볼려고 정리한 거니까 혹시 잘못된 점이나 팁이 있으신 분은 답글로 알려주세요.

 

저도 참고 하죠 ^^

 

그럼


반응형

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

암호화된 텍스트를 갖는 개체들의 이름과 형식 찾기  (0) 2012.03.12
SchemaBinding 체크 확인  (0) 2012.03.12
성능 모니터(perfmon.exe) 관련 자료1  (0) 2012.03.06
PAGEIOLATCH_SH  (0) 2012.03.05
에러메시지  (0) 2012.03.05
반응형

윈도우즈 환경에서 테스트 하는 경우, 마이크로소프트에서 제공하는 성능모니터 만큼 적당한게 없는 것 같아서,

일단 필요한 내용을 검색 후 테스트 해 보고 정리합니다.

그냥 제가 정리해놓고 계속 사용하면서 업데이트 하도록 하겠습니다.  원래, 자기가 써보지 않으면

절대로 알수 없는 게 이 분야의 속성이죠...  모르면서 아는체 하면 항상 강호의 고수에게 당하는 법... ^^;;

하수가 정리하는 거니까 잘못된 부분에 대해서는 날카로운 지적을 부탁드립니다.... -_-;;;

2005년도에 작성된 내용을 보면서 일단 정리 하고, 제가 체크를 좀더 해보고 있습니다...  안 맞는 부분도 약간 있는 듯 하더군요...

뭐, 제가 틀렸을 수도 있습니다....

 

 

성능 모니터 주요 체크 카운터

 

1. 메모리 사용량
1.1 memory

시스템 운영에서 사용 가능한 실제 총 메모리를 측정하고 서버에서 모든 프로세스와
응용 프로그램을 실행하는데 필요한 메모리와 비교하십시오.  적어도 최고 사용 상태에서
사용할 수 있는 메모리의 10%를 유지 하십시오.  기본적을 IIS 5.6은 서버 컴퓨터에서
다른 응용 프로그램을 실행하는데 사용할 수 있는 메모리의 나모지를 남겨두고 파일 캐쉬에서
사용 할 수 있는 메모리의 50%까지 사용한다는 점을 유의 하십시오.  이것이 지속적으로 4M 이하로
떨어진다면 더 많은 메모리의 설치를 심각하게 고려해 봐야 합니다.

 

1) available Kbytes
- 사용 가능한 메모리 량: 전체 시스템의 메모리 대비 20% 이상

 

2) Page Faults / sec
- 초당 시스템에서 일어나는 페이지 오류의 초당 평균 수
   0에 가까울 수록 좋으며, 2이상의 페이지 오류가 발생하면 메모리 추가를 고려
=> 5초이상 지속되는 하드 페이지 실패는 RAM이 부족하다는 메시지로 중요한 표시입니다.
   메모리 장애를 나타내는 다른 카운터로는 Memory:Page input/sec,
   Memory:Page reads/sec, Memory:pages/sec 이 있습니다.

 

3) Page / sec
- 초당 시스템에 의해서 디스크에서 읽거나 디스크로 쓴 페이지 평균값
  (5보다 작을 것을 권장(?))

 

4) cache Fault /sec
- cache fault는 cache manager가 즉각적인  캐쉬에서 페이지를 찾지 못할때 발생

 

5) process : working set / SQL Server 인스턴스
- SQL 서버가 사용하는 메모리량, 5M 보다 높아야 한다.

 

6) committed Bytes
- 최고 작업 기간 동안 허용하는 비교치를 특정 시간동안 추적해야 합니다.  적어도
4M의 메모리 또는 커밋된 메모리가 사용할 수 있는 메모리의 5% 이상이 항상 있어야
합니다.

 

2. CPU 사용량

2.1 Processor


1) % Processor time
CPU 사용율로 75%가 넘지 않을 것을 권장(이후 문제 발생 가능성 높음)

 

2) % User Time
응용 프로그램이 시용한 CPU 사용률

 

2.2 System


1) Processor Queue length
프로세서 대기열에 있는 스래드 수 : 2보다 작아야 한다.

 

2) Context Switches / sec
컴퓨터의 모든 프로세서가 한 스레드에서 다른 스레드로 전환한 횟수.
CPU 당 5000이 넘게 되면, resource Contention Problem 발생

 

3. Physical Disk
3.1 Physical Disk


1) % Disk Time (Physical % Logical)
- 지속적인 시간동안 55%를 넘지 않아야 한다.
  선택한 디스크가 일기 및 스기 요청을 제공하는데 사용되는 경과 시간 비율입니다.
  Physical Disk와 함께 Avg. Disk Queue Length는 디스크 드라이브 장애를 나타내는 중요한
  표시입니다.  명령줄 유틸리티 diskperf /y 를 실핸한 후에 디스크 카운터를 추격해야 합니다.

 

2) Avg. Disk Queue Length
- 대기열의 대기수 : 최고 2를 넘지 않을 것을 권장
  디스크가 읽기와 스기 요청을 수용할 정도로 빠르지 않으면 해당 요청은 대기열에 넣게 됩니다.
  Physical Disk: % Disk Time은 85% 이상이고, avg Disk queue length는 둘 이상이고,
  RAM 의 부족으로 디스크 작업이 이루어 질수 없는 경우 디스크에 병목 현상이 발생할 수 있습니다.
  Physical Disk에 포함된 디스크 트래픽을 관찰 할수 있는 다른 카운터로 Disk Reads/sec,
  Disk writes/sec, SQL Server Log writes/sec 등을 들수 있습니다.

 

3) Avg. Disk Read Queue Length
- 대기열의 읽기요청 대기수

 

4) Avg. Disk Write Queue Length
- 대기열의 쓰기 요청 대기수

 

4. SQL 성능
4.1 SQL Server


1) Cache Manager / Cache Hit Ratio
- 캐쉬 적중률 : 90% 이상 권장(미만 시 메모리 추가, OLTP 시스템에서는 99% 권장)

 

2) Buffer manager / Buffer Cache Hit Ratio
- 캐쉬 정중률 : 90% 이상 권장

 

3) Databases / Transactions/sec
- DB에 있는 모든 데이타 파일의 총 크기

 

4) Buffer manager / Checkpoint pages/sec
- 검사점에 의한 플러쉬된 페이지 수

 

5) Access Methods / skipped ghosted records/sec
- 고스트된 레코드 수

 

6) Access Methods / Page Splits/sec
- 페이지 스플릿 발생 수

 

7) SQL Statistics / SQL Compilations/sec
- 초당 컴파일 수

 

8) SQL Server General Statistics/User Connection
- 현재 연결된 사용자 수 : Maximum Worker Threads = 255

 

9) SQL Server : Cache Hit Ratio
- 이것은 SQL 서버가 디스크에 액세스하는 것에 대한 캐쉬에서 데이타를 찾는 시간에
  대한 비율입니다.  80%보다 적은 캐쉬 적중률은 SQL Server에 RAM이 부족함을 나타냅니다.
  시스템에 RAM이 많이 있다고 해도 SQL Server에 대한 충분한 RAM이 할당되지 않았다면
  이러한 문제가 발생할 수 있습니다.   SQL 서버에 보다 많은 RAM을 제고하려면 sp_configure
  저장된 프로시저 및 SQL Server Enterprise Manager를 사용하십시오.

 

5. 기타


1) Active server Page, Requests Queued
- 이것은 대기열에서 서비스를 기다리는 요청수를 모니터링합니다. 
스트레스 상황에서 지연된 요청수가 상당히 증가할 경우 프로세서 사용율은 비교적 낮게 남아있고,
이것은 스크립트가 처리할수 있는 것보다 많은 호출을 수신하는 COM 개체를 호출하고 있다느 표시입니다. 
이러한 경우에 ASP에서 호출된 COM 개체는 일반적으로 장애가 됩니다.

 

2) System : >% Total Processor Time
- 이것은 프로세서가 사용 중인 시간에 대한 비율입니다.  이 카운터가 지속적으로 80% ~ 100% 사이에서
실행되고 있을때, CPU 병목 현상의 중요한 표시가 됩니다.  이때는 프로세서 추가 설치를 고려해 보십시오.

 

3) System : Processor Queue Length
- 이것은 프로세서 주기를 기다리며 대기하는 스레드 수의 순간적인 계산(평균 아님)입니다.
  둘 이상으로 지속되는 프로세서 대기열 길이는 일반적으로 프로세서 정체를 나타냅니다.
  보다 많은 프로세서의 설치를 고려하십시오.

 

4) SQLServer - Locks : Total Blocking Locks.
- 차단 잠금 수가 높으면 데이터 베이스에서 핫스폿을 나타냅니다.

 

5) Process : Private Bytes.
- 이 프로세스가 할당한 현재 바이트 수는 다른 프로세스와 공유할수 없습니다.
  시스템이 특정 시간동안 성능이 떨어지는 경우에 이 카운터는 메모리 누출의 좋은 표시가 될 수 있습니다.

 

6) Thread : Context Switches / sec : Inetingo => Thread#
- 프로세서 당 스레트 또는 스레드 출의 최대 수를 측정합니다.  너무 많은 컨텍스트 전환을 하지 않았는지
  확인 하려면 이 카운터를 모니터링 해야 합니다.  컨텍스트 전환에 대해서는 심각하게 고려해야 합니다.
반응형

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

SchemaBinding 체크 확인  (0) 2012.03.12
성능 모니터(perfmon.exe) 관련 자료 2  (0) 2012.03.06
PAGEIOLATCH_SH  (0) 2012.03.05
에러메시지  (0) 2012.03.05
SQL Server 2005의 데이터베이스 미러링  (0) 2012.02.29

+ Recent posts

반응형