Azure Synapse Analytics'te ayrılmış SQL havuzu için tablo istatistikleri

Bu makalede, ayrılmış SQL havuzundaki tablolarda sorgu iyileştirme istatistikleri oluşturmaya ve güncelleştirmeye yönelik öneriler ve örnekler bulacaksınız.

İstatistikleri neden kullanmalısınız?

Verileriniz hakkında ne kadar çok ayrılmış SQL havuzu bilirse, bu havuz üzerinde o kadar hızlı sorgu yürütebilir. Verileri ayrılmış SQL havuzuna yükledikten sonra verilerinizle ilgili istatistikleri toplamak, sorgularınızı iyileştirmek için yapabileceğiniz en önemli şeylerden biridir.

Ayrılmış SQL havuzu sorgu iyileştiricisi, maliyet tabanlı bir iyileştiricidir. Çeşitli sorgu planlarının maliyetini karşılaştırır ve ardından planı en düşük maliyetle seçer. Çoğu durumda, en hızlı yürütecek planı seçer.

Örneğin, iyileştirici sorgunuzun filtreleneceği tarihin bir satır döndüreceğini tahmin ederse bir plan seçer. Seçilen tarihin 1 milyon satır döndüreceğini tahmin ederse, farklı bir plan döndürür.

İstatistiklerin otomatik olarak oluşturulması

Veritabanı AUTO_CREATE_STATISTICS seçeneği açık olduğunda, ayrılmış SQL havuzu eksik istatistikler için gelen kullanıcı sorgularını analiz eder.

İstatistikler eksikse, sorgu iyileştiricisi sorgu planı için kardinalite tahminlerini geliştirmek üzere sorgu koşulundaki veya birleştirme koşulundaki tek tek sütunlarda istatistikler oluşturur.

Not

İstatistiklerin otomatik olarak oluşturulması şu anda varsayılan olarak açıktır.

Aşağıdaki komutu çalıştırarak ayrılmış SQL havuzunuzun AUTO_CREATE_STATISTICS yapılandırılıp yapılandırılmadığını kontrol edebilirsiniz:

SELECT name, is_auto_create_stats_on
FROM sys.databases

Ayrılmış SQL havuzunuzda yapılandırılmış AUTO_CREATE_STATISTICS yoksa aşağıdaki komutu çalıştırarak bu özelliği etkinleştirmenizi öneririz:

ALTER DATABASE <yourdatawarehousename>
SET AUTO_CREATE_STATISTICS ON

Bu deyimler istatistiklerin otomatik olarak oluşturulmasını tetikler:

  • SELECT
  • INSERT-SELECT
  • CTAS
  • UPDATE
  • DELETE
  • Birleşim içerdiğinde veya bir koşulun varlığı algılandığında EXPLAIN

Not

İstatistiklerin otomatik olarak oluşturulması geçici veya dış tablolarda oluşturulmaz.

İstatistiklerin otomatik olarak oluşturulması zaman uyumlu olarak yapılır, bu nedenle sütunlarınızda istatistik eksikse sorgu performansında biraz düşüşe neden olabilirsiniz. Tek bir sütun için istatistik oluşturma süresi tablonun boyutuna bağlıdır.

Ölçülebilir performans düşüşlerini önlemek için sistemin profilini oluşturmadan önce kıyaslama iş yükünü yürüterek istatistiklerin oluşturulduğundan emin olmanız gerekir.

Not

İstatistik oluşturma işlemi sys.dm_pdw_exec_requests farklı bir kullanıcı bağlamı altında günlüğe kaydedilir.

Otomatik istatistikler oluşturulduğunda şu formu alır: WA_Sys<Hex>_<8 basamaklı tablo kimliğindeki 8 basamaklı sütun kimliği.> DBCC SHOW_STATISTICS komutunu çalıştırarak önceden oluşturulmuş istatistikleri görüntüleyebilirsiniz:

DBCC SHOW_STATISTICS (<table_name>, <target>)

