2011-07-17 2 views
1

SQL Server 2008에서는 쿼리가 실행될 때 실제로 어떤 일이 진행되고 있는지 살펴보고자합니다. 어떻게 든 다음을 볼 수 있습니까?쿼리 실행에서 * 실제로 * 진행되는 것을 보는 방법?

  1. 쿼리에서 "생성 한"로그 레코드 수 (및 내용까지도)입니다.
  2. 로그의 내용이 실제로 실제 데이터 구조에 적용되는 경우. 예 :
    1. (클러스터링) 인덱스 구조에 실제로 새 행이 추가되는 경우는 언제입니까?
    2. 업데이트 및 삽입은 B- 트리 재구성을 의미합니다 (그렇다면 해당 B- 트리의 얼마나 많은 부분이 영향을 받았는지). 흠, 아마도 이것에 대한 별도의 질문을 게시해야합니다 ...
  3. 액세스 된 각 테이블에 대한 버퍼 누락/히트 수.
  4. 버퍼 내용 (테이블의 페이지 수 또는 현재 버퍼에있는 페이지 수)은 무엇입니까?

BTW : 여러 개의 작은 질문에서이 질문을 나누는 것을 고려했지만 다소 관련이 있습니다.

+1

입니다 번역. [여기에 몇 가지 예제 코드] (http://sqlblog.com/blogs/michael_zilberstein/archive/2011/04/25/35175.aspx) –

답변

3

다음은 SQL Server Internals에 대해 배우기 시작하는 간단한 데모 스크립트입니다. 쿼리의 개별 동작을 확인하려면 Paul Randal's SQLSkills Blog으로 이동하십시오.

이 블로그의 다른 게시물은 DBCC 페이지와 같은 주제를 다루며 페이지 및 DBCC IND의 내용을 볼 수 있습니다. DBCC IND는 테이블/색인에 대한 할당 맵을 보여줍니다. 이 모든 주제를 자세히 다루는 Microsoft SQL Server 2008 Internals 사본을 읽는 것이 좋습니다. 로그 레코드 데모 스크립트는 두 가지 선택을 위해

미스가 물리적으로 표시됩니다

거래 읽기 및 미리 읽기 다음은 버퍼 풀에 디스크에서 읽고 있습니다 읽습니다. 그런 다음 쿼리 엔진은 이러한 페이지를 사용하며 이것은 논리적 읽기입니다. 따라서 warm select의 io stats에는 실제 읽기 또는 미리 읽기가 없으므로 버퍼 풀에 이미있는 모든 페이지가 필요합니다. 버퍼 풀의 내용에 대한

/* -- Cleanup Script 
USE master 
DROP DATABASE ExampleDB 
*/ 
SET NOCOUNT ON 
SET STATISTICS IO OFF 
GO 
CREATE DATABASE ExampleDB 
GO 
USE ExampleDB 
GO 
-- Force a CHECKPOINT to CLEAR the Transaction Log 
CHECKPOINT 
GO 
-- Show Empty Transaction Log 
SELECT * FROM fn_dblog(NULL,NULL) 
GO 
-- CREATE SIMPLE TABLE 
CREATE TABLE NewTable 
(
    A int identity NOT NULL PRIMARY KEY, 
    B char(8000) NOT NULL DEFAULT ('') 
) 
GO 
-- Show Transaction Log With CREATE TABLE records 
SELECT * FROM fn_dblog(NULL,NULL) 
GO 
-- Force a CHECKPOINT to CLEAR the Transaction Log 
CHECKPOINT 
GO 
PRINT 'INSERT Start' 
GO 
INSERT NewTable 
VALUES (DEFAULT) 
GO 1000 
PRINT 'INSERT End' 
GO 
-- Show Transaction Log With INSERT records 
SELECT * FROM fn_dblog(NULL,NULL) 
GO 
-- Turn On IO Statistics (these appear in the messages tab) 
SET STATISTICS IO ON 
GO 
-- Force a CHECKPOINT to CLEAR the Transaction Log and modified buffer pages 
CHECKPOINT 
GO 
-- DROP CLEAN BUFFERS to empty cache 
DBCC DROPCLEANBUFFERS 
GO 
PRINT 'SELECT Start Cold Cache' 
GO 
SELECT * FROM NewTable 
GO 
PRINT 'SELECT End Cold Cache' 
GO 
PRINT 'SELECT Start Warm Cache' 
GO 
SELECT * FROM NewTable 
GO 
PRINT 'SELECT End Warm Cache' 
GO 
-- Force a CHECKPOINT to CLEAR the Transaction Log 
CHECKPOINT 
GO 
DROP TABLE NewTable 
-- Show Transaction Log With DROP TABLE records 
SELECT * FROM fn_dblog(NULL,NULL) 
GO 

시작점은 로그가 다음에 향상된다 PageSplit 확장 이벤트까지 볼 수있는 최고의 장소입니다 귀하의 질문의 포인트 2.2과 관련이 DMV

SELECT  * 
FROM  sys.dm_os_buffer_descriptors 
+0

아주 좋은 대답. 곧 "답변"으로 표시하겠습니다. 나는 여전히 답을 놓치고있는 유일한 것이 아이템 3이라고 생각한다. – someName

+0

SET STATISTICS IO ON은 물리적 읽기 인 논리적 읽기와 미스 인 히트를 보여준다. 또한 블로그 게시물은 실행 중에 쿼리가 경험하는 다양한 대기 시간을 통해이를 보여줍니다. – MartinC

0

SQL 프로필러 옵션과 저장 프로 시저 실행 계획을 볼 수 있습니다.

관련 문제