BLOG main image
분류 전체보기 (45)
SQL Server 이야기 (45)
일상 (0)
Visitors up to today!
Today hit, Yesterday hit
daisy rss
tistory 티스토리 가입하기!
'SQL Server 이야기'에 해당되는 글 45건
2008. 9. 25. 14:47
이전에 포스팅한 에서 소개한 자료를 받으시면 백서사이에 아래와 같은 파일이 있습니다.
"SQL Server 2008의 새로운 기능 - part 1.pdf"

SQL Server 2008의 새로운 기능중에 하나인 XEVENT로 CHECKPOINT에 따른 쿼리 응답시간 영향에 대해 적어보았습니다.

참고하세요~

송 혁, SQL Server MVP
sqler.pe.kr // sqlleader.com
hyoksong.tistory.com // nexondbteam.tistory.com
2008. 9. 25. 14:37
언제부터 공개되었는지는 모르겠지만, SQL Server 2008 사이트가 공개되었습니다.
아래 링크를 보시면 여러 백서(한글화된 것도 꽤있더라구요) 및 도움 될만한 정보를 얻을 수 있습니다.

백서의 경우 간단하게 하나의 압축 파일로 받으시려면 중간쯤에 있는 Start Pack 다운받기 배너를
통해 한방에 받으실 수 있습니다.
http://www.microsoft.com/korea/sqlserver/2008/default.aspx




송 혁, SQL Server MVP
sqler.pe.kr // sqlleader.com
hyoksong.tistory.com // nexondbteam.tistory.com
2008. 8. 14. 17:22
얼마전 SQL Server 2008 한글 RTM이 나왔다고 해서
기념으로 설치 과정을 포스팅해 봅니다.ㅎㅎ

설치 하는 부분도 이전 버전보다 전체적으로 나아진 느낌이고
전체적으로 깔끔 하네요~

송 혁, SQL Server MVP
sqler.pe.kr // sqlleader.com
hyoksong.tistory.com // nexondbteam.tistory.com

사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
2008. 8. 5. 22:54


제목 : SQL Server 2008 - 새로운 DMV sys.dm_os_process_memory

SQL 프로세스의 메모리 상태에 대해서 보여주는 DMV입니다.
기존의 DBCC MEMORYSTATUS와 같은 SQL의 내부 메모리 개체에 대해서 보여주는게 아닌
OS입장에서의 프로세스 메모리에 대해서 보여줍니다.

x64환경이 보편화되어 이전보다 메모리에 대한 이슈가 있는 시점에
보다 쉽게 현재 문제 및 현재 상태에 대해서 파악 할 수 있을것 같습니다.

사용자 삽입 이미지

-- 아래는 온라인 설명서에서 발췌
SQL Server 프로세스 공간에 소요되는 대부분의 메모리 할당은 이러한 할당을 추적 계산하도록 허용된 인터페이스를 통해 제어됩니다.

그러나 메모리 할당은 내부 메모리 관리 루틴을 거치지 않는 SQL Server 주소 공간에서 수행될 수도 있습니다. 값은 기본 운영 체제 호출을 통해 얻습니다. 이러한 값은 잠긴 페이지 할당 또는 대용량 페이지 할당을 조절하는 경우를 제외하고는 SQL Server 내부 메서드에 의해 조작되지 않습니다.

메모리 크기를 나타내는 모든 반환 값은 킬로바이트(KB) 단위로 표시됩니다. total_virtual_address_space_reserved_kb 열은 virtual_memory_in_bytes from sys.dm_os_sys_info 중복입니다.

다음 표에서는 프로세스 주소 공간의 전체적인 구조를 보여 줍니다.

이름

데이터 형식

설명

physical_memory_in_use

bigint

운영 체제에서 보고한 내용에 대용량 페이지 AWE API 사용하여 수행된 추적된 할당을 더한 프로세스 작업 집합(KB)입니다.

large_page_allocations_kb

bigint

대용량 페이지 API 사용하여 할당된 물리적 메모리입니다.

locked_page_allocations_kb

bigint

AWE API 사용하여 할당된 물리적 메모리입니다.

total_virtual_address_space_kb

bigint

가상 주소 공간에서 사용자 모드 부분의 크기입니다.

virtual_address_space_reserved_kb

bigint

물리적 페이지에 커밋 또는 매핑되지 않은 가상 주소 예약의 크기입니다.

virtual_address_space_committed_kb

bigint

물리적 페이지에 커밋 또는 매핑된 가상 주소 크기입니다.

virtual_address_space_available_kb

bigint

현재 사용 가능한 가상 주소 공간의 크기입니다.

page_fault_count

bigint

SQL Server 프로세스에서 발생한 페이지 폴트 수입니다.

memory_utilization_percentage

int