table_name, görüntülenecek istatistikleri içeren tablonun adıdır. Bu tablo dış tablo olamaz. Hedef, istatistik bilgilerinin görüntüleneceği hedef dizinin, istatistiklerin veya sütunun adıdır.

İstatistikleri güncelleştirme

En iyi yöntemlerden biri, yeni tarihler eklendikçe her gün tarih sütunlarının istatistiklerini güncelleştirmektir. Ayrılmış SQL havuzuna her yeni satır yüklendiğinde yeni yükleme tarihleri veya işlem tarihleri eklenir. Bu eklemeler veri dağıtımını değiştirir ve istatistiklerin güncel olmasını sağlar.

Değerlerin dağıtımı genel olarak değişmediğinden, müşteri tablosundaki bir ülke/bölge sütunundaki istatistiklerin güncelleştirilmesi gerekmeyebilir. Dağıtımın müşteriler arasında sabit olduğu varsayıldığında, tablo varyasyona yeni satırlar eklemek veri dağıtımını değiştirmez.

Ancak, ayrılmış SQL havuzunuz yalnızca bir ülke/bölge içeriyorsa ve yeni bir ülkeden/bölgeden veri getirirseniz ve birden çok ülkeden/bölgeden veriler depolanıyorsa, ülke/bölge sütunundaki istatistikleri güncelleştirmeniz gerekir.

İstatistikleri güncelleştirme önerileri aşağıdadır:

İstatistik özniteliği Öneri
İstatistik güncelleştirmelerinin sıklığı Muhafazakar: Verilerinizi yükledikten veya dönüştürdükten sonra Günlük
Örnekleme 1 milyardan az satır, varsayılan örneklemeyi (yüzde 20) kullanın.
1 milyardan fazla satırla yüzde iki örnekleme kullanın.

Bir sorguyla ilgili sorunları giderirken sormanız gereken ilk sorulardan biri şudur: "İstatistikler güncel mi?"

Bu soru, verilerin yaşına göre yanıtlanabilir bir soru değildir. Temel alınan verilerde önemli bir değişiklik yapılmadıysa güncel istatistik nesnesi eski olabilir. Satır sayısı önemli ölçüde değiştiğinde veya bir sütun için değerlerin dağılımında önemli bir değişiklik olduğunda, istatistikleri güncelleştirmenin zamanı gelmiştir.

İstatistiklerin son güncelleştirilişinden sonra tablodaki verilerin değişip değişmediğini belirlemek için dinamik yönetim görünümü yoktur. Aşağıdaki iki sorgu, istatistiklerinizin eski olup olmadığını belirlemenize yardımcı olabilir.

Sorgu 1: İstatistiklerden (stats_row_count) satır sayısı ile gerçek satır sayısı (actual_row_count) arasındaki farkı öğrenin.

select 
objIdsWithStats.[object_id], 
actualRowCounts.[schema], 
actualRowCounts.logical_table_name, 
statsRowCounts.stats_row_count, 
actualRowCounts.actual_row_count,
row_count_difference = CASE
    WHEN actualRowCounts.actual_row_count >= statsRowCounts.stats_row_count THEN actualRowCounts.actual_row_count - statsRowCounts.stats_row_count
    ELSE statsRowCounts.stats_row_count - actualRowCounts.actual_row_count
END,
percent_deviation_from_actual = CASE
    WHEN actualRowCounts.actual_row_count = 0 THEN statsRowCounts.stats_row_count
    WHEN statsRowCounts.stats_row_count = 0 THEN actualRowCounts.actual_row_count
    WHEN actualRowCounts.actual_row_count >= statsRowCounts.stats_row_count THEN CONVERT(NUMERIC(18, 0), CONVERT(NUMERIC(18, 2), (actualRowCounts.actual_row_count - statsRowCounts.stats_row_count)) / CONVERT(NUMERIC(18, 2), actualRowCounts.actual_row_count) * 100)
    ELSE CONVERT(NUMERIC(18, 0), CONVERT(NUMERIC(18, 2), (statsRowCounts.stats_row_count - actualRowCounts.actual_row_count)) / CONVERT(NUMERIC(18, 2), actualRowCounts.actual_row_count) * 100)
