Berikut adalah tiga tes sederhana yang membaca data yang sama, namun melaporkan pembacaan logis yang sangat berbeda:
Mendirikan
Script berikut membuat tabel pengujian dengan 100 baris identik, masing-masing berisi kolom xml dengan data yang cukup untuk memastikannya disimpan di luar baris. Dalam database pengujian saya, panjang xml yang dihasilkan adalah 20.204 byte untuk setiap baris.
-- 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;
Tes
Tiga tes berikut membaca kolom xml dengan:
SELECT
Pernyataan sederhana- Menetapkan xml ke variabel
- Menggunakan
SELECT INTO
untuk membuat tabel sementara
-- 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;
Hasil
Outputnya adalah:
=== PILIH Biasa ==== Tabel 'XMLTest'. Pindai hitungan 1, bacaan logis 3, bacaan fisik 1, baca-depan dibaca 0, lob logis membaca 795, lob fisik membaca 37, lob baca-depan membaca 796. === Tetapkan ke variabel ==== Tabel 'XMLTest'. Pindai hitungan 1, bacaan logis 3, bacaan fisik 1, baca-depan dibaca 0, lob logis membaca 0, lob fisik membaca 0, lob baca-depan membaca 0. === PILIH KE ==== Tabel 'XMLTest'. Pindai hitungan 1, bacaan logis 3, bacaan fisik 1, baca-depan dibaca 0, Lob membaca logis 300, lob fisik membaca 37, lob membaca-depan membaca 400.
Pertanyaan
- Mengapa LOB berbunyi sangat berbeda?
- Tentunya data yang sama persis dibaca di setiap tes?