작업 집합에 있는 커밋된 메모리의 비율입니다.

available_commit_limit_kb

bigint

프로세스에서 커밋할 있는 메모리의 크기입니다.

process_physical_memory_low

bit

프로세스가 물리적 메모리 부족 알림에 응답합니다.

process_virtual_memory_low

bit

가상 메모리 공간이 부족한 것으로 감지되었습니다.


송 혁, SQL Server MVP
sqler.pe.kr // sqlleader.com
hyoksong.tistory.com // nexondbteam.tistory.com
2008. 8. 5. 22:37

요즘 이리저리..정신 없는 날 들의 연속이라...
포스팅을 제대로 못하고 있네요...
이번에 적어본 내용은 SQL Server 2008의 새로운 기능에 대한 .. DW환경에서의 이점을 줄 수 있는..
쉽게 읽어볼 수 있는 주제인듯 합니다.


제목 : SQL Server 2008의 새로운 기능 - Star Join query optimization(multiple bitmap filters)

 

많은 DW 시스템은 Star 스키마로 구성 되어있으며, 이러한 스타 스키마로 구성된 대량의 팩트 테이블과 많은 차원 테이블에 대해서 데이터를 검색 하기 위해서는 많은 리소스 및 시간이 소요 됩니다.

이러한 많은 시간과 리소스에 대해서 어느 정도의 보완점이 될 수 있는 기능으로써 SQL Server 2008에서 새로운 기능으로 Star join query optimization을 지원하고 있습니다.

 

SQL Server 2008에서 Star Join이 추가된다고 해서 특별히 다른 물리연산자가 추가된 것은 아니며, 추가된 구문도 있지 않습니다.

여기서는 이 기능에 대해서 SQL Server 2005와 비교하여 실행계획이 어떻게 변경이 되었는지 확인해 보려고 합니다.


그리고!! 중요한 것은 Enterprise Edition에서만 지원합니다.

 

BOL에서는 Star join query optimization에 대해서 “비트맵 필터링을 통한 데이터 웨어하우스 쿼리 성능 최적화” 라는 제목으로 소개를 하고 있습니다.

 

비트맵은 SQL Server 2008 이전에도 존재했던 물리 연산자 이며 병렬 Hash, Merge 연산자에서만 사용될 수 있는 연산자 입니다.

그리고 SQL Server 2008에서 지원한다는 Star Join 쿼리 향상도 비트맵 연산자를 통해서 처리되고 있습니다.

그렇다면 기존에도 있는 연산자인데 왜!! 무엇을 지원한다는 것일까요?

 

SQL Server 2005 플랜과 2008플랜으로 무엇이 변경이 되었는지 아래에서 살펴보도록 하겠습니다.

 

아래는 SQL Server 2005의 실행 계획이며, 하나의 팩트 테이블과 두 개의 차원테이블을 조인한 실행 계획입니다.

우선 DimCustomer 테이블을 읽어서 비트맵을 생성합니다.

그리고 DimProduct 테이블을 읽어서 비트맵을 생성하고 팩트 테이블을 읽어 병렬연산자(Repartition Streams)에서 위 DimProduct에서 생성된 비트맵을 바탕으로 필터조건을 주어 데이터 양을 줄이는 것을 볼 수 있습니다.

? 위에서 만든 DimCustomer의 비트맵도 같이 필터 조건을 주어 처리하면 처음부터 보다 적은 데이터 양으로 처리 할 수 있을 것인데, 왜 하나의 비트맵만..사용했을까요?

그럼 아래 SQL Server 2008의 실행계획을 보도록 하겠습니다.

 

사용자 삽입 이미지

2005 플랜과 유사한 모습이며 여기서도 DimCustomer, DimProduct 테이블에 대해서 비트맵을 생성하는 것을 볼 수 있습니다.

하지만 팩트 테이블 스캔 연산자에서 “조건자” 부분을 보시면 위에서 생성된 비트맵 두 개를 가지고 테이블 스캔시에 필터를 하는 것을 확인 할 수 있습니다.

 

위 플랜과 차이점은 두 개 이상의 비트맵에 대해서 테이블 스캔시 Bitmap을 기반으로 필터를 하는 것입니다.

SQL Server 2005의 경우에는 하나의 비트맵으로 병렬연산자(Repartition Streams)에서 필터 조건을 주었습니다.

테이블 스캔시 필터를 하고, 여러 비트맵을 가지고 처리하기에 위 SQL Server 2005보다 좋은 성능을 가져올 수 있을 것 입니다.

 

PROBE([Opt_Bitmap1007],[TEST].[dbo].[FactSales].[ProductKey] as [F].[ProductKey],N'[IN ROW]') AND PROBE([Opt_Bitmap1008],[TEST].[dbo].[FactSales].[CustomerKey] as [F].[CustomerKey],N'[IN ROW]')

 