END
from
(
    select distinct object_id from sys.stats where stats_id > 1
) objIdsWithStats
left join
(
    select object_id, sum(rows) as stats_row_count from sys.partitions group by object_id
) statsRowCounts
on objIdsWithStats.object_id = statsRowCounts.object_id 
left join
(
    SELECT sm.name [schema] ,
        tb.name logical_table_name ,
        tb.object_id object_id ,
        SUM(rg.row_count) actual_row_count
    FROM sys.schemas sm
         INNER JOIN sys.tables tb ON sm.schema_id = tb.schema_id
         INNER JOIN sys.pdw_table_mappings mp ON tb.object_id = mp.object_id
         INNER JOIN sys.pdw_nodes_tables nt ON nt.name = mp.physical_name
         INNER JOIN sys.dm_pdw_nodes_db_partition_stats rg     ON rg.object_id = nt.object_id
            AND rg.pdw_node_id = nt.pdw_node_id
            AND rg.distribution_id = nt.distribution_id
    WHERE rg.index_id = 1
    GROUP BY sm.name, tb.name, tb.object_id
) actualRowCounts
on objIdsWithStats.object_id = actualRowCounts.object_id

Sorgu 2: İstatistiklerinizin her tabloda en son ne zaman güncelleştirildiğinden emin olarak istatistiklerinizin yaşını öğrenin.

Not

Bir sütunun değerlerinin dağılımında önemli bir değişiklik varsa, en son ne zaman güncelleştirildiklerinden bağımsız olarak istatistikleri güncelleştirmeniz gerekir.

SELECT
    sm.[name] AS [schema_name],
    tb.[name] AS [table_name],
    co.[name] AS [stats_column_name],
    st.[name] AS [stats_name],
    STATS_DATE(st.[object_id],st.[stats_id]) AS [stats_last_updated_date]
FROM
    sys.objects ob
    JOIN sys.stats st
        ON  ob.[object_id] = st.[object_id]
    JOIN sys.stats_columns sc
        ON  st.[stats_id] = sc.[stats_id]
        AND st.[object_id] = sc.[object_id]
    JOIN sys.columns co
        ON  sc.[column_id] = co.[column_id]
        AND sc.[object_id] = co.[object_id]
    JOIN sys.types  ty
        ON  co.[user_type_id] = ty.[user_type_id]
    JOIN sys.tables tb
        ON  co.[object_id] = tb.[object_id]
    JOIN sys.schemas sm
        ON  tb.[schema_id] = sm.[schema_id]
WHERE
    st.[user_created] = 1;

Örneğin, ayrılmış bir SQL havuzundaki tarih sütunları genellikle sık istatistik güncelleştirmelerine ihtiyaç duyar. Ayrılmış SQL havuzuna her yeni satır yüklendiğinde yeni yükleme tarihleri veya işlem tarihleri eklenir. Bu eklemeler veri dağıtımını değiştirir ve istatistiklerin güncel olmasını sağlar.

Buna karşılık, müşteri tablosundaki bir cinsiyet sütununa ilişkin istatistiklerin hiçbir zaman güncelleştirililmesi gerekmeyebilir. Dağıtımın müşteriler arasında sabit olduğu varsayıldığında, tablo varyasyona yeni satırlar eklemek veri dağıtımını değiştirmez.

Ayrılmış SQL havuzunuz yalnızca bir cinsiyet içeriyorsa ve yeni bir gereksinim birden çok cinsiyete neden olursa cinsiyet sütunuyla ilgili istatistikleri güncelleştirmeniz gerekir.

Daha fazla bilgi için bkz. İstatistikler için genel yönergeler.

İstatistik yönetimi uygulama

