Synapse SQL'de istatistikler

Bu makalede Synapse SQL kaynaklarını kullanarak sorgu iyileştirme istatistikleri oluşturma ve güncelleştirme önerileri ve örnekleri verilmiştir: ayrılmış SQL havuzu ve sunucusuz SQL havuzu.

Ayrılmış SQL havuzundaki istatistikler

İstatistikleri neden kullanmalısınız?

Verilerinizi ne kadar çok ayrılmış SQL havuzu bilirse sorgular o kadar hızlı yürütülebilir. Verileri ayrılmış bir SQL havuzuna yükledikten sonra verilerinizle ilgili istatistikleri toplamak, sorgu iyileştirme 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ı

Ayrılmış SQL havuzu altyapısı, veritabanı AUTO_CREATE_STATISTICS seçeneği olarak ayarlandığında ONeksik istatistikler için gelen kullanıcı sorgularını analiz eder. İstatistikler eksikse sorgu iyileştiricisi sorgu koşulundaki veya birleştirme koşulundaki tek tek sütunlarda istatistikleri oluşturur.

Bu işlev sorgu planı için kardinalite tahminlerini geliştirmek için kullanılır.

Önemli

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

Veri ambarınızın AUTO_CREATE_STATISTICS yapılandırılıp yapılandırılmadığını denetlemek için aşağıdaki komutu çalıştırabilirsiniz:

SELECT name, is_auto_create_stats_on
FROM sys.databases

Veri ambarınızın AUTO_CREATE_STATISTICS etkinleştirilmemişse 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 gerçekleştirilir. 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üşüş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 biçimi alır: Hex>_<8 basamaklı tablo kimliğinde 8 basamaklı sütun kimliği WA_Sys<.> 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 ve bu bir 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. Veri ambara 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ğılımı genellikle değişmediğinden, müşteri tablosundaki bir ülke veya 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, veri ambarınız yalnızca bir ülke veya bölge içeriyorsa ve yeni bir ülke veya bölgeden veri getirdiğinizde, ülke veya bölge sütunundaki istatistikleri güncelleştirmeniz gerekir.

İstatistikleri güncelleştirmeye yönelik öneriler şunlardır:

Tür Ö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.

Son istatistik güncelleştirmesini belirleme

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 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 gerçekleştiğinde , 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 kullanılabilecek bir dinamik yönetim görünümü yoktur. İstatistiklerinizin yaşını bilmek size resmin bir kısmını sağlayabilir.

İstatistiklerinizin her tabloda en son ne zaman güncelleştirildiğini belirlemek için aşağıdaki sorguyu kullanabilirsiniz.

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, veri ambarında tarih sütunları genellikle sık istatistik güncelleştirmelerine ihtiyaç duyar. Veri ambara 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.

Müşteri tablosundaki bir cinsiyet sütununa ilişkin istatistikler hiçbir zaman güncelleştirilmeye gerek duymayabilir. 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 veri ambarınız yalnızca bir cinsiyet içeriyorsa ve yeni bir gereksinim birden çok cinsiyete neden olursa cinsiyet sütununa ilişkin istatistikleri güncelleştirmeniz gerekir.

Daha fazla bilgi için İstatistikler makalesini gözden geçirin.

İstatistik yönetimini uygulama

İstatistiklerin 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ı, değer dağılımını veya her ikisini en sık değiştirdikleri durumdur. Bu nedenle, yük işlemi bazı yönetim işlemlerini uygulamak için mantıksal bir yerdir.

Yükleme işlemi sırasında istatistiklerinizi 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 işlem, 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, ayrılmış SQL havuzu istatistik oluşturduğunda tablonun yüzde 20'sini örneklemektedir.

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

Başka bir seçeneğiniz de örnek boyutunu yüzde olarak belirtmektir:

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 filtrelenmiş istatistik olarak adlandırılan bir bölümünde de istatistik oluşturabilirsiniz.

Ö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. Sorgu performansında da bir geliştirmeyle karşılaşacaksınız.

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ştiricisinin 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 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. Bu tabloyu sorgularken, çok sütunlu istatistikler birleştirmeler, GROUP BY toplamaları, ayrı sayılar ve WHERE filtreleri için kardinalite tahminlerini geliştirir (birincil istatistik sütunu filtrenin bir parçası olduğu sürece).

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

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