사용자 삽입 이미지

송 혁, SQL Server MVP
sqler.pe.kr
sqlleader.com
hyoksong.tistory.com
2008. 6. 23. 17:22
SQL Server 2008에서 예상 또는 실제 실행 계획을 활성화 하고
인덱스가 제대로 구성되지 않은 쿼리를 실행하면 아래와 같이 missing index라고 해서
현재 이 쿼리에 필요한 인덱스를 추천 해 주는 기능을 제공합니다.


사용자 삽입 이미지
송 혁, SQL Server MVP
sqler.pe.kr // sqlleader.com
hyoksong.tistory.com // nexondbteam.tistory.com
2008. 5. 23. 13:41

보통 busy한 서버에 대해서 프로필러와 같은 클라이언트 추적을 사용하지 않는 것이 권고 사항입니다.
클라이언트 추적으로 인해서 전체적인 서비스에 영향을 주며 특정경우에는 SQL 서비스가 중지가 되는 현상도 있었습니다.

이런 일반적인 내용에 대해서 정말 busy한 서버에 프로필러를 뛰우면 어떻게 되는지 테스트를 했습니다.

초당 16000정도의 요청을 받는 SQL서버에 프로필러를 사용해서 추적을 걸어본 결과
2번째 그림에서 볼수 있듯이 Batch Request/Sec이 0로 떨어지면서 프로필러도 응답이 없는 상태로 되었습니다.
만약 이게 실 서비스였다면 잠시나마 모든 요청에 대해 처리를 못해 큰 문제가 될 수 있습니다.

아래 사래와 같은 일이 실 서비스에서도 발생 할 수 있으니 클라이언트 추적을 사용시 보다 주의가 필요할 것으로 보입니다.

송 혁, SQL Server MVP
sqler.pe.kr // sqlleader.com
hyoksong.tistory.com // nexondbteam.tistory.com

<프로필러를 수행전>  

사용자 삽입 이미지


사용자 삽입 이미지





2008. 4. 23. 18:13
SQL Server 2008의 새로운 기능인.. Extended Events

기존의 Trace를 대체할 수 있는 기능을 가졌으며
SQL Server의 내부 이벤트를 캡쳐하여 트러블슈팅 및 성능 문제 발생시
원인을 보다 쉽게 파악할수 있는 기능...

개인적으로는 SQL Server 2008의 기대되는 NEW feature중 하나~입니다.!!






2008. 4. 23. 17:57

DBCC DROPCLEANBUFFERS Buffer Pool 존재하는 데이터 페이지를 제거하는 구문입니다.
하지만 DBCC DROPCLEANBUFFERS 수행하면 정말 Buffer Pool 있는 데이터 페이지가 사라질까요?
간단히 결론만을 말하면 아직 disk 플러시 되지 않는 페이지는 구문으로 내려갈 없습니다.
모든 Buffer Pool 있는 페이지를 내리려면 checkpoint 통해서 Dirty페이지를 마크 후에 DBCC DROPCLEANBUFFERS 수행 하면됩니다.

아래는 테스트 예제입니다.


USE TEST

GO

--DROP TABLE tbl1

 

--샘플 테이블 만들기

SELECT

       TOP 1000

       ROW_NUMBER() over(order by (select 1)) as col1

       ,cast('Hyoksong' as char(5000)) as col2

INTO tbl1

from sys.sysindexes A,sys.sysindexes B,sys.sysindexes C,sys.sysindexes B1

 

--Buffer Pool에있는 데이터 페이지를 날리자.

EXEC sp_msforeachdb 'USE ? CHECKPOINT 1'

DBCC DROPCLEANBUFFERS

 

--500 행에 대해서 업데이트를 치자.

UPDATE tbl1

SET col2 = 'Test'

WHERE col1 > 500

(500개행적용됨)

 

--Buffer Pooltbl1 테이블 데이터 페이지의 수는 몇개?

select

       COUNT(*)

from sys.allocation_units a

       right outer join  sys.dm_os_buffer_descriptors b

             ON a.allocation_unit_id = b.allocation_unit_id

       left outer join sys.partitions p

             ON a.container_id = p.hobt_id

WHERE B.database_id = db_id('Test')

       and (p.object_id IS NULL OR p.object_id > 100)

       and object_name(object_id,database_id) = 'tbl1'

       and page_type = 'DATA_PAGE'

/*

       결과: 1001

*/

--DBCC DROPCLEANBUFFERS 를수행하고Buffer Pool에는몇개?

DBCC DROPCLEANBUFFERS

 

select

       COUNT(*)

from sys.allocation_units a

       right outer join  sys.dm_os_buffer_descriptors b

             ON a.allocation_unit_id = b.allocation_unit_id

       left outer join sys.partitions p

             ON a.container_id = p.hobt_id

