İstatistikler fiziksel olarak SQL Server'da nerede depolanıyor?


27

Sorgu Doktoru tarafından kullanılan bir SQL Server veritabanı dosyası ve Buffer Pool içinde fiziksel olarak depolanan İstatistikler nerede?

Daha spesifik olarak, DMV'ler ve / veya DBCC kullanarak istatistiklerin kullandığı sayfaları bulmanın bir yolu var mı?

Hem SQL Server 2008 Internals hem de SQL Server Internals ve Sorun Giderme kitaplarına sahibim ve bunların hiçbiri istatistiğin fiziksel yapısı hakkında konuşmuyor; eğer öyleyse bu bilgiyi bulamadım.


1
Bir veritabanını sadece istatistik bir kopyasını oluşturduğunuzda, STATS_STREAMbu dosyanın kendisinde ulaşılabilir bir şey olup olmadığını hiç bakmadığım bir ikili gösterir .
Martin Smith

2
İstatistikler, StatManbir blob çıkaran yalnızca dahili bir toplama işlevi ( ) tarafından oluşturulur (ironik olarak, bu ad bir SSMS sorgu penceresinde bir işlev olarak vurgulanır). Mantıksal olarak, istatistikler bir dizin veya bir dizi tablo sütunuyla ilişkilendirilir, bu yüzden blob'a götürecek olan bir binaryveya varbinarysütun arayan dahili meta veri tablolarını inceleyerek başlardım. Bu kullanılarak görüntülenebilir olmalı DBCC PAGE, ancak hepsi dahili olduğundan muhtemelen başka bir yol değil.
Jon Seigel

1
@ivanmp DBA'ların çoğu bir BP'nin veya bir QO'nun ne olduğunu bilemeyeceğinden, açıklık konusundaki sorunuza karar verdim.
Max Vernon

2
Eskiden sysindexes.statblobama 2005'ten beri geri dönen NULLve yerin tamamen belgesiz olduğu, yalnızca geri alınabilen (benim bildiğim) DBCC SHOW_STATISTICS(o, i) WITH STATS_STREAM;.
Aaron Bertrand

1
Dizin istatistiklerini sys.sysidxstatsbuldum - içerideler - bu tabloda bir LOB işaretçisi var gibi görünüyor. Sütun istatistiklerinin henüz neresinde olduğundan emin değilim; Bir typesütun olduğu gibi o masada da olabilirler .
Jon Seigel

Yanıtlar:


30

Onları buldum.

  1. Basit istatistik nesnesi içeren bir tablo oluşturun.

    CREATE DATABASE splunge;
    GO
    USE splunge;
    GO
    CREATE TABLE dbo.foo(bar INT, munge INT);
    GO
    CREATE STATISTICS x ON dbo.foo(bar);
    CREATE STATISTICS y ON dbo.foo(munge);
    GO
    INSERT dbo.foo SELECT s1.[object_id], s2.[object_id]
      FROM sys.objects AS s1
      CROSS JOIN sys.objects AS s2;
    GO
    UPDATE STATISTICS dbo.foo;
    GO
    
  2. DAC ( ADMIN:Server[\instance]) kullanarak bağlanın .

  3. Aşağıdaki sorguları çalıştırın:

    DBCC SHOW_STATISTICS('dbo.foo', 'x') WITH STATS_STREAM;
    DBCC SHOW_STATISTICS('dbo.foo', 'y') WITH STATS_STREAM;
    
    SELECT name, imageval 
      FROM sys.stats AS s
      INNER JOIN sys.sysobjvalues AS o
      ON s.object_id = o.objid
      AND s.stats_id = o.subobjid
    WHERE 
      s.object_id = OBJECT_ID('dbo.foo');
    

Sen dikkat edecek imagevalher istatistikler nesne için istatistikler blob olarak aynı değildir, ama öyle ihtiva istatistik damla - sadece ofset oluyor. Sistemimde x için bunu verdi (belli ki biraz bit kestim):

0x0100...bunch of chars...000007000000C4E1BE00EEA0...rest the same
                            0x07000000C4E1BE00EEA0...rest the same

Ve bu y için:

0x0100...bunch of chars...430007000000C7E1BE00EEA0...rest the same
                            0x07000000C7E1BE00EEA0...rest the same

Aynısı endeks tabanlı istatistikler için de geçerliydi.

Muhtemelen bu DBCCkomutları kullanarak bir dizi sorgu ile daha fazla doğrulama yapabilirsiniz . Öncelikle, kümelenmiş dizinde açık olan sayfaları bulun sys.sysobjvalues(veritabanı adınızı girin):

DBCC IND('splunge', 'sys.sysobjvalues', 1);

Sonuçta, bir çok sayfa listelenir, bunlarla ilgileniyorsunuz PageType = 1. Yeni bir veritabanı ile bu bilgiyi en yüksek PagePIDdeğerlere sahip sayfalardan birinde bulabilmelisiniz . Örneğin, sistemimde bu sayfa 281 idi, bu yüzden o sayfaya daha yakından baktım:

DBCC TRACEON(3604);

DECLARE @dbid INT = DB_ID();

DBCC PAGE(@dbid, 1, 281, 3);

DBCC TRACEOFF(3604);

Tabii ki, verileri alan 17'de buldum:

DBCC Sayfasının kısmi sonuçları

(Daha büyük veritabanlarında, daha fazla avlanma ve gagalama yapmanız gerekebilir, çünkü yeni bir istatistik nesnesinin bile yeni (sayfa) bir sayfada sonuçlanacağının garantisi yoktur.)

Devam edin ve bunu evde deneyin, ancak bunun için DAC ile bağlantı kurmanız gereken bir neden var. Elbette, çıktıyla yapamayacağınız bu bilgilerle ne yapacağınızı bilmek isterim DBCC SHOW_STATISTICS.

Bunun elbette STATS_STREAMhistogram veya diğer bilgileri sağlamak için şifresini çözmediğini ve tablo çıktısının DBCC SHOW_STATISTICS ... WITH HISTOGRAMtablo biçiminde herhangi bir yerde saklandığına dair herhangi bir kanıt bulamadığımı unutmayın . Joe Chang'in peşindeyseniz çözme hakkında bilgisi var. Sorguda yapmak isteyeceğiniz bir şey olduğunu sanmıyorum - sadece kullanın DBCC.


2
Kazanan bir bayanlar ve baylar var. Şapkamı size yönlendiriyorum efendim.
Zane

Hahaha, tebrikler ve teşekkürler efendim! Endişelenme, yapmamam gereken hiçbir şey yapmıyorum (AKA "aptal"). Sadece kişisel gelişim için. Bu konuda hiçbir şey bulamadığımı fark ettiğimde çok ilgimi çekti. =)
ivanmp

Joe Chang'in makalesi hakkında, bunun cevabını ararken onu buldum. Ben zaten okumaya başlamıştım. Tekrar teşekkürler. :)
ivanmp
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.