Eşzamanlı sorgular arasında engellemeyi veya kaynak çekişmesini önlemek/en aza indirmek amacıyla istatistiklerin yükün sonunda güncelleştirilmesini sağlamak için veri yükleme işleminizi genişletmek genellikle iyi bir fikirdir.

Veri yükü, tabloların boyutlarını ve/veya değer dağılımını en sık değiştirdikleri durumdur. Veri yükleme, bazı yönetim işlemlerini uygulamak için mantıksal bir yerdir.

İstatistiklerinizi güncelleştirmek için aşağıdaki yol gösteren ilkeler sağlanır:

  • Yüklenen her tabloda en az bir istatistik nesnesinin güncelleştirildiğinden emin olun. Bu, istatistik güncelleştirmesinin bir parçası olarak tablo boyutu (satır sayısı ve sayfa sayısı) bilgilerini güncelleştirir.
  • JOIN, GROUP BY, ORDER BY ve DISTINCT yan tümcelerine katılan sütunlara odaklanın.
  • İşlem tarihleri gibi "artan anahtar" sütunlarını daha sık güncelleştirin çünkü bu değerler istatistik histogramına dahil edilmeyecek.
  • Statik dağıtım sütunlarını daha az sık güncelleştirmeyi göz önünde bulundurun.
  • Unutmayın, her istatistik nesnesi sırayla güncelleştirilir. Özellikle çok sayıda istatistik nesnesine sahip geniş tablolar için basit bir uygulama UPDATE STATISTICS <TABLE_NAME> her zaman ideal değildir.

Daha fazla bilgi için bkz . Kardinalite Tahmini.

Örnekler: İstatistik oluşturma

Bu örneklerde istatistik oluşturmak için çeşitli seçeneklerin nasıl kullanılacağı gösterilir. Her sütun için kullandığınız seçenekler, verilerinizin özelliklerine ve sütunun sorgularda nasıl kullanılacağına bağlıdır.

Varsayılan seçeneklerle tek sütunlu istatistikler oluşturma

Bir sütunda istatistik oluşturmak için istatistik nesnesi için bir ad ve sütunun adını belirtin.

Bu söz dizimi tüm varsayılan seçenekleri kullanır. Varsayılan olarak, istatistik oluşturulurken tablonun yüzde 20'si örneklendirilir.

CREATE STATISTICS [statistics_name] ON [schema_name].[table_name]([column_name]);

Örnek:

CREATE STATISTICS col1_stats ON dbo.table1 (col1);

Her satırı inceleyerek tek sütunlu istatistikler oluşturma

Varsayılan örnekleme oranı yüzde 20 çoğu durumda yeterlidir. Ancak örnekleme hızını ayarlayabilirsiniz.

Tablonun tamamını örneklemek için şu söz dizimini kullanın:

CREATE STATISTICS [statistics_name] ON [schema_name].[table_name]([column_name]) WITH FULLSCAN;

Örnek:

CREATE STATISTICS col1_stats ON dbo.table1 (col1) WITH FULLSCAN;

Örnek boyutunu belirterek tek sütunlu istatistikler oluşturma

Alternatif olarak, örnek boyutunu yüzde olarak belirtebilirsiniz:

CREATE STATISTICS col1_stats ON dbo.table1 (col1) WITH SAMPLE = 50 PERCENT;

Yalnızca bazı satırlarda tek sütunlu istatistikler oluşturma

Tablonuzdaki satırların bir bölümüyle ilgili istatistikler de oluşturabilirsiniz. Buna filtrelenmiş istatistik adı verilir.

Örneğin, büyük bir bölümlenmiş tablonun belirli bir bölümünü sorgulamayı planlarken filtrelenmiş istatistikleri kullanabilirsiniz. Yalnızca bölüm değerleriyle ilgili istatistikler oluşturarak istatistiklerin doğruluğu artar ve bu nedenle sorgu performansını geliştirir.

Bu örnek, bir değer aralığına ilişkin istatistikler oluşturur. Değerler, bir bölümdeki değer aralığıyla eşleşecek şekilde kolayca tanımlanabilir.