SQL havuzu, SQL Server'de ile eşdeğer sp_create_stats bir sistem saklı yordamına sahip değildir. Bu saklı yordam, veritabanının istatistikleri olmayan her sütununda tek bir sütun istatistik nesnesi oluşturur.

Aşağıdaki örnek, veritabanı 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 istatistikler oluşturmak için saklı yordamı yürütür.

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

Tam tarama kullanarak tablodaki tüm sütunlarda istatistik oluşturmak için şu yordamı çağırın:

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

Tablodaki tüm sütunlarda örneklenmiş istatistikler oluşturmak için 3 değerini ve örnek yüzdeyi girin. Aşağıdaki yordamda yüzde 20 örnek oranı kullanılmaktadı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. Bu eylem, güncelleştirilecek en iyi istatistik nesnelerini seçmek için biraz düşünme gerektirir.

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 gerekenden daha fazla çalışma istendiğini unutmayın.

Performans sorun değilse, istatistiklerin güncel olduğunu garanti etmenin en kolay ve en eksiksiz yolu bu yöntemdir.

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 ihtiyaç temelinde güncelleştirmek daha verimli olabilir.

Bir yordamın UPDATE STATISTICS 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 . İ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, STATS_DATE() işlevini kullanarak bir istatistik nesnesinin güncel olup olmadığını görebilirsiniz. STATS_DATE() istatistiklerin en son ne zaman oluşturulduğunu veya güncelleştirildiğini görmenizi sağlar.

İ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ü Description
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 İstatistik 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 Description
STATS_DATE İstatistik nesnesinin son güncelleştirilmiş olduğu 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

Üst bilgi, istatistiklerle ilgili meta verilerdir. 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. 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()SQL Server göre ayrılmış SQL havuzunda daha katı bir şekilde uygulanır:

  • Belgelenmemiş özellikler desteklenmez.
  • Stats_stream kullanılamaz.
  • İstatistik verilerinin belirli alt kümeleri için sonuçlar birleştirilamıyor. Ö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.

Sunucusuz SQL havuzundaki istatistikler

İstatistikler, belirli bir veri kümesi (depolama yolu) için belirli bir sütuna göre oluşturulur.

Not

LOB sütunları için istatistik oluşturulamaz.

İstatistikleri neden kullanmalısınız?

Sunucusuz SQL havuzu verileriniz hakkında ne kadar çok bilgi sahibi olursa, bu havuz üzerinde o kadar hızlı sorgu yürütebilir. Verilerinizle ilgili istatistik toplamak, sorgularınızı iyileştirmek için yapabileceğiniz en önemli şeylerden biridir.

Sunucusuz 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 seçer.

İstatistiklerin otomatik olarak oluşturulması

Sunucusuz 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.

SELECT deyimi istatistiklerin otomatik olarak oluşturulmasını tetikler.

Not

İstatistik örneklemesinin otomatik olarak oluşturulması için örnekleme kullanılır ve çoğu durumda örnekleme yüzdesi %100'den az olur. Bu akış her dosya biçimi için aynıdır. Ayrıştırıcı sürüm 1.0 örnekleme ile CSV okunurken örneklemenin desteklenmediğini ve %100'den az örnekleme yüzdesiyle otomatik istatistik oluşturmanın gerçekleşmeyeceğini unutmayın. Tahmini düşük kardinaliteye (satır sayısı) sahip küçük tablolar için otomatik istatistik oluşturma işlemi %100 örnekleme yüzdesiyle tetiklenir. Bu temelde tam taramanın tetiklendiğini ve ayrıştırıcı sürüm 1.0 ile CSV için bile otomatik istatistiklerin oluşturulduğu anlamına gelir.

İ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, hedeflenen dosyaların boyutuna bağlıdır.

İstatistikleri el ile oluşturma

