Lojik aynı LOB verilerine erişirken farklı okur


26

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 :

  1. Sade bir SELECTifade
  2. Xml değişkene atama
  3. SELECT INTOGeç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?

Yanıtlar:


27

Tüm okumalar eşit değil. SQL Server, LOB verilerine erişmenin pahalı olduğunu bilir ve mümkün olduğunda bunları önlemeye çalışır. LOB verilerinin her durumda okunma biçiminde ayrıntılı farklılıklar da vardır:

özet

Sayılar farklı çünkü:

  • Seçim, LOB'u paket büyüklüğünde toplar
  • Değişken atama testi okumaz hiç LOB
  • "Seçme" testi tüm sayfalarda LOB okur

detay

  1. Sade SELECT

    Plan seç

    Kümelenmiş Dizin Taraması herhangi bir LOB verisini okumaz. Yalnızca bir depolama motoru LOB tutamacı atar . Tutamaç, kontrol planın köküne dönene kadar kullanılmaz.

    Mevcut satırın LOB içeriği TDS paket büyüklüğünde okunur ve müşteriye iletilir. Mantıksal okumalar bir sayfaya dokunma sayısını sayar, bu nedenle:

    Rapor edilen okumaların sayısı, gerçekleştirilen yığın okumaların sayısına eşittir, ayrıca bir LOB sayfası geçişi gerçekleştiğinde bir kezdir.

    Örneğin: İşlem, akımın geçerli konumuna karşılık gelen sayfaya dokunduğunda her bir yığının başında mantıksal bir okuma sayılır. Paketlerin bir veritabanı sayfasından (normal durum) küçük olması durumunda, aynı sayfa için birkaç mantıksal okuma sayılır. Paket boyutu, LOB'un tamamı bir yığın içine sığabilecek kadar büyükse, bildirilen mantıksal okuma sayısı LOB sayfalarının sayısı olacaktır.

  2. Değişken atama

    Değişken plan

    Kümelenmiş Dizin Taraması, daha önce olduğu gibi bir LOB tutamacı atar . Planın kökünde, LOB tanıtıcısı değişkene kopyalanır. LOB verilerine hiçbir zaman erişilmez (sıfır LOB okur), çünkü değişken asla okunmaz. Olsa bile, sadece son atanan LOB tutamağı üzerinden olacaktı.

    LOB verilerine hiçbir zaman erişilmediğinden LOB okuma yok.

  3. SELECT INTO

    Plana Seçin

    Bu plan, LOB verilerini kaynak tablodan yeni tabloya kopyalamak için toplu satır kümesi sağlayıcısını kullanır. Her okunuşta tam bir LOB sayfası işler (akış veya yığın yok).

    Mantıksal okuma sayısı, test tablosundaki LOB sayfalarının sayısına karşılık gelir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.