CREATE STATISTICS stats_col1 ON table1(col1) WHERE col1 > '2000101' AND col1 < '20001231';

Not

Sorgu iyileştiricinin dağıtılmış sorgu planını seçerken filtrelenmiş istatistikleri kullanmayı düşünebilmesi için sorgunun istatistik nesnesinin tanımına sığması gerekir. Önceki örneği kullanarak sorgunun WHERE yan tümcesinin 2000101 ile 20001231 arasında col1 değerleri belirtmesi gerekir.

Tüm seçeneklerle tek sütunlu istatistikler oluşturma

Seçenekleri birlikte de birleştirebilirsiniz. Aşağıdaki örnek, özel örnek boyutuna sahip filtrelenmiş bir istatistik nesnesi oluşturur:

CREATE STATISTICS stats_col1 ON table1 (col1) WHERE col1 > '2000101' AND col1 < '20001231' WITH SAMPLE = 50 PERCENT;

Tam başvuru için bkz. CREATE STATISTICS.

Çok sütunlu istatistikler oluşturma

Çok sütunlu istatistik nesnesi oluşturmak için önceki örnekleri kullanın, ancak daha fazla sütun belirtin.

Not

Sorgu sonucundaki satır sayısını tahmin etmek için kullanılan histogram, yalnızca istatistik nesnesi tanımında listelenen ilk sütun için kullanılabilir.

Bu örnekte histogram product_category üzerindedir. Çapraz sütun istatistikleri product_category ve product_sub_category hesaplanır:

CREATE STATISTICS stats_2cols ON table1 (product_category, product_sub_category) WHERE product_category > '2000101' AND product_category < '20001231' WITH SAMPLE = 50 PERCENT;

product_category ile product_sub_category arasında bir bağıntı olduğundan, bu sütunlara aynı anda erişilirse çok sütunlu istatistik nesnesi yararlı olabilir.

Tablodaki tüm sütunlarda istatistik oluşturma

İstatistik oluşturmanın bir yolu, tabloyu oluşturduktan sonra CREATE STATISTICS komutları vermektir:

CREATE TABLE dbo.table1
(
   col1 int
,  col2 int
,  col3 int
)
WITH
  (
    CLUSTERED COLUMNSTORE INDEX
  )
;

CREATE STATISTICS stats_col1 on dbo.table1 (col1);
CREATE STATISTICS stats_col2 on dbo.table2 (col2);
CREATE STATISTICS stats_col3 on dbo.table3 (col3);

SQL havuzundaki tüm sütunlarda istatistik oluşturmak için saklı yordam kullanma

Ayrılmış SQL havuzu, SQL Server'daki sp_create_stats eşdeğer bir sistem saklı yordamına sahip değildir. Bu saklı yordam, bir SQL havuzundaki istatistik içermeyen her sütunda tek bir sütun istatistik nesnesi oluşturur.

Aşağıdaki örnek, SQL havuzu tasarımınızı kullanmaya başlamanıza yardımcı olur. İhtiyaçlarınıza göre uyarlamaktan çekinmeyin.

CREATE PROCEDURE    [dbo].[prc_sqldw_create_stats]
(   @create_type    tinyint -- 1 default 2 Fullscan 3 Sample
,   @sample_pct     tinyint
)
AS

IF @create_type IS NULL
BEGIN
    SET @create_type = 1;
END;

IF @create_type NOT IN (1,2,3)
BEGIN
    THROW 151000,'Invalid value for @stats_type parameter. Valid range 1 (default), 2 (fullscan) or 3 (sample).',1;
END;

IF @sample_pct IS NULL
BEGIN;
    SET @sample_pct = 20;
END;

IF OBJECT_ID('tempdb..#stats_ddl') IS NOT NULL
BEGIN;
    DROP TABLE #stats_ddl;
END;