Sunucusuz SQL havuzu, istatistikleri el ile oluşturmanıza olanak tanır. CSV ile ayrıştırıcı sürümü 1.0 kullanıyorsanız, bu ayrıştırıcı sürümü örneklemeyi desteklemediğinden büyük olasılıkla el ile istatistik oluşturmanız gerekir. Örnekleme yüzdesi %100 olmadığı sürece ayrıştırıcı sürüm 1.0 durumunda istatistiklerin otomatik olarak oluşturulması gerçekleşmez.

İstatistikleri el ile oluşturma yönergeleri için aşağıdaki örneklere bakın.

İstatistikleri güncelleştirme

Dosyalardaki verilerde yapılan değişiklikler, dosyaların silinmesi ve eklenmesi, veri dağıtım değişikliklerine neden olur ve istatistiklerin güncel olmasını sağlar. Bu durumda istatistiklerin güncelleştirilmesi gerekir.

Sunucusuz SQL havuzu, veriler önemli ölçüde değiştirilirse istatistikleri otomatik olarak yeniden oluşturur. İstatistikler otomatik olarak her oluşturulduğunda veri kümesinin geçerli durumu da kaydedilir: dosya yolları, boyutlar, son değişiklik tarihleri.

İstatistikler eski olduğunda yeni istatistikler oluşturulur. Algoritma, verilerden geçer ve veri kümesinin geçerli durumuyla karşılaştırır. Değişikliklerin boyutu belirli bir eşikten büyükse eski istatistikler silinir ve yeni veri kümesi üzerinde yeniden oluşturulur.

El ile istatistikler hiçbir zaman eski olarak bildirilir.

Not

İstatistiklerin otomatik olarak yeniden oluşturulacağı örnekleme için örnekleme kullanılır ve çoğu durumda örnekleme yüzdesi %100'den az olacaktır. Bu akış her dosya biçimi için aynıdır. Ayrıştırıcı sürüm 1.0 örnekleme ile CSV okunurken örneklemenin desteklenmediğini ve %100'den az örnekleme yüzdesiyle istatistiklerin otomatik olarak yeniden yapılandırılmasının gerçekleşmeyeceğini unutmayın. Bu durumda istatistikleri el ile bırakmanız ve yeniden oluşturmanız gerekir. İstatistikleri bırakma ve oluşturma hakkında aşağıdaki örnekleri gözden geçirin. Tahmini düşük kardinaliteye (satır sayısı) sahip küçük tablolar için otomatik istatistik rekreasyonu %100 örnekleme yüzdesiyle tetiklenir. Bu temelde tam taramanın tetiklendiğini ve ayrıştırıcı sürüm 1.0 ile CSV için bile otomatik istatistiklerin oluşturulduğu anlamına gelir.

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

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.

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.

İstatistik yönetimini uygulama

Verilerin dosya ekleme, silme veya değiştirme yoluyla önemli ölçüde değiştirildiğinde istatistiklerin güncelleştirilmesini sağlamak için veri işlem hattınızı genişletmek isteyebilirsiniz.

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

  • Veri kümesinde en az bir istatistik nesnesinin güncelleştirildiğinden emin olun. Bu, istatistik güncelleştirmesinin bir parçası olarak boyut (satır sayısı ve sayfa sayısı) bilgilerini güncelleştirir.
  • WHERE, JOIN, GROUP BY, ORDER BY ve DISTINCT yan tümcelerine katılan sütunlara odaklanın.
  • bu değerler istatistik histogramına eklenmeyeceği için işlem tarihleri gibi "artan anahtar" sütunlarını daha sık güncelleştirin.
  • Statik dağıtım sütunlarını daha az sıklıkta güncelleştirin.

Daha fazla bilgi için bkz . Kardinalite Tahmini.

Örnekler: OPENROWSET yolunda sütun için istatistik oluşturma

Aşağıdaki örneklerde, sunucusuz SQL havuzlarında istatistik oluşturmak için çeşitli seçeneklerin nasıl kullanılacağı Azure Synapse 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. Bu örneklerde kullanılan saklı yordamlar hakkında daha fazla bilgi için, yalnızca sunucusuz SQL havuzları için geçerli olan sys.sp_create_openrowset_statistics ve sys.sp_drop_openrowset_statistics gözden geçirin.

Not

Şu anda yalnızca tek sütunlu istatistikler oluşturabilirsiniz.

