Aynı verileri okuyan, ancak çok farklı mantıksal okumalar bildiren üç basit test:
Kurmak
Aşağıdaki komut dosyası, her biri satırda depolanmasını sağlamak için yeterli veri içeren bir xml sütunu içeren 100 aynı satırdan oluşan bir test tablosu oluşturur . Test veritabanımda, oluşturulan xml uzunluğu, her satır için 20,204 bayttır.
-- 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;
Testler
Aşağıdaki üç test, xml sütununu aşağıdakilerle okudu :
- Sade bir
SELECT
ifade - Xml değişkene atama
SELECT INTO
Geçici bir tablo oluşturmak için kullanma
-- 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;
Sonuçlar
Çıktı:
=== Düz SELECT ==== 'XMLTest' tablosu. Tarama sayısı 1, mantıksal okuma 3, fiziksel okuma 1, okumaya devam okuma 0, lob lojik 795 okur, lob fiziksel okur 37, lob ileri okur 796. === Bir değişkene atayın ==== 'XMLTest' tablosu. Tarama sayısı 1, mantıksal okuma 3, fiziksel okuma 1, okumaya devam okuma 0, lob mantıksal 0 okur, lob fiziksel 0 okur, lob ileride 0 okur. === INTO SELECT ==== 'XMLTest' tablosu. Tarama sayısı 1, mantıksal okuma 3, fiziksel okuma 1, okumaya devam okuma 0, lob mantıksal 300 okur, lob fiziksel okur 37, lob okur ileri 400 okur.
Sorular
- LOB neden bu kadar farklı okuyor?
- Her testte kesinlikle aynı veriler okunuyor mu?