CREATE TABLE #stats_ddl
WITH    (   DISTRIBUTION    = HASH([seq_nmbr])
        ,   LOCATION        = USER_DB
        )
AS
WITH T
AS
(
SELECT      t.[name]                        AS [table_name]
,           s.[name]                        AS [table_schema_name]
,           c.[name]                        AS [column_name]
,           c.[column_id]                   AS [column_id]
,           t.[object_id]                   AS [object_id]
,           ROW_NUMBER()
            OVER(ORDER BY (SELECT NULL))    AS [seq_nmbr]
FROM        sys.[tables] t
JOIN        sys.[schemas] s         ON  t.[schema_id]       = s.[schema_id]
JOIN        sys.[columns] c         ON  t.[object_id]       = c.[object_id]
LEFT JOIN   sys.[stats_columns] l   ON  l.[object_id]       = c.[object_id]
                                    AND l.[column_id]       = c.[column_id]
                                    AND l.[stats_column_id] = 1
LEFT JOIN    sys.[external_tables] e    ON    e.[object_id]        = t.[object_id]
WHERE       l.[object_id] IS NULL
AND            e.[object_id] IS NULL -- not an external table
)
SELECT  [table_schema_name]
,       [table_name]
,       [column_name]
,       [column_id]
,       [object_id]
,       [seq_nmbr]
,       CASE @create_type
        WHEN 1
        THEN    CAST('CREATE STATISTICS '+QUOTENAME('stat_'+table_schema_name+ '_' + table_name + '_'+column_name)+' ON '+QUOTENAME(table_schema_name)+'.'+QUOTENAME(table_name)+'('+QUOTENAME(column_name)+')' AS VARCHAR(8000))
        WHEN 2
        THEN    CAST('CREATE STATISTICS '+QUOTENAME('stat_'+table_schema_name+ '_' + table_name + '_'+column_name)+' ON '+QUOTENAME(table_schema_name)+'.'+QUOTENAME(table_name)+'('+QUOTENAME(column_name)+') WITH FULLSCAN' AS VARCHAR(8000))
        WHEN 3
        THEN    CAST('CREATE STATISTICS '+QUOTENAME('stat_'+table_schema_name+ '_' + table_name + '_'+column_name)+' ON '+QUOTENAME(table_schema_name)+'.'+QUOTENAME(table_name)+'('+QUOTENAME(column_name)+') WITH SAMPLE '+CONVERT(varchar(4),@sample_pct)+' PERCENT' AS VARCHAR(8000))
        END AS create_stat_ddl
FROM T
;

