Aracılığıyla paylaş


Synapse SQL'deki 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?

Verileriniz hakkında ne kadar fazla ayrılmış SQL havuzu bilgisine sahip olursa 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ı şekilde yürütülecek 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 sunar.

İstatistiklerin otomatik olarak oluşturulması

Ayrılmış SQL havuzu motoru, veritabanı AUTO_CREATE_STATISTICS seçeneği ON olarak ayarlandığında eksik 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.

Aşağıdaki komutu çalıştırarak veri ambarınızın AUTO_CREATE_STATISTICS yapılandırılıp yapılandırılmadığını de kontrol edebilirsiniz:

SELECT name, is_auto_create_stats_on
FROM sys.databases

Veri ambarınız AUTO_CREATE_STATISTICS etkinleştirilmediyse 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:

  • SEÇ
  • INSERT-SELECT komutu
  • CTAS
  • GÜNCELLEME
  • SİLMEK
  • Birleştirme içerdiğinde veya bir koşulun varlığı algılandığında EXPLAIN

Uyarı

İstatistiklerin otomatik olarak oluşturulması, geçici veya dış tablolarda yapılmaz.

İ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üşüşü ö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.

Uyarı

İ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ırlar: WA_Sys<8 basamaklı sütun kimliği Hex biçiminde>_<8 basamaklı tablo kimliği Hex biçiminde>. 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, her gün yeni tarihler eklendikçe tarih sütunlarının istatistiklerini güncelleştirmektir. Veri ambarı'na 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ı 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ü Tavsiye
İ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 sorguda sorun 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 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 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.

Uyarı

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 bir veri ambarı içindeki tarih sütunları genellikle sık sık istatistik güncelleştirmelerine ihtiyaç duyar. Veri ambarı'na 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.

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.

Ancak veri ambarınız 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 İstatistikler makalesini gözden geçirin.

İstatistik yönetimini uygulama

İstatistiklerin yük sonunda güncelleştirildiğinden emin olmak 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 de en sık değiştirdikleri zamandır. Bu nedenle, yük işlemi, bazı yönetim işlemlerini uygulamak için mantıklı bir yerdir.

Aşağıdaki yol gösterici ilkeler, yükleme işlemi sırasında istatistiklerinizi güncelleştirmek için sağlanmıştı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.
  • Bu değerler istatistik histogramına dahil edilmeyeceği için işlem tarihleri gibi "artan anahtar" sütunlarını 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ı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]);

Ö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

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

Ayrıca, tablonuzdaki satırların filtrelenmiş istatistik olarak adlandırılan bir bölümünde istatistikler de 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şmeyle 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';

Uyarı

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.

Uyarı

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 ileproduct_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'daki sp_create_stats saklı yordamının bir eşdeğeri olan bir sistem saklı yordamına sahip değildir. Bu saklı prosedür, veritabanında istatistikleri olmayan her sütunda tek bir sütun için 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;

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;

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 girin ve örnek yüzdesini 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]);

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

Örneğin:

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 bu yöntem, istatistiklerin güncel olduğunu garanti etmenin en kolay ve en eksiksiz yoludur.

Uyarı

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

Bir UPDATE STATISTICS prosedürü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 . İ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ü 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'e geri bağlantı yapar.
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ş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şlevindeki istatistiklerle ve sonuçlarla ilişkili 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

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

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.
  • Stats_stream kullanılamaz.
  • İ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.

Sunucusuz SQL havuzundaki istatistikler

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

Uyarı

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

İstatistikleri neden kullanmalısınız?

Sunucusuz SQL havuzu verileriniz hakkında ne kadar çok bilgi edinebilirse, buna karşı 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ı şekilde yürütülecek 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 için sorgu koşulundaki veya birleştirme koşulundaki tek tek sütunlarda istatistikler oluşturur.

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

Uyarı

İ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 örneklemesi ile CSV okunurken örneklemenin desteklenmediğini ve 100%'den küçük ö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ının biraz düşmesine 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ının değişmesine ve istatistiklerin güncelliğini yitirmesine neden olur. Bu durumda istatistiklerin güncelleştirilmesi gerekir.

Sunucusuz SQL havuzu, veriler önemli ölçüde değiştirilirse OPENROWSET sütunları için 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 eskidiğinde yenileri oluşturulur. Algoritma, verilerin üzerinden 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 yapılan istatistikler hiçbir zaman bayat olarak bildirilmez.

Uyarı

İstatistik örneklemesinin otomatik olarak yeniden yapılması 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 örneklemesi ile CSV okurken örneklemenin desteklenmediğini ve 100%'den küçük örnekleme yüzdesiyle istatistiklerin otomatik olarak yeniden yapılandırılmasının gerçekleşmeyeceğini unutmayın. Bu durumda istatistikleri elle silip yeniden oluşturmanız gerekir. İstatistikleri silme ve oluşturma ile ilgili aşağıdaki örnekleri inceleyin. 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 sorguda sorun 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.

Uyarı

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.

İstatistik yönetimini uygulama

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

İstatistiklerinizi güncelleştirmek için aşağıdaki yol gösterici 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 ifadelerine katılan sütunlara odaklanın.
  • bu değerler istatistik histogramına dahil edilmeyeceğ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, Azure Synapse sunucusuz SQL havuzlarında 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ı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.

Uyarı

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

sp_create_openrowset_statistics ve sp_drop_openrowset_statistics yürütmek için aşağıdaki izinler gereklidir: TOPLU İŞLEMLERİ YÖNETME veya VERİTABANI TOPLU İŞLEMLERİNİ YÖNETME.

İstatistik oluşturmak için aşağıdaki saklı prosedür 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 bir Transact-SQL deyimi belirtir. Kullanılacak veri örneklerini belirtmek için TABLESAMPLE kullanabilirsiniz. TABLESAMPLE belirtilmezse, FULLSCAN kullanılır.

<tablesample_clause> ::= TABLESAMPLE ( sample_number PERCENT )

Uyarı

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 ile 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% 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 boyutu belirterek tek sütunlu istatistikler oluşturma

Örnek boyutu 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 silmeniz 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'

Uyarı

sp_create_openrowset_statistics ve sp_drop_openrowset_statistics yürütmek için aşağıdaki izinler gereklidir: TOPLU İŞLEMLERİ YÖNETME veya VERİTABANI TOPLU İŞLEMLERİNİ YÖNETME.

Argümanlar: [ @stmt = ] N'statement_text' - İstatistikler oluşturulurken kullanılan Transact-SQL deyimini belirtir.

Veri kümesindeki dosyayı temel alan population.csv yıl sütununa ilişkin istatistikleri 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österilmektedir. 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.

Uyarı

Ş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, istatistiklerin oluşturulacağı dış tabloyu belirtir.

FULLSCAN, tüm satırları tarayarak istatistikleri hesapla. FULLSCAN ve ÖRNEK YÜZDE 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.

Uyarı

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 ile 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 boyutu 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 silmeniz ve oluşturmanız gerekir. Önce istatistikleri silin.

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.

Uyarı

İ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ü 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'e geri bağlantı yapar.
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ştirilmiş olduğu tarih.

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

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