Dưới đây là ba bài kiểm tra đơn giản đọc cùng một dữ liệu, nhưng báo cáo các lần đọc logic rất khác nhau:
Thiết lập
Kịch bản sau đây tạo một bảng thử nghiệm với 100 hàng giống hệt nhau, mỗi hàng chứa một cột xml có đủ dữ liệu để đảm bảo nó được lưu ngoài hàng. Trong cơ sở dữ liệu thử nghiệm của tôi, độ dài của xml được tạo là 20.204 byte cho mỗi hàng.
-- 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;
Xét nghiệm
Ba thử nghiệm sau đây đọc cột xml với:
- Một
SELECT
tuyên bố rõ ràng - Gán xml cho một biến
- Sử dụng
SELECT INTO
để tạo bảng tạm thời
-- 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;
Các kết quả
Đầu ra là:
=== CHỌN đơn giản ==== Bảng 'XMLTest'. Quét số 1, đọc logic 3, đọc vật lý 1, đọc trước đọc 0, lob logic đọc 795, lob vật lý đọc 37, lob đọc trước đọc 796. === Gán cho một biến ==== Bảng 'XMLTest'. Quét số 1, đọc logic 3, đọc vật lý 1, đọc trước đọc 0, lob logic đọc 0, lob vật lý đọc 0, lob đọc trước đọc 0. === CHỌN VÀO ==== Bảng 'XMLTest'. Quét số 1, đọc logic 3, đọc vật lý 1, đọc trước đọc 0, lob logic đọc 300, lob vật lý đọc 37, lob đọc trước đọc 400.
Câu hỏi
- Tại sao các LOB đọc rất khác nhau?
- Chắc chắn dữ liệu chính xác đã được đọc trong mỗi bài kiểm tra?