다음은 동일한 데이터를 읽지 만 매우 다른 논리적 읽기를보고하는 세 가지 간단한 테스트입니다.
설정
다음 스크립트는 100 개의 동일한 행이있는 테스트 테이블을 작성합니다. 각 테이블에는 행 외부에 저장하기에 충분한 데이터 가있는 xml 열이 포함되어 있습니다. 내 테스트 데이터베이스에서 생성 된 xml 의 길이는 각 행에 대해 20,204 바이트입니다.
-- Conditional drop
IF OBJECT_ID(N'dbo.XMLTest', N'U') IS NOT NULL
DROP TABLE dbo.XMLTest;
GO
-- Create test table
CREATE TABLE dbo.XMLTest
(
ID integer IDENTITY PRIMARY KEY,
X xml NULL
);
GO
-- Add 100 wide xml rows
DECLARE @X xml;
SET @X =
(
SELECT TOP (100) *
FROM sys.columns AS C
FOR XML
PATH ('row'),
ROOT ('root'),
TYPE
);
INSERT dbo.XMLTest
(X)
SELECT TOP (100)
@X
FROM sys.columns AS C;
-- Flush dirty buffers
CHECKPOINT;
테스트
다음 세 가지 테스트는 xml 열을 읽습니다 .
- 평범한
SELECT
진술 - xml 을 변수에 할당
SELECT INTO
임시 테이블을 만드는 데 사용
-- No row count messages or graphical plan
-- Show I/O statistics
SET NOCOUNT ON;
SET STATISTICS XML OFF;
SET STATISTICS IO ON;
GO
PRINT CHAR(10) + '=== Plain SELECT ===='
DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS;
SELECT XT.X
FROM dbo.XMLTest AS XT;
GO
PRINT CHAR(10) + '=== Assign to a variable ===='
DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS;
DECLARE @X xml;
SELECT
@X = XT.X
FROM dbo.XMLTest AS XT;
GO
PRINT CHAR(10) + '=== SELECT INTO ===='
IF OBJECT_ID(N'tempdb..#T', N'U') IS NOT NULL
DROP TABLE #T;
DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS;
SELECT
XT.X
INTO #T
FROM dbo.XMLTest AS XT
GO
SET STATISTICS IO OFF;
결과
출력은 다음과 같습니다.
=== 일반 선택 ==== 'XMLTest'테이블. 스캔 카운트 1, 논리적 읽기 3, 물리적 읽기 1, 미리 읽기 0, lob 논리적 읽기 (795), lob 물리적 읽기 (37), lob 미리 읽기 (796). === 변수에 할당 ==== 'XMLTest'테이블. 스캔 카운트 1, 논리적 읽기 3, 물리적 읽기 1, 미리 읽기 0, lob 논리적 읽기 0, lob 물리적 읽기 0, lob 미리 읽기는 0을 읽습니다. === 안으로 선택 ==== 'XMLTest'테이블. 스캔 카운트 1, 논리적 읽기 3, 물리적 읽기 1, 미리 읽기 0, lob 논리적 읽기 (300), lob 물리적 읽기 (37), lob 미리 읽기 (400).
질문
- LOB 읽기가 다른 이유는 무엇입니까?
- 각 테스트에서 정확히 동일한 데이터를 읽었습니까?