WHERE B.database_id = db_id('Test')

       and (p.object_id IS NULL OR p.object_id > 100)

       and object_name(object_id,database_id) = 'tbl1'

       and page_type = 'DATA_PAGE'

/*

       결과: 500

*/

 

--그럼Checkpoint를후에DBCC DROPCLEANBUFFERS을수행하면?

CHECKPOINT 1

DBCC DROPCLEANBUFFERS

 

select

       COUNT(*)

from sys.allocation_units a

       right outer join  sys.dm_os_buffer_descriptors b

             ON a.allocation_unit_id = b.allocation_unit_id

       left outer join sys.partitions p

             ON a.container_id = p.hobt_id

WHERE B.database_id = db_id('Test')

       and (p.object_id IS NULL OR p.object_id > 100)

       and object_name(object_id,database_id) = 'tbl1'

       and page_type = 'DATA_PAGE'

/*

       결과: 0

*/

 

송 혁, SQL Server MVP
sqler.pe.kr
sqlleader.com
hyoksong.tistory.com
nexondbteam.tistory.com

2008. 4. 10. 11:47

CHECKPOINT Buffer Pool 커밋되지 않은 페이지를 디스크로 플러시를 하는 프로세스 입니다.

 

CHECKPOINT DB단위로 발생하며, 발생 주기는 recovery interval 옵션의 값을 기반으로 움직이게 됩니다.

CHECKPOINT 발생시 커밋되지 않은 페이지를 디스크로 페이지를 플러시 하며, CHECKPOINT 발생한 시점에 트랜잭션 로그파일도 마킹을 하여

비정상적인 종료시 마지막 CHECKPOINT 이후의 트랜잭션 로그를 바탕으로 데이터를 롤백 또는 롤포워드 하게됩니다.

 

CHECKPOINT 발생시 IO 병목이 발생 있으며 이러한 문제의 해결에 도움을 있는 몇가지 기능이 SQL Server 2005 추가되었습니다.

1.  CHECKPOINT Duration

è  수동 CHECKPOINT발생시 Duration 시간을 지정 있습니다.

BP 있는 내용을 최대한 빨리 내릴경우에는 Duration 1 지정 있으며

자동 Checkpoint 성능적 문제가 발생한 경우 수동 Checkpoint Duration값을 적절히 설정하면

천천히 페이지를 플러시 하여 IO 급격한 요청을 피해 전반적인 성능 향상을 꾀할 있습니다.

 

2.     -k 옵션 (http://support.microsoft.com/default.aspx/kb/929240)

è  SP2 누적 픽스 까지 설치하면 –k 시작 옵션을 사용할 있습니다.

해당 옵션은 초당 얼마의 IO작업을 할것인지 지정 있으며 만약 –k100으로 설정 하였다면

초당 100MB IO작업이 발생하게 됩니다.

Duration처럼 CHEKCPOINT 병목에 대해서 해결시 사용할 있습니다.

보다 자세한 내용은 KB문서를 참고 하세요.

 

3.  CHECKPOINT IO응답시간 20ms 이내, 서버 종료시는 100ms

è  2000 경우에는 Checkpoint 작업시 DISK병목 현상이 발생될 있었지만

2005 경우에는 Write 응답시간을 20ms 또는 100ms으로 지정하여 기존 버전보다 IO병목 현상에 대해 향상 되었습니다.

 

4.  연속된 32개의 페이지를 하나의 IO 처리(기존 SQL Server 2000에는 16페이지)

è  보통 DISK 랜덤IO 작업에 성능이 급격히 떨어지게 됩니다.

여러 개의 페이지를 하나의 IO작업으로 처리하면 보다 빨리 CHECKPOINT작업이 처리 있습니다.

2000 경우에는 16개의 페이지 였지만 2005 경우에는 32개의 페이지를 하나의 IO 처리 있습니다.

 

CHECKPOINT IO성능에 가장 이슈가 되는 프로세스이며, 조금 살펴보면 재미 있는 이슈가 많습니다.

조만간 아래 주제에 대한 글을 포스팅 하도록 하겠습니다.

 

1.  연속적, 랜덤한 데이터 변경에 대한 CHECKPOINT 성능 비교

2.  CHECKPOINT 발생시키는 이벤트

3.  IO Subsystem 성능에 따른 CHECKPOINT

4.  매뉴얼 CHECKPOINT,-k 시작 옵션, Duration 언제 사용할까?

5.  DBCC DROPCLEANBUFFERS 수행하면 모든 페이지가 정말 Buffer Pool에서 사라질까?

 

, SQL Server MVP

sqler.pe.kr

sqlleader.com

hyoksong.tistory.com

nexondbteam.tistory.com