Aracılığıyla paylaş


CREATE STATISTICS (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft FabricAmbarı'nda Azure Synapse AnalyticsSQL analytics uç noktası

Tablonun bir veya daha fazla sütunu, dizinli görünüm veya dış tablo üzerinde sorgu iyileştirme istatistikleri oluşturur. Çoğu sorgu için sorgu iyileştiricisi zaten yüksek kaliteli bir sorgu planı için gerekli istatistikleri oluşturur; birkaç durumda, sorgu performansını geliştirmek için sorgu tasarımıyla CREATE STATISTICS ek istatistikler oluşturmanız veya bu tasarımı değiştirmeniz gerekir.

Daha fazla bilgi edinmek için bkz. İstatistikler.

Uyarı

Microsoft Fabric'teki istatistikler hakkında daha fazla bilgi için bkz. Doku veri ambarında istatistikler.

Transact-SQL söz dizimi kuralları

Sözdizimi

SQL Server, Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği için söz dizimi.

-- Create statistics on an external table
CREATE STATISTICS statistics_name
ON { table_or_indexed_view_name } ( column [ , ...n ] )
    [ WITH FULLSCAN ] ;

-- Create statistics on a regular table or indexed view
CREATE STATISTICS statistics_name
ON { table_or_indexed_view_name } ( column [ , ...n ] )
    [ WHERE <filter_predicate> ]
    [ WITH
        [ FULLSCAN
            [ [ , ] PERSIST_SAMPLE_PERCENT = { ON | OFF } ]
          | SAMPLE number { PERCENT | ROWS }
            [ [ , ] PERSIST_SAMPLE_PERCENT = { ON | OFF } ]
          | <update_stats_stream_option> [ , ...n ]
        [ [ , ] NORECOMPUTE ]
        [ [ , ] INCREMENTAL = { ON | OFF } ]
        [ [ , ] MAXDOP = max_degree_of_parallelism ]
        [ [ , ] AUTO_DROP = { ON | OFF } ]
        ]
    ];

<filter_predicate> ::=
    <conjunct> [ AND <conjunct> ]

<conjunct> ::=
    <disjunct> | <comparison>

<disjunct> ::=
        column_name IN (constant , ...)

<comparison> ::=
        column_name <comparison_op> constant

<comparison_op> ::=
    IS | IS NOT | = | <> | != | > | >= | !> | < | <= | !<

<update_stats_stream_option> ::=
    [ STATS_STREAM = stats_stream ]
    [ ROWCOUNT = numeric_constant ]
    [ PAGECOUNT = numeric_constant ]

Azure Synapse Analytics ve Analytics Platform Sistemi (PDW) için söz dizimi.

CREATE STATISTICS statistics_name
    ON { database_name.schema_name.table_name | schema_name.table_name | table_name }
    ( column_name  [ , ...n ] )
    [ WHERE <filter_predicate> ]
    [ WITH {
           FULLSCAN
           | SAMPLE number PERCENT
      }
    ]
[ ; ]

<filter_predicate> ::=
    <conjunct> [ AND <conjunct> ]

<conjunct> ::=
    <disjunct> | <comparison>

<disjunct> ::=
        column_name IN (constant , ...)

<comparison> ::=
        column_name <comparison_op> constant

<comparison_op> ::=
    IS | IS NOT | = | <> | != | > | >= | !> | < | <= | !<

Microsoft Fabric için söz dizimi.

CREATE STATISTICS statistics_name
    ON { database_name.schema_name.table_name | schema_name.table_name | table_name }
    ( column_name )
    [ WITH {
           FULLSCAN
           | SAMPLE number PERCENT
      }
    ]
[ ; ]

Tartışmalar

statistics_name

Oluşturulacak istatistiklerin adı.

table_or_indexed_view_name

İstatistiklerin oluşturulacağı tablonun, dizinli görünümün veya dış tablonun adı. Başka bir veritabanında istatistik oluşturmak için uygun bir tablo adı belirtin.

column [ ,... n ]

İstatistiklere eklenecek bir veya daha fazla sütun. Sütunlar soldan sağa öncelik sırasına göre olmalıdır. Histogramı oluşturmak için yalnızca ilk sütun kullanılır. Tüm sütunlar, yoğunluk olarak adlandırılan çapraz sütun bağıntı istatistikleri için kullanılır.

Dizin anahtarı sütunu olarak belirtilebilen herhangi bir sütunu aşağıdaki özel durumlarla belirtebilirsiniz:

  • xml, tam metin ve FILESTREAM sütunları belirtilemiyor.

  • Hesaplanan sütunlar yalnızca ve QUOTED_IDENTIFIER veritabanı ayarları ise ARITHABORTONbelirtilebilir.

  • Tür ikili sıralamayı destekliyorsa CLR kullanıcı tanımlı tür sütunları belirtilebilir. Yöntemlerin deterministik olarak işaretlenmesi durumunda kullanıcı tanımlı tür sütununun yöntem çağrıları olarak tanımlanan hesaplanan sütunlar belirtilebilir.

WHERE <filter_predicate>

İstatistik nesnesi oluşturulurken eklenecek satırların bir alt kümesini seçmek için bir ifade belirtir. Filtre koşuluyla oluşturulan istatistiklere filtrelenmiş istatistikler adı verilir. Filtre koşulu basit karşılaştırma mantığı kullanır ve hesaplanan sütuna, UDT sütununa, uzamsal veri türü sütununa veya hiyerarşiKIM veri türü sütununa başvuramaz. Değişmez değerleri kullanan NULL karşılaştırmalara karşılaştırma işleçleriyle izin verilmez. Bunun yerine IS NULL ve IS NOT NULL işleçlerini kullanın.

Production.BillOfMaterials tablosu için filtre koşullarının bazı örnekleri aşağıda verilmiştir:

  • WHERE StartDate > '20000101' AND EndDate <= '20000630'
  • WHERE ComponentID IN (533, 324, 753)
  • WHERE StartDate IN ('20000404', '20000905') AND EndDate IS NOT NULL

Filtre önkoşulları hakkında daha fazla bilgi için bkz. Filtrelenmiş dizinler oluşturma.

FULLSCAN

Şunlar için geçerlidir: SQL Server 2016 (13.x) SP 1 CU 4, SQL Server 2017 (14.x) CU 1 ve sonraki sürümleri

Tüm satırları tarayarak istatistikleri hesaplama. FULLSCAN ve SAMPLE 100 PERCENT aynı sonuçlara sahip olur. FULLSCAN seçeneğiyle SAMPLE kullanılamaz.

Atlandığında, SQL Server istatistikleri oluşturmak için örnekleme kullanır ve yüksek kaliteli bir sorgu planı oluşturmak için gereken örnek boyutunu belirler.

Microsoft Fabric'teki Ambar'da yalnızca tek sütunlu FULLSCAN ve tek sütun SAMPLEtabanlı istatistikler desteklenir. Hiçbir seçenek dahil SAMPLE olmadığında istatistikler oluşturulur.

ÖRNEK numarası { YÜZDE | SATIRSAY }

Sorgu iyileştiricinin istatistik oluştururken kullanması için tablo veya dizinlenmiş görünümde yaklaşık yüzdeyi veya satır sayısını belirtir. içinPERCENT, sayı 0 ile 100 arasında olabilir ve için ROWSsayı 0'dan toplam satır sayısına kadar olabilir. Sorgu iyileştirici örneklerinin gerçek yüzde değeri veya satır sayısı, belirtilen yüzde veya sayıyla eşleşmeyebilir. Örneğin, sorgu iyileştiricisi bir veri sayfasındaki tüm satırları tarar.

SAMPLE , varsayılan örneklemeye göre sorgu planının en iyi durumda olmadığı özel durumlar için kullanışlıdır. Çoğu durumda, sorgu iyileştiricisi zaten örnekleme kullandığından ve yüksek kaliteli sorgu planları oluşturmak için gereken istatistiksel olarak önemli örnek boyutunu varsayılan olarak belirlediğinden belirtmek gerekmez SAMPLE .

SAMPLE FULLSCAN seçeneğiyle kullanılamaz. Belirtildiğinde SAMPLE veya FULLSCAN belirtilmediğinde, sorgu iyileştiricisi örneklenmiş verileri kullanır ve varsayılan olarak örnek boyutunu hesaplar.

veya 0 ROWSbelirtilmesine 0 PERCENT karşı öneririz. 0 PERCENT veya 0 ROWS belirtildiğinde istatistik nesnesi oluşturulur, ancak istatistik verileri içermez.

Microsoft Fabric'teki Ambar'da yalnızca tek sütunlu FULLSCAN ve tek sütun SAMPLEtabanlı istatistikler desteklenir. Hiçbir seçenek dahil FULLSCAN olmadığında istatistikler oluşturulur.

PERSIST_SAMPLE_PERCENT = { ON | KAPALI }

olduğunda ONistatistikler, örnekleme yüzdesini açıkça belirtmeyen sonraki güncelleştirmeler için oluşturma örnekleme yüzdesini korur. olduğunda OFF, istatistik örnekleme yüzdesi, açıkça örnekleme yüzdesi belirtmeyen sonraki güncelleştirmelerde varsayılan örneklemeye sıfırlanır. Varsayılan değer: OFF.

Uyarı

Tablo kesilirse, kesilen yığın veya B ağacı (HoBT) üzerinde oluşturulan tüm istatistikler varsayılan örnekleme yüzdesini kullanmaya geri döner. Benzer şekilde, satır içermeyen bir nesnede istatistikler güncelleştirilirse, daha önce yapılandırılmış olsa PERSIST_SAMPLE_PERCENT bile varsayılan örnekleme yüzdesini kullanmaya geri döner.

STATS_STREAM = stats_stream

Yalnızca bilgilendirme amacıyla tanımlanır. Desteklenmiyor. Gelecekteki uyumluluk garanti edilmemektedir.

NORECOMPUTE

statistics_name için otomatik istatistik güncelleştirme seçeneğini AUTO_STATISTICS_UPDATEdevre dışı bırakın. Bu seçenek belirtilirse, sorgu iyileştirici statistics_name için devam eden istatistik güncelleştirmelerini tamamlar ve gelecekteki güncelleştirmeleri devre dışı bırakır.

İstatistik güncelleştirmelerini yeniden etkinleştirmek için DROP STATISTICS ile istatistikleri kaldırın ve seçeneği olmadan NORECOMPUTE çalıştırınCREATE STATISTICS.

Uyarı

İstatistiklerin otomatik olarak güncelleştirilmesini devre dışı bırakırsanız, Sorgu İyileştiricisi'nin tabloyu içeren sorgular için en uygun yürütme planlarını seçmesini engelleyebilir. Bu seçeneği tedbirli bir şekilde ve yalnızca uygun bir veritabanı yöneticisi tarafından kullanmanız gerekir.

Seçeneği hakkında AUTO_STATISTICS_UPDATE daha fazla bilgi için bkz. ALTER DATABASE SET options. İstatistik güncelleştirmelerini devre dışı bırakma ve yeniden etkinleştirme hakkında daha fazla bilgi için bkz. İstatistikler.

ARTıMLı = { ON | KAPALI }

için geçerlidir: SQL Server 2014 (12.x) ve sonraki sürümler

olduğunda ON, oluşturulan istatistikler bölüm istatistiklerine göredir. olduğunda OFF, tüm bölümler için istatistikler birleştirilir. Varsayılan değer: OFF.

Bölüm başına istatistikler desteklenmiyorsa bir hata oluşturulur. Artımlı istatistikler aşağıdaki istatistik türleri için desteklenmez:

  • Temel tabloyla bölümle hizalanmamış dizinlerle oluşturulan istatistikler.
  • Always On okunabilir ikincil veritabanlarında oluşturulan istatistikler.
  • Salt okunur veritabanlarında oluşturulan istatistikler.
  • Filtrelenmiş dizinlerde oluşturulan istatistikler.
  • Görünümlerde oluşturulan istatistikler.
  • İç tablolarda oluşturulan istatistikler.
  • Uzamsal dizinler veya XML dizinleriyle oluşturulan istatistikler.

MAXDOP = max_degree_of_parallelism

Şunlar için geçerlidir: SQL Server 2016 (13.x) SP 2, SQL Server 2017 (14.x) CU 3 ve sonraki sürümleri

İstatistik işlemi sırasında en yüksek paralellik derecesi yapılandırma seçeneğini geçersiz kılar. Daha fazla bilgi için bkz . En yüksek paralellik derecesini yapılandırma (sunucu yapılandırma seçeneği). Paralel plan yürütmesinde kullanılan işlemci sayısını sınırlamak için kullanın MAXDOP . Maksimum değer 64 işlemcidir.

max_degree_of_parallelism olabilir:

  • 1: Paralel plan oluşturmayı bastırır.
  • >1: Paralel dizin işleminde kullanılan en fazla işlemci sayısını belirtilen sayıyla kısıtlar.
  • 0 (varsayılan): Geçerli sistem iş yüküne göre gerçek işlemci sayısını veya daha azını kullanır.

update_stats_stream_option

Yalnızca bilgilendirme amacıyla tanımlanır. Desteklenmiyor. Gelecekteki uyumluluk garanti edilmemektedir.

AUTO_DROP = { ON | KAPALI }

Şunlar için geçerlidir: SQL Server 2022 (16.x) ve sonraki sürümleri ve Azure SQL Veritabanı, Azure SQL Yönetilen Örneği

SQL Server 2022'den (16.x) önce, istatistikler kullanıcı veritabanındaki bir kullanıcı veya üçüncü taraf aracı tarafından el ile oluşturulduysa, bu istatistik nesneleri müşterinin isteyebileceği şema değişikliklerini engelleyebilir veya engelleyebilir.

SQL Server 2022 'den (16.x) AUTO_DROP başlayarak, seçenek tüm yeni ve geçirilen veritabanlarında varsayılan olarak etkinleştirilir. AUTO_DROP özelliği, bir modda istatistik nesnelerinin oluşturulmasına izin verir, böylece sonraki şema değişikliği istatistik nesnesi tarafından engellenmez, bunun yerine istatistikler gerektiği gibi bırakılır. Bu şekilde, el ile AUTO_DROP oluşturulan ve etkin istatistikler otomatik oluşturulan istatistikler gibi davranır.

Uyarı

Otomatik olarak oluşturulan istatistiklerde Auto_Drop özelliğini ayarlamaya veya kaldırmaya çalışmak hatalara neden olabilir. Otomatik oluşturulan istatistikler her zaman otomatik bırakma kullanır. Bazı yedeklemeler geri yüklendiğinde, istatistik nesnesinin bir sonraki güncelleştirilişine (el ile veya otomatik olarak) kadar bu özellik yanlış ayarlanmış olabilir. Ancak, otomatik oluşturulan istatistikler her zaman otomatik bırakma istatistikleri gibi davranır. Veritabanını önceki bir sürümden SQL Server 2022'ye (16.x) geri yüklerken, istatistik AUTO_DROP özelliği için uygun meta verileri ayarlayarak veritabanında yürütülmesi sp_updatestats önerilir.

Daha fazla bilgi için bkz. AUTO_DROP seçeneği.

İzinler

Şu izinlerden birini gerektirir:

  • ALTER TABLE
  • Kullanıcı tablo sahibidir
  • db_ddladmin sabit veritabanı rolüne üyelik

Açıklamalar

SQL Server, istatistik oluşturmadan önce örneklenen satırları sıralamak için kullanabilir tempdb .

Dış tablolar için istatistikler

Dış tablo istatistikleri oluştururken, SQL Server dış tabloyu geçici bir SQL Server tablosuna aktarır ve ardından istatistikleri oluşturur. Örnek istatistikleri için yalnızca örneklenen satırlar içeri aktarılır. Büyük bir dış tablonuz varsa, tam tarama seçeneği yerine varsayılan örneklemeyi kullanmak daha hızlıdır.

Dış tablo veri türü olarak DELIMITEDTEXT, CSV, PARQUETveya DELTA kullandığında, dış tablolar CREATE STATISTICS komut başına yalnızca bir sütun için istatistikleri destekler.

Filtrelenmiş koşula sahip istatistikler

Filtrelenmiş istatistikler, iyi tanımlanmış veri alt kümelerinden seçim yapılan sorgular için sorgu performansını geliştirebilir. Filtrelenmiş istatistikler, istatistiklere dahil edilen verilerin alt kümesini seçmek için WHERE yan tümcesinde bir filtre koşulu kullanır.

CREATE STATISTICS ne zaman kullanılır?

ne zaman kullanılacağı CREATE STATISTICShakkında daha fazla bilgi için bkz. İstatistikler.

Filtrelenmiş istatistikler için başvuru bağımlılıkları

sys.sql_expression_dependencies katalog görünümü, başvuru bağımlılığı olarak filtrelenmiş istatistik koşulundaki her sütunu izler. Filtrelenmiş istatistikler oluşturmadan önce tablo sütunlarında gerçekleştirdiğiniz işlemleri göz önünde bulundurun. Filtrelenmiş istatistik koşulunda tanımlanan tablo sütununun tanımını bırakamaz, yeniden adlandıramaz veya değiştiremezsiniz.

Sınırlamalar

  • İstatistiklerin güncelleştirilmesi dış tablolarda desteklenmez. Dış tablodaki istatistikleri güncelleştirmek için istatistikleri bırakın ve yeniden oluşturun.
  • İstatistik nesnesi başına en çok 64 sütun listeleyebilirsiniz.
  • seçeneği MAXDOP , ROWCOUNTve PAGECOUNT seçenekleriyle STATS_STREAMuyumlu değildir.
  • MAXDOP seçeneği, kullanılıyorsa Resource Governor iş yükü grubu MAX_DOP ayarıyla sınırlıdır.
  • CREATE ve DROP STATISTICS dış tablolarda Azure SQL Veritabanı'nda desteklenmez.

Örnekler

Bu makaledeki kod örnekleri, AdventureWorks2022 giriş sayfasından indirebileceğiniz AdventureWorksDW2022 veya örnek veritabanını kullanır.

A. ÖRNEK sayı YÜZDE ile CREATE STATISTICS kullanma

Aşağıdaki örnek, AdventureWorks2022 veritabanının ContactMail1 tablosunun ve EmailPromotion sütunlarının BusinessEntityID yüzde 5'inin Person rastgele bir örneğini kullanarak istatistikleri oluşturur.

CREATE STATISTICS ContactMail1
    ON Person.Person (BusinessEntityID, EmailPromotion)
    WITH SAMPLE 5 PERCENT;

B. FULLSCAN ve NORECOMPUTE ile CREATE STATISTICS kullanma

Aşağıdaki örnek, tablonun ve EmailPromotion sütunlarındaki PersonBusinessEntityID tüm satırlar için istatistikleri oluşturur NamePurchase ve istatistiklerin otomatik olarak yeniden derlenmesi özelliğini devre dışı bırakır.

CREATE STATISTICS NamePurchase
    ON AdventureWorks2022.Person.Person (BusinessEntityID, EmailPromotion)
    WITH FULLSCAN, NORECOMPUTE;

C. Filtrelenmiş istatistikler oluşturmak için CREATE STATISTICS kullanma

Aşağıdaki örnek filtrelenmiş istatistikleri ContactPromotion1oluşturur. Veritabanı Altyapısı verilerin yüzde 50'sini örnekler ve ardından 2'ye eşit satırları EmailPromotion seçer.

CREATE STATISTICS ContactPromotion1
    ON Person.Person (BusinessEntityID, LastName, EmailPromotion)
WHERE EmailPromotion = 2
WITH SAMPLE 50 PERCENT;
GO

D. Dış tabloda istatistik oluşturma

Bir dış tabloda istatistik oluştururken, sütun listesini sağlamanın yanı sıra vermeniz gereken tek karar, satırları örneklemek veya tüm satırları tarayarak istatistikleri oluşturmaktır. CREATE ve DROP STATISTICS dış tablolarda Azure SQL Veritabanı'nda desteklenmez.

SQL Server, istatistikleri oluşturmak için verileri dış tablodan geçici bir tabloya aktardığından, tam tarama seçeneği çok daha uzun sürer. Büyük bir tablo için varsayılan örnekleme yöntemi genellikle yeterlidir.

--Create statistics on an external table and use default sampling.
CREATE STATISTICS CustomerStats1 ON DimCustomer (CustomerKey, EmailAddress);

--Create statistics on an external table and scan all the rows
CREATE STATISTICS CustomerStats1 ON DimCustomer (CustomerKey, EmailAddress) WITH FULLSCAN;

E. FULLSCAN ve PERSIST_SAMPLE_PERCENT ile CREATE STATISTICS kullanma

Aşağıdaki örnek, tablonun ve EmailPromotion sütunlarındaki PersonBusinessEntityID tüm satırlar için istatistikleri oluşturur NamePurchase ve sonraki tüm güncelleştirmeler için örnekleme yüzdesini açıkça belirtmeyen yüzde 100 örnekleme yüzdesini ayarlar.

CREATE STATISTICS NamePurchase
    ON AdventureWorks2022.Person.Person (BusinessEntityID, EmailPromotion)
    WITH FULLSCAN, PERSIST_SAMPLE_PERCENT = ON;

AdventureWorksDW veritabanının kullanıldığı örnekler

F. İki sütunda istatistik oluşturma

Aşağıdaki örnek, tablonun ve EmailAddress sütunlarını DimCustomer temel alarak CustomerKey istatistikleri oluştururCustomerStats1. İstatistikler, tablodaki Customer satırların istatistiksel olarak önemli bir örneklemesi temel alınarak oluşturulur.

CREATE STATISTICS CustomerStats1 ON DimCustomer (CustomerKey, EmailAddress);

G. Tam tarama kullanarak istatistik oluşturma

Aşağıdaki örnek, tablodaki CustomerStatsFullScan tüm satırları DimCustomer tarayarak istatistikleri oluşturur.

CREATE STATISTICS CustomerStatsFullScan
ON DimCustomer (CustomerKey, EmailAddress) WITH FULLSCAN;

H. Örnek yüzdesini belirterek istatistik oluşturma

Aşağıdaki örnek, tablodaki satırların CustomerStatsSampleScan yüzde 50'sini DimCustomer tarayarak istatistikleri oluşturur.

CREATE STATISTICS CustomerStatsSampleScan
ON DimCustomer (CustomerKey, EmailAddress) WITH SAMPLE 50 PERCENT;

I. AUTO_DROP ile CREATE STATISTICS kullanma

Otomatik bırakma istatistiklerini kullanmak için, istatistikleri oluşturma veya güncelleştirme işleminin "WITH" yan tümcesine aşağıdakileri eklemeniz gerekir.

CREATE STATISTICS CustomerStats1 ON DimCustomer (CustomerKey, EmailAddress) WITH AUTO_DROP = ON

Mevcut istatistiklerde otomatik bırakma ayarını değerlendirmek için sys.stats içindeki sütunu kullanınauto_drop:

SELECT object_id, [name], auto_drop
FROM sys.stats;