DECLARE @i INT              = 1
,       @t INT              = (SELECT COUNT(*) FROM #stats_ddl)
,       @s NVARCHAR(4000)   = N''
;

WHILE @i <= @t
BEGIN
    SET @s=(SELECT create_stat_ddl FROM #stats_ddl WHERE seq_nmbr = @i);

    PRINT @s
    EXEC sp_executesql @s
    SET @i+=1;
END

DROP TABLE #stats_ddl;

Varsayılanları kullanarak tablodaki tüm sütunlarda istatistik oluşturmak için saklı yordamı yürütür.

EXEC [dbo].[prc_sqldw_create_stats] 1, NULL;

Fullscan kullanarak tablodaki tüm sütunlarda istatistik oluşturmak için bu yordamı çağırın.

EXEC [dbo].[prc_sqldw_create_stats] 2, NULL;

Tablodaki tüm sütunlarda örneklenmiş istatistikler oluşturmak için 3 girin ve örnek yüzdesini girin. Bu yordamda yüzde 20 örnek oranı kullanılır.

EXEC [dbo].[prc_sqldw_create_stats] 3, 20;

Örnekler: İstatistikleri güncelleştirme

İstatistikleri güncelleştirmek için şunları yapabilirsiniz:

  • Bir istatistik nesnesini güncelleştirin. Güncelleştirmek istediğiniz istatistik nesnesinin adını belirtin.
  • Tablodaki tüm istatistik nesnelerini güncelleştirin. Belirli bir istatistik nesnesi yerine tablonun adını belirtin.

Belirli bir istatistik nesnesini güncelleştirme

Belirli bir istatistik nesnesini güncelleştirmek için aşağıdaki söz dizimini kullanın:

UPDATE STATISTICS [schema_name].[table_name]([stat_name]);

Örnek:

UPDATE STATISTICS [dbo].[table1] ([stats_col1]);

Belirli istatistik nesnelerini güncelleştirerek, istatistikleri yönetmek için gereken süreyi ve kaynakları en aza indirebilirsiniz. Bunu yapmak için, güncelleştirilecek en iyi istatistik nesnelerinin seçilmesi biraz düşünülmesi gerekir.

Tablodaki tüm istatistikleri güncelleştirme

Bir tablodaki tüm istatistik nesnelerini güncelleştirmek için basit bir yöntem:

UPDATE STATISTICS [schema_name].[table_name];

Örnek:

UPDATE STATISTICS dbo.table1;

UPDATE STATISTICS deyiminin kullanımı kolaydır. Tablodaki tüm istatistikleri güncelleştirdiğini ve bu nedenle gerekenden daha fazla iş gerçekleştirebileceğini unutmayın. Performans sorun değilse, istatistiklerin güncel olmasını garanti etmenin en kolay ve en eksiksiz yolu budur.

Not

Bir tablodaki tüm istatistikleri güncelleştirirken, ayrılmış SQL havuzu her istatistik nesnesinin tablosunu örneklemek için bir tarama yapar. Tablo büyükse ve çok sayıda sütunu ve çok sayıda istatistiki varsa, tek tek istatistikleri ihtiyaca göre güncelleştirmek daha verimli olabilir.

Bir UPDATE STATISTICS yordamın uygulanması için bkz . Geçici Tablolar. Uygulama yöntemi önceki CREATE STATISTICS yordamdan biraz farklıdır, ancak sonuç aynıdır.

Söz diziminin tamamı için bkz . güncelleştirme istatistikleri.

İstatistik meta verileri

İstatistikler hakkında bilgi bulmak için kullanabileceğiniz çeşitli sistem görünümleri ve işlevleri vardır. Örneğin, istatistiklerin en son ne zaman oluşturulduğunu veya güncelleştirildiğini görmek için stats-date işlevini kullanarak istatistik nesnesinin güncel olmayabileceğini görebilirsiniz.

İstatistikler için katalog görünümleri

Bu sistem görünümleri istatistikler hakkında bilgi sağlar:

Katalog görünümü Açıklama
Columns Her sütun için bir satır.
Objects Veritabanındaki her nesne için bir satır.
sys.schemas Veritabanındaki her şema için bir satır.
Stats Her istatistik nesnesi için bir satır.
sys.stats_columns İstatistikler nesnesindeki her sütun için bir satır. sys.columns'a geri bağlanır.
Tables Her tablo için bir satır (dış tablolar içerir).
sys.table_types Her veri türü için bir satır.

İstatistikler için sistem işlevleri

Bu sistem işlevleri istatistiklerle çalışmak için kullanışlıdır:

Sistem işlevi Açıklama
STATS_DATE İstatistik nesnesinin son güncelleştirilildiği tarih.
DBCC SHOW_STATISTICS özet düzeyi ve istatistik nesnesi tarafından anlaşıldığı gibi değerlerin dağılımı hakkında ayrıntılı bilgiler.

İstatistik sütunlarını ve işlevlerini tek bir görünümde birleştirme

Bu görünüm, STATS_DATE() işlevinden istatistiklerle ve sonuçlarla ilgili sütunları bir araya getirir.

CREATE VIEW dbo.vstats_columns
AS
SELECT
        sm.[name]                           AS [schema_name]
,       tb.[name]                           AS [table_name]
,       st.[name]                           AS [stats_name]
,       st.[filter_definition]              AS [stats_filter_definition]
,       st.[has_filter]                     AS [stats_is_filtered]
,       STATS_DATE(st.[object_id],st.[stats_id])
                                            AS [stats_last_updated_date]
,       co.[name]                           AS [stats_column_name]
,       ty.[name]                           AS [column_type]
,       co.[max_length]                     AS [column_max_length]
,       co.[precision]                      AS [column_precision]
,       co.[scale]                          AS [column_scale]
,       co.[is_nullable]                    AS [column_is_nullable]
,       co.[collation_name]                 AS [column_collation_name]
,       QUOTENAME(sm.[name])+'.'+QUOTENAME(tb.[name])
                                            AS two_part_name
,       QUOTENAME(DB_NAME())+'.'+QUOTENAME(sm.[name])+'.'+QUOTENAME(tb.[name])
                                            AS three_part_name
FROM    sys.objects                         AS ob
JOIN    sys.stats           AS st ON    ob.[object_id]      = st.[object_id]
JOIN    sys.stats_columns   AS sc ON    st.[stats_id]       = sc.[stats_id]
                            AND         st.[object_id]      = sc.[object_id]
JOIN    sys.columns         AS co ON    sc.[column_id]      = co.[column_id]
                            AND         sc.[object_id]      = co.[object_id]
JOIN    sys.types           AS ty ON    co.[user_type_id]   = ty.[user_type_id]
JOIN    sys.tables          AS tb ON  co.[object_id]        = tb.[object_id]
JOIN    sys.schemas         AS sm ON  tb.[schema_id]        = sm.[schema_id]
WHERE   1=1
AND     st.[user_created] = 1
;

DBCC SHOW_STATISTICS() örnekleri

DBCC SHOW_STATISTICS() bir istatistik nesnesi içinde tutulan verileri gösterir. Bu veriler üç bölümden oluşur:

  • Üst bilgi
  • Yoğunluk vektöru
  • Histogram

İstatistikler hakkındaki üst bilgi meta verileri. Histogram, istatistik nesnesinin ilk anahtar sütunundaki değerlerin dağılımını görüntüler. Yoğunluk vektörü sütunlar arası bağıntıyı ölçer.

Not

Ayrılmış SQL havuzu, istatistik nesnesindeki tüm verilerle kardinalite tahminlerini hesaplar.

Üst bilgi, yoğunluk ve histogramı göster

Bu basit örnek, istatistik nesnesinin üç parçasını da gösterir:

DBCC SHOW_STATISTICS([<schema_name>.<table_name>],<stats_name>)

Örnek:

DBCC SHOW_STATISTICS (dbo.table1, stats_col1);

DBCC SHOW_STATISTICS() öğesinin bir veya daha fazla bölümünü gösterme

Yalnızca belirli bölümleri görüntülemek istiyorsanız yan tümcesini WITH kullanın ve görmek istediğiniz bölümleri belirtin:

DBCC SHOW_STATISTICS([<schema_name>.<table_name>],<stats_name>) WITH stat_header, histogram, density_vector

Örnek:

DBCC SHOW_STATISTICS (dbo.table1, stats_col1) WITH histogram, density_vector

DBCC SHOW_STATISTICS() farkları

DBCC SHOW_STATISTICS(), ayrılmış SQL havuzunda SQL Server göre daha katı bir şekilde uygulanır:

  • Belgelenmemiş özellikler desteklenmez.
  • Stats_stream kullanılamaz.
  • İstatistik verilerinin belirli alt kümeleri için sonuçlar birleştirilemez. Örneğin JOIN DENSITY_VECTOR STAT_HEADER.
  • NO_INFOMSGS ileti gizleme için ayarlanamaz.
  • İstatistik adlarının etrafındaki köşeli ayraçlar kullanılamaz.
  • İstatistik nesnelerini tanımlamak için sütun adları kullanılamaz.
  • Özel hata 2767 desteklenmiyor.

Sonraki adımlar

Sorgu performansını daha da geliştirmek için bkz . İş yükünüzü izleme