ve sp_drop_openrowset_statisticsyürütmek sp_create_openrowset_statistics için aşağıdaki izinler gereklidir: TOPLU İşlemLERİ YÖNET veya VERİtABANI TOPLU İşlemLerİ YÖNET.

İstatistikleri oluşturmak için aşağıdaki saklı yordam kullanılır:

sys.sp_create_openrowset_statistics [ @stmt = ] N'statement_text'

Bağımsız değişkenler: [ @stmt = ] N'statement_text' - İstatistikler için kullanılacak sütun değerlerini döndürecek transact-SQL deyimini belirtir. Kullanılacak veri örneklerini belirtmek için TABLESAMPLE kullanabilirsiniz. TABLESAMPLE belirtilmezse, FULLSCAN kullanılır.

<tablesample_clause> ::= TABLESAMPLE ( sample_number PERCENT )

Not

Ayrıştırıcı sürüm 1.0 kullanıyorsanız CSV örneklemesi çalışmaz, ayrıştırıcı sürümü 1.0 olan CSV için yalnızca FULLSCAN desteklenir.

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

Bir sütunda istatistik oluşturmak için, istatistiklere ihtiyacınız olan sütunu döndüren bir sorgu sağlayın.

Varsayılan olarak, istatistikleri el ile oluştururken aksini belirtmezseniz sunucusuz SQL havuzu istatistik oluştururken veri kümesinde sağlanan verilerin %100'unu kullanır.

Örneğin, us_population.csv dosyasını temel alarak veri kümesinin popülasyon sütunu için varsayılan seçeneklerle (FULLSCAN) istatistikler oluşturmak için:


EXEC sys.sp_create_openrowset_statistics N'SELECT 
    population
FROM OPENROWSET(
    BULK ''Https://azureopendatastorage.blob.core.windows.net/censusdatacontainer/raw_us_population_county/us_population.csv'',
    FORMAT = ''CSV'',
    PARSER_VERSION = ''2.0'',
    HEADER_ROW = TRUE)
AS [r]'

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

Örnek boyutunu yüzde olarak belirtebilirsiniz:

/* make sure you have credentials for storage account access created
IF EXISTS (SELECT * FROM sys.credentials WHERE name = 'https://azureopendatastorage.blob.core.windows.net/censusdatacontainer')
DROP CREDENTIAL [https://azureopendatastorage.blob.core.windows.net/censusdatacontainer]
GO

CREATE CREDENTIAL [https://azureopendatastorage.blob.core.windows.net/censusdatacontainer]  
WITH IDENTITY='SHARED ACCESS SIGNATURE',  
SECRET = ''
GO
*/

EXEC sys.sp_create_openrowset_statistics N'SELECT payment_type
FROM OPENROWSET(
        BULK ''https://sqlondemandstorage.blob.core.windows.net/parquet/taxi/year=2018/month=6/*.parquet'',
         FORMAT = ''PARQUET''
    ) AS [nyc]
    TABLESAMPLE(5 PERCENT)
'

Örnekler: İstatistikleri güncelleştirme

İstatistikleri güncelleştirmek için istatistikleri bırakmanız ve oluşturmanız gerekir. Daha fazla bilgi için sys.sp_create_openrowset_statistics ve sys.sp_drop_openrowset_statistics gözden geçirin.

Saklı sys.sp_drop_openrowset_statistics yordam istatistikleri bırakmak için kullanılır:

sys.sp_drop_openrowset_statistics [ @stmt = ] N'statement_text'

Not

ve sp_drop_openrowset_statisticsyürütmek sp_create_openrowset_statistics için aşağıdaki izinler gereklidir: TOPLU İşlemLERİ YÖNET veya VERİtABANI TOPLU İşlemLerİ YÖNET.

Bağımsız değişkenler: [ @stmt = ] N'statement_text' - İstatistikler oluşturulduğunda kullanılan Transact-SQL deyiminin aynısını belirtir.

Veri kümesindeki dosyayı temel alan population.csv yıl sütununun istatistiklerini güncelleştirmek için istatistikleri bırakmanız ve oluşturmanız gerekir:

