Aracılığıyla paylaş


Ayrılmış SQL havuzunda tablo istatistikleri oluşturma ve güncelleştirme

Bu makalede, ayrılmış SQL havuzundaki tablolarda sorgu iyileştirme istatistikleri oluşturmaya ve güncelleştirmeye yönelik öneriler ve örnekler sağlanır.

İstatistikleri neden kullanmalısınız?

Verileriniz hakkında SQL havuzu ne kadar çok bilgiye sahip olursa, 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üten planı seçer.

Örneğin, sorgunuzun filtrelediği tarihin bir satır döndüreceğini tahmin ederse, optimizatör belirli bir planı seçer. İyileştirici seçilen tarihin bir milyon satır döndürdüğünü tahmin ederse, farklı bir plan seçer.

İ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 için 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 T-SQL komutunu ç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 havuzunuz yapılandırılmamışsa AUTO_CREATE_STATISTICS aşağıdaki komutu çalıştırarak bu özelliği etkinleştirmenizi öneririz. <your-datawarehouse-name> ifadesini ayrılmış SQL havuzunuzun adıyla değiştirin.

ALTER DATABASE <your-datawarehouse-name>
SET AUTO_CREATE_STATISTICS ON

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

  • SELECT
  • INSERT... SELECT
  • CREATE TABLE AS SELECT (CTAS)
  • UPDATE
  • DELETE
  • EXPLAIN birleştirme içerdiğinde ya da bir koşulun varlığı algılandığında

Not

İstatistiklerin otomatik olarak oluşturulması geçici veya dış tablolarda gerçekleştirilmez.

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

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

Not

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

Otomatik istatistikler oluşturulduğunda şu formu alır: _WA_Sys_<8 digit column id in Hex>_<8 digit table id in Hex>. 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 harici bir 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, her gün yeni tarihler eklendikçe 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ğılımını değiştirir ve istatistikleri güncel olmayan hale getirir.

Değerlerin dağılı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ştirmeye yönelik öneriler şunlardır:

İstatistikler ö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 sorguda sorun giderirken sormanız gereken ilk sorulardan biri "İstatistikler güncel mi?"

Bu soru, verilerin yaşına göre yanıtlanamaz. Temel alınan verilerde malzeme değişikliği 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 () satır sayısı ile gerçek satır sayısı (stats_row_countactual_row_count) arasındaki farkı bulur.

    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ştirilmiş olduğunu kontrol ederek istatistiklerinizin yaşını bulun.

    Not

    Bir sütun için değerlerin dağılımında önemli bir değişiklik varsa, istatistikleri en son ne zaman güncelleştirildiklerinden bağımsız olarak 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 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ğılımını değiştirir ve istatistikleri güncel olmayan hale getirir.

Buna karşılık, müşteri tablosundaki bir cinsiyet sütununa ilişkin istatistiklerin hiçbir zaman güncelleştirilmeye gerek olmayabilir. 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ütunundaki istatistikleri güncelleştirmeniz gerekir.

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

İstatistik yönetimini uygulama

Eşzamanlı sorgular arasındaki engellemeyi veya kaynak çekişmesini önlemek veya en aza indirmek için genellikle verilerin yüklenmesi işlemini genişleterek istatistiğin yükün sonunda güncelleştirilmesini sağlamak iyi bir fikirdir.

Veri yükü, tabloların boyutlarını 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österici 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.
  • bu değerler istatistik histogramına dahil olmadığından işlem tarihleri gibi artan anahtar sütunları daha sık güncelleştirmeyi göz önünde bulundurun.
  • Statik dağıtım sütunlarını daha seyrek 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 şekilde UPDATE STATISTICS <TABLE_NAME> uygulamak 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österilmektedir. Her sütun için kullandığınız seçenekler, verilerinizin özelliklerine ve sütunun sorgularda nasıl kullanıldığı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, istatistikler oluşturulurken tablonun yüzde 20'si örneklendirilir.

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

Örneğin:

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 durum için 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;

Örneğin:

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

Örnek boyutu 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 da sorgu performansını artırır.

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çtiğinde filtrelenmiş istatistikleri kullanmayı göz önünde bulundurması 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 metin 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. product_category ve product_sub_category üzerinde çapraz sütun istatistikleri 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;

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

Tablodaki tüm sütunlarda istatistik oluşturma

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

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ğeri bir sistem saklı yordamına sahip değildir. Bu saklı yordam, henüz istatistik içermeyen bir SQL havuzundaki her sütunda tek sütunlu istatistik nesnesi oluşturur.

Aşağıdaki örnek, SQL havuzu tasarımınızı kullanmaya başlamayı gösterir. İ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;

Tüm sütunlarda tablodaki istatistikleri oluşturmak için varsayılanları kullanarak saklı yordamı yürütün.

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]);

Örneğin:

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 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];

Örneğin:

UPDATE STATISTICS dbo.table1;

ifadeyi UPDATE STATISTICS kullanmak 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 olduğunu garanti etmenin en kolay ve en eksiksiz yolu budur.

Not

Bir tablodaki tüm istatistikleri güncelleştirdiğinizde, 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 istatistiği varsa, tek tek istatistikleri ihtiyaca göre güncelleştirmek daha verimli olabilir.

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

Söz diziminin tamamı için bkz İstatistikleri Güncelleştirme.

İ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 olup olmadığını 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
sys.columns Her sütun için bir satır
sys.objects Veritabanındaki her nesne için bir satır
sys.schemas Veritabanındaki her şema için bir satır
sys.stats Her istatistik nesnesi için bir satır
sys.stats_columns İstatistik nesnesindeki her sütun için bir satır; sys.columns'a geri bağlantılar
sys.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ı bilgi

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

Bu görünüm, STATS_DATE() işleviyle ilişkili olan istatistiklerle ve sonuçlarla 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:

  • Başlık
  • Yoğunluk vektöru
  • Histogram Grafiği

İstatistiklerle ilgili ü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ü, çapraz sütun bağıntısını ölçer.

Not

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

Başlık, yoğunluk ve histogramı göster

Bu basit örnek, istatistik nesnesinin üç bölümünü de gösterir:

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

Örneğin:

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

Örneğin:

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

DBCC SHOW_STATISTICS() farkları

DBCC SHOW_STATISTICS() , SQL Server'a kıyasla ayrılmış SQL havuzunda daha katı bir şekilde uygulanır:

  • Belgelenmemiş özellikler desteklenmez.
  • kullanılamıyor Stats_stream.
  • İstatistik verilerinin belirli alt kümeleri için sonuçlar birleştirilemiyor. Örneğin, STAT_HEADER JOIN DENSITY_VECTOR.
  • 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.

DMV'leri kullanarak Azure Synapse Analytics ayrılmış SQL havuzu iş yükünüzü izleme