Logic đọc khác nhau khi truy cập cùng một dữ liệu LOB


26

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:

  1. Một SELECTtuyên bố rõ ràng
  2. Gán xml cho một biến
  3. 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?

Câu trả lời:


27

Không phải tất cả các lần đọc đều như nhau. SQL Server biết rằng việc truy cập dữ liệu LOB rất tốn kém và cố gắng tránh nó khi có thể. Ngoài ra còn có sự khác biệt chi tiết về cách đọc dữ liệu LOB trong từng trường hợp:

Tóm lược

Các số khác nhau vì:

  • Lựa chọn đọc LOB trong khối kích thước gói
  • Kiểm tra phân công biến không đọc LOB chút nào
  • Bài kiểm tra "chọn vào" đọc LOB trong toàn bộ trang

Chi tiết

  1. Trơn SELECT

    Chọn kế hoạch

    Quét chỉ mục cụm không đọc bất kỳ dữ liệu LOB nào. Nó chỉ gán LOB công cụ lưu trữ xử lý . Tay cầm không được sử dụng cho đến khi điều khiển trở về gốc của kế hoạch.

    Nội dung LOB của hàng hiện tại được đọc trong các đoạn có kích thước gói TDS và được truyền đến máy khách. Số lần đọc logic sẽ đếm số lần một trang được chạm vào, vì vậy:

    Số lần đọc được báo cáo bằng với số lần đọc được thực hiện, cộng với một lần đọc cho mỗi lần chuyển đổi trang LOB.

    Ví dụ: Một lần đọc logic được tính vào đầu mỗi đoạn khi quá trình chạm vào trang tương ứng với vị trí hiện tại của luồng. Trong đó các gói nhỏ hơn một trang cơ sở dữ liệu (trường hợp thông thường), một số lần đọc logic được tính cho cùng một trang. Nếu kích thước gói lớn đến mức toàn bộ LOB có thể vừa trong một đoạn, số lần đọc logic được báo cáo sẽ là số trang LOB.

  2. Phân công biến

    Gói biến

    Quét chỉ mục cụm chỉ định xử lý LOB như trước. Tại thư mục gốc của gói, tay cầm LOB được sao chép vào biến. Dữ liệu LOB không bao giờ được truy cập (không đọc LOB), vì biến không bao giờ được đọc. Ngay cả nếu có, nó sẽ chỉ thông qua tay cầm LOB được chỉ định lần cuối.

    Không có LOB đọc vì dữ liệu LOB không bao giờ được truy cập.

  3. SELECT INTO

    Chọn vào kế hoạch

    Gói này sử dụng nhà cung cấp hàng loạt để sao chép dữ liệu LOB từ bảng nguồn sang bảng mới. Nó xử lý một trang LOB hoàn chỉnh trên mỗi lần đọc (không phát trực tuyến hoặc phân đoạn).

    Số lần đọc logic tương ứng với số lượng trang LOB trong bảng kiểm tra.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.