EXEC sys.sp_drop_openrowset_statistics N'SELECT payment_type
FROM OPENROWSET(
        BULK ''https://sqlondemandstorage.blob.core.windows.net/parquet/taxi/year=2018/month=6/*.parquet'',
         FORMAT = ''PARQUET''
    ) AS [nyc]
    TABLESAMPLE(5 PERCENT)
'
GO

/* make sure you have credentials for storage account access created
IF EXISTS (SELECT * FROM sys.credentials WHERE name = 'https://azureopendatastorage.blob.core.windows.net/censusdatacontainer')
DROP CREDENTIAL [https://azureopendatastorage.blob.core.windows.net/censusdatacontainer]
GO

CREATE CREDENTIAL [https://azureopendatastorage.blob.core.windows.net/censusdatacontainer]  
WITH IDENTITY='SHARED ACCESS SIGNATURE',  
SECRET = ''
GO
*/

EXEC sys.sp_create_openrowset_statistics N'SELECT payment_type
FROM OPENROWSET(
        BULK ''https://sqlondemandstorage.blob.core.windows.net/parquet/taxi/year=2018/month=6/*.parquet'',
         FORMAT = ''PARQUET''
    ) AS [nyc]
    TABLESAMPLE(5 PERCENT)
'

Örnekler: Dış tablo sütunu için istatistik oluşturma

Aşağıdaki ö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.

Not

Şu anda yalnızca tek sütunlu istatistikler oluşturabilirsiniz.

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

CREATE STATISTICS statistics_name
ON { external_table } ( column )
    WITH
        { FULLSCAN
          | [ SAMPLE number PERCENT ] }
        , { NORECOMPUTE }

Bağımsız Değişkenler: external_table İstatistiklerin oluşturulması gereken dış tabloyu belirtir.

FULLSCAN tüm satırları tarayarak istatistikleri hesaplar. FULLSCAN ve SAMPLE %100 aynı sonuçlara sahiptir. FULLSCAN, SAMPLE seçeneğiyle kullanılamaz.

ÖRNEK sayı YÜZDESİ Sorgu iyileştiricisinin istatistik oluştururken kullanması için tablodaki veya dizine alınan görünümdeki satırların yaklaşık yüzdesini veya sayısını belirtir. Sayı 0 ile 100 arasında olabilir.

ÖRNEK, FULLSCAN seçeneğiyle kullanılamaz.

Not

Ayrıştırıcı sürüm 1.0 kullanıyorsanız CSV örneklemesi çalışmaz, ayrıştırıcı sürümü 1.0 olan CSV için yalnızca FULLSCAN desteklenir.

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

CREATE STATISTICS sState
    on census_external_table (STATENAME)
    WITH FULLSCAN, NORECOMPUTE

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

-- following sample creates statistics with sampling 5%
CREATE STATISTICS sState
    on census_external_table (STATENAME)
    WITH SAMPLE 5 percent, NORECOMPUTE

Örnekler: İstatistikleri güncelleştirme

İstatistikleri güncelleştirmek için istatistikleri bırakmanız ve oluşturmanız gerekir. Önce istatistikleri bırakın:

DROP STATISTICS census_external_table.sState

ve istatistikler oluşturun:

CREATE STATISTICS sState
    on census_external_table (STATENAME)
    WITH FULLSCAN, NORECOMPUTE

İ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, STATS_DATE() işlevini kullanarak bir istatistik nesnesinin güncel olup olmadığını görebilirsiniz. STATS_DATE(), istatistiklerin en son ne zaman oluşturulduğunu veya güncelleştirildiğini görmenizi sağlar.

Not

İstatistik meta verileri yalnızca dış tablo sütunları için kullanılabilir. OPENROWSET sütunları için istatistik meta verileri kullanılamaz.

İ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ü Description
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 Description
STATS_DATE İstatistik nesnesinin son güncelleştirilildiği tarih.

İ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   st.[user_created] = 1
;

Sonraki adımlar

Ayrılmış SQL havuzu için sorgu performansını daha da geliştirmek için bkz. İş yükünüzü izleme ve Ayrılmış SQL havuzu için en iyi yöntemler.

Sunucusuz SQL havuzu için sorgu performansını daha da geliştirmek için bkz. Sunucusuz SQL havuzu için en iyi yöntemler.