Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu makalede, ayrılmış SQL havuzundaki tablolarda sorgu iyileştirme istatistikleri oluşturmaya ve güncelleştirmeye yönelik öneriler ve örnekler sağlanır.
İstatistikleri neden kullanmalısınız?
Verileriniz hakkında SQL havuzu ne kadar çok bilgiye sahip olursa, o kadar hızlı sorgu yürütebilir. Verileri ayrılmış SQL havuzuna yükledikten sonra verilerinizle ilgili istatistikleri toplamak, sorgularınızı iyileştirmek için yapabileceğiniz en önemli şeylerden biridir.
Ayrılmış SQL havuzu sorgu iyileştiricisi, maliyet tabanlı bir iyileştiricidir. Çeşitli sorgu planlarının maliyetini karşılaştırır ve ardından planı en düşük maliyetle seçer. Çoğu durumda, en hızlı yürüten planı seçer.
Örneğin, sorgunuzun filtrelediği tarihin bir satır döndüreceğini tahmin ederse, optimizatör belirli bir planı seçer. İyileştirici seçilen tarihin bir milyon satır döndürdüğünü tahmin ederse, farklı bir plan seçer.
İstatistiklerin otomatik olarak oluşturulması
Veritabanı AUTO_CREATE_STATISTICS
seçeneği açık olduğunda, ayrılmış SQL havuzu eksik istatistikler için gelen kullanıcı sorgularını analiz eder.
İstatistikler eksikse, sorgu iyileştiricisi sorgu planı için kardinalite tahminlerini geliştirmek için sorgu koşulundaki veya birleştirme koşulundaki tek tek sütunlarda istatistikler oluşturur.
Not
İstatistiklerin otomatik olarak oluşturulması şu anda varsayılan olarak açıktır.
Aşağıdaki T-SQL komutunu çalıştırarak ayrılmış SQL havuzunuzun AUTO_CREATE_STATISTICS
yapılandırılıp yapılandırılmadığını kontrol edebilirsiniz.
SELECT name, is_auto_create_stats_on
FROM sys.databases
Ayrılmış SQL havuzunuz yapılandırılmamışsa AUTO_CREATE_STATISTICS
aşağıdaki komutu çalıştırarak bu özelliği etkinleştirmenizi öneririz.
<your-datawarehouse-name>
ifadesini ayrılmış SQL havuzunuzun adıyla değiştirin.
ALTER DATABASE <your-datawarehouse-name>
SET AUTO_CREATE_STATISTICS ON
Bu deyimler istatistiklerin otomatik olarak oluşturulmasını tetikler:
SELECT
-
INSERT
...SELECT
-
CREATE TABLE AS SELECT
(CTAS) UPDATE
DELETE
-
EXPLAIN
birleştirme içerdiğinde ya da bir koşulun varlığı algılandığında
Not
İstatistiklerin otomatik olarak oluşturulması geçici veya dış tablolarda gerçekleştirilmez.
İstatistiklerin otomatik olarak oluşturulması zaman uyumlu olarak yapılır, bu nedenle sütunlarınızda istatistik eksikse sorgu performansının biraz düşmesine neden olabilirsiniz. Tek bir sütun için istatistik oluşturma süresi tablonun boyutuna bağlıdır.
Ölçülebilir performans düşüşü önlemek için, sistemin profilini oluşturmadan önce karşılaştırma iş yükünü yürüterek istatistiklerin oluşturulduğundan emin olmanız gerekir.
Not
İstatistik oluşturma işlemi, farklı bir kullanıcı bağlamında, sys.dm_pdw_exec_requests altında günlüğe kaydedilir.
Otomatik istatistikler oluşturulduğunda şu formu alır: _WA_Sys_<8 digit column id in Hex>_<8 digit table id in Hex>
. DBCC SHOW_STATISTICS komutunu çalıştırarak önceden oluşturulmuş istatistikleri görüntüleyebilirsiniz:
DBCC SHOW_STATISTICS (<table_name>, <target>)
table_name
, görüntülenecek istatistikleri içeren tablonun adıdır. Bu tablo harici bir tablo olamaz. Hedef, istatistik bilgilerinin görüntüleneceği hedef dizinin, istatistiklerin veya sütunun adıdır.
İstatistikleri güncelleştirme
En iyi yöntemlerden biri, her gün yeni tarihler eklendikçe tarih sütunlarının istatistiklerini güncelleştirmektir. Ayrılmış SQL havuzuna her yeni satır yüklendiğinde, yeni yükleme tarihleri veya işlem tarihleri eklenir. Bu eklemeler veri dağılımını değiştirir ve istatistikleri güncel olmayan hale getirir.
Değerlerin dağılımı genel olarak değişmediğinden, müşteri tablosundaki bir ülke/bölge sütunundaki istatistiklerin güncelleştirilmesi gerekmeyebilir. Dağıtımın müşteriler arasında sabit olduğu varsayıldığında, tablo varyasyona yeni satırlar eklemek veri dağıtımını değiştirmez.
Ancak, ayrılmış SQL havuzunuz yalnızca bir ülke/bölge içeriyorsa ve yeni bir ülkeden/bölgeden veri getirirseniz ve birden çok ülkeden/bölgeden veriler depolanıyorsa, ülke/bölge sütunundaki istatistikleri güncelleştirmeniz gerekir.
İstatistikleri güncelleştirmeye yönelik öneriler şunlardır:
İstatistikler özniteliği | Öneri |
---|---|
İstatistik güncelleştirmelerinin sıklığı | Muhafazakar: Verilerinizi yükledikten veya dönüştürdükten sonra Günlük |
Örnekleme | 1 milyardan az satır, varsayılan örneklemeyi (yüzde 20) kullanın.
1 milyardan fazla satırla yüzde iki örnekleme kullanın. |
Bir sorguda sorun giderirken sormanız gereken ilk sorulardan biri "İstatistikler güncel mi?"
Bu soru, verilerin yaşına göre yanıtlanamaz. Temel alınan verilerde malzeme değişikliği yapılmadıysa güncel istatistik nesnesi eski olabilir. Satır sayısı önemli ölçüde değiştiğinde veya bir sütun için değerlerin dağılımında önemli bir değişiklik olduğunda, istatistikleri güncelleştirmenin zamanı gelmiştir.
İstatistiklerin son güncelleştirilişinden sonra tablodaki verilerin değişip değişmediğini belirlemek için dinamik yönetim görünümü yoktur. Aşağıdaki iki sorgu, istatistiklerinizin eski olup olmadığını belirlemenize yardımcı olabilir.
Sorgu 1: İstatistiklerden () satır sayısı ile gerçek satır sayısı (
stats_row_count
actual_row_count
) arasındaki farkı bulur.select objIdsWithStats.[object_id], actualRowCounts.[schema], actualRowCounts.logical_table_name, statsRowCounts.stats_row_count, actualRowCounts.actual_row_count, row_count_difference = CASE WHEN actualRowCounts.actual_row_count >= statsRowCounts.stats_row_count THEN actualRowCounts.actual_row_count - statsRowCounts.stats_row_count ELSE statsRowCounts.stats_row_count - actualRowCounts.actual_row_count END, percent_deviation_from_actual = CASE WHEN actualRowCounts.actual_row_count = 0 THEN statsRowCounts.stats_row_count WHEN statsRowCounts.stats_row_count = 0 THEN actualRowCounts.actual_row_count WHEN actualRowCounts.actual_row_count >= statsRowCounts.stats_row_count THEN CONVERT(NUMERIC(18, 0), CONVERT(NUMERIC(18, 2), (actualRowCounts.actual_row_count - statsRowCounts.stats_row_count)) / CONVERT(NUMERIC(18, 2), actualRowCounts.actual_row_count) * 100) ELSE CONVERT(NUMERIC(18, 0), CONVERT(NUMERIC(18, 2), (statsRowCounts.stats_row_count - actualRowCounts.actual_row_count)) / CONVERT(NUMERIC(18, 2), actualRowCounts.actual_row_count) * 100) END from ( select distinct object_id from sys.stats where stats_id > 1 ) objIdsWithStats left join ( select object_id, sum(rows) as stats_row_count from sys.partitions group by object_id ) statsRowCounts on objIdsWithStats.object_id = statsRowCounts.object_id left join ( SELECT sm.name [schema] , tb.name logical_table_name , tb.object_id object_id , SUM(rg.row_count) actual_row_count FROM sys.schemas sm INNER JOIN sys.tables tb ON sm.schema_id = tb.schema_id INNER JOIN sys.pdw_table_mappings mp ON tb.object_id = mp.object_id INNER JOIN sys.pdw_nodes_tables nt ON nt.name = mp.physical_name INNER JOIN sys.dm_pdw_nodes_db_partition_stats rg ON rg.object_id = nt.object_id AND rg.pdw_node_id = nt.pdw_node_id AND rg.distribution_id = nt.distribution_id WHERE rg.index_id = 1 GROUP BY sm.name, tb.name, tb.object_id ) actualRowCounts on objIdsWithStats.object_id = actualRowCounts.object_id
Sorgu 2: İstatistiklerinizin her tabloda en son ne zaman güncelleştirilmiş olduğunu kontrol ederek istatistiklerinizin yaşını bulun.
Not
Bir sütun için değerlerin dağılımında önemli bir değişiklik varsa, istatistikleri en son ne zaman güncelleştirildiklerinden bağımsız olarak güncelleştirmeniz gerekir.
SELECT sm.[name] AS [schema_name], tb.[name] AS [table_name], co.[name] AS [stats_column_name], st.[name] AS [stats_name], STATS_DATE(st.[object_id],st.[stats_id]) AS [stats_last_updated_date] FROM sys.objects ob JOIN sys.stats st ON ob.[object_id] = st.[object_id] JOIN sys.stats_columns sc ON st.[stats_id] = sc.[stats_id] AND st.[object_id] = sc.[object_id] JOIN sys.columns co ON sc.[column_id] = co.[column_id] AND sc.[object_id] = co.[object_id] JOIN sys.types ty ON co.[user_type_id] = ty.[user_type_id] JOIN sys.tables tb ON co.[object_id] = tb.[object_id] JOIN sys.schemas sm ON tb.[schema_id] = sm.[schema_id] WHERE st.[user_created] = 1;
Örneğin, ayrılmış bir SQL havuzundaki tarih sütunları genellikle sık sık istatistik güncelleştirmelerine ihtiyaç duyar. Ayrılmış SQL havuzuna her yeni satır yüklendiğinde, yeni yükleme tarihleri veya işlem tarihleri eklenir. Bu eklemeler veri dağılımını değiştirir ve istatistikleri güncel olmayan hale getirir.
Buna karşılık, müşteri tablosundaki bir cinsiyet sütununa ilişkin istatistiklerin hiçbir zaman güncelleştirilmeye gerek olmayabilir. Dağıtımın müşteriler arasında sabit olduğu varsayıldığında, tablo varyasyona yeni satırlar eklemek veri dağıtımını değiştirmez.
Ayrılmış SQL havuzunuz yalnızca bir cinsiyet içeriyorsa ve yeni bir gereksinim birden çok cinsiyete neden olursa, cinsiyet sütunundaki istatistikleri güncelleştirmeniz gerekir.
Daha fazla bilgi için bkz. İstatistikler için genel yönergeler.
İstatistik yönetimini uygulama
Eşzamanlı sorgular arasındaki engellemeyi veya kaynak çekişmesini önlemek veya en aza indirmek için genellikle verilerin yüklenmesi işlemini genişleterek istatistiğin yükün sonunda güncelleştirilmesini sağlamak iyi bir fikirdir.
Veri yükü, tabloların boyutlarını veya değer dağılımını en sık değiştirdikleri durumdur. Veri yükleme, bazı yönetim işlemlerini uygulamak için mantıksal bir yerdir.
İstatistiklerinizi güncelleştirmek için aşağıdaki yol gösterici ilkeler sağlanır:
- Yüklenen her tabloda en az bir istatistik nesnesinin güncelleştirildiğinden emin olun. Bu, istatistik güncelleştirmesinin bir parçası olarak tablo boyutu (satır sayısı ve sayfa sayısı) bilgilerini güncelleştirir.
- JOIN, GROUP BY, ORDER BY ve DISTINCT yan tümcelerine katılan sütunlara odaklanın.
- bu değerler istatistik histogramına dahil olmadığından işlem tarihleri gibi artan anahtar sütunları daha sık güncelleştirmeyi göz önünde bulundurun.
- Statik dağıtım sütunlarını daha seyrek güncelleştirmeyi göz önünde bulundurun.
- Unutmayın, her istatistik nesnesi sırayla güncelleştirilir. Özellikle çok sayıda istatistik nesnesine sahip geniş tablolar için basit bir şekilde
UPDATE STATISTICS <TABLE_NAME>
uygulamak her zaman ideal değildir.
Daha fazla bilgi için bkz . Kardinalite Tahmini.
Örnekler: İstatistik oluşturma
Bu örneklerde istatistik oluşturmak için çeşitli seçeneklerin nasıl kullanılacağı gösterilmektedir. Her sütun için kullandığınız seçenekler, verilerinizin özelliklerine ve sütunun sorgularda nasıl kullanıldığına bağlıdır.
Varsayılan seçeneklerle tek sütunlu istatistikler oluşturma
Bir sütunda istatistik oluşturmak için istatistik nesnesi için bir ad ve sütunun adını belirtin.
Bu söz dizimi tüm varsayılan seçenekleri kullanır. Varsayılan olarak, istatistikler oluşturulurken tablonun yüzde 20'si örneklendirilir.
CREATE STATISTICS [statistics_name] ON [schema_name].[table_name]([column_name]);
Örneğin:
CREATE STATISTICS col1_stats ON dbo.table1 (col1);
Her satırı inceleyerek tek sütunlu istatistikler oluşturma
Varsayılan örnekleme oranı yüzde 20 çoğu durum için yeterlidir. Ancak örnekleme hızını ayarlayabilirsiniz.
Tablonun tamamını örneklemek için şu söz dizimini kullanın:
CREATE STATISTICS [statistics_name] ON [schema_name].[table_name]([column_name]) WITH FULLSCAN;
Örneğin:
CREATE STATISTICS col1_stats ON dbo.table1 (col1) WITH FULLSCAN;
Örnek boyutu belirterek tek sütunlu istatistikler oluşturma
Alternatif olarak, örnek boyutunu yüzde olarak belirtebilirsiniz:
CREATE STATISTICS col1_stats ON dbo.table1 (col1) WITH SAMPLE = 50 PERCENT;
Yalnızca bazı satırlarda tek sütunlu istatistikler oluşturma
Tablonuzdaki satırların bir bölümüyle ilgili istatistikler de oluşturabilirsiniz. Buna filtrelenmiş istatistik adı verilir.
Örneğin, büyük bir bölümlenmiş tablonun belirli bir bölümünü sorgulamayı planlarken filtrelenmiş istatistikleri kullanabilirsiniz. Yalnızca bölüm değerleriyle ilgili istatistikler oluşturarak istatistiklerin doğruluğu artar ve bu da sorgu performansını artırır.
Bu örnek, bir değer aralığına ilişkin istatistikler oluşturur. Değerler, bir bölümdeki değer aralığıyla eşleşecek şekilde kolayca tanımlanabilir.
CREATE STATISTICS stats_col1 ON table1(col1) WHERE col1 > '2000101' AND col1 < '20001231';
Not
Sorgu iyileştiricinin dağıtılmış sorgu planını seçtiğinde filtrelenmiş istatistikleri kullanmayı göz önünde bulundurması için sorgunun istatistik nesnesinin tanımına sığması gerekir. Önceki örneği kullanarak sorgunun WHERE yan tümcesinin 2000101 ile 20001231 arasında col1 değerleri belirtmesi gerekir.
Tüm seçeneklerle tek sütunlu istatistikler oluşturma
Seçenekleri birlikte de birleştirebilirsiniz. Aşağıdaki örnek, özel örnek boyutuna sahip filtrelenmiş bir istatistik nesnesi oluşturur:
CREATE STATISTICS stats_col1 ON table1 (col1) WHERE col1 > '2000101' AND col1 < '20001231' WITH SAMPLE = 50 PERCENT;
Tam metin için bkz CREATE STATISTICS.
Çok sütunlu istatistikler oluşturma
Çok sütunlu istatistik nesnesi oluşturmak için önceki örnekleri kullanın, ancak daha fazla sütun belirtin.
Not
Sorgu sonucundaki satır sayısını tahmin etmek için kullanılan histogram, yalnızca istatistik nesnesi tanımında listelenen ilk sütun için kullanılabilir.
Bu örnekte histogram product_category
üzerindedir.
product_category
ve product_sub_category
üzerinde çapraz sütun istatistikleri hesaplanır.
CREATE STATISTICS stats_2cols ON table1 (product_category, product_sub_category) WHERE product_category > '2000101' AND product_category < '20001231' WITH SAMPLE = 50 PERCENT;
ve product_category
arasında product_sub_category
bir bağıntı olduğundan, bu sütunlara aynı anda erişilirse çok sütunlu bir istatistik nesnesi yararlı olabilir.
Tablodaki tüm sütunlarda istatistik oluşturma
İstatistik oluşturmanın bir yolu, tabloyu oluşturduktan sonra komutlar vermektir CREATE STATISTICS
:
CREATE TABLE dbo.table1
(
col1 int
, col2 int
, col3 int
)
WITH
(
CLUSTERED COLUMNSTORE INDEX
)
;
CREATE STATISTICS stats_col1 on dbo.table1 (col1);
CREATE STATISTICS stats_col2 on dbo.table2 (col2);
CREATE STATISTICS stats_col3 on dbo.table3 (col3);
SQL havuzundaki tüm sütunlarda istatistik oluşturmak için saklı yordam kullanma
Ayrılmış SQL havuzu, SQL Server'daki sp_create_stats
eşdeğeri bir sistem saklı yordamına sahip değildir. Bu saklı yordam, henüz istatistik içermeyen bir SQL havuzundaki her sütunda tek sütunlu istatistik nesnesi oluşturur.
Aşağıdaki örnek, SQL havuzu tasarımınızı kullanmaya başlamayı gösterir. İhtiyaçlarınıza göre uyarlamaktan çekinmeyin.
CREATE PROCEDURE [dbo].[prc_sqldw_create_stats]
( @create_type tinyint -- 1 default 2 Fullscan 3 Sample
, @sample_pct tinyint
)
AS
IF @create_type IS NULL
BEGIN
SET @create_type = 1;
END;
IF @create_type NOT IN (1,2,3)
BEGIN
THROW 151000,'Invalid value for @stats_type parameter. Valid range 1 (default), 2 (fullscan) or 3 (sample).',1;
END;
IF @sample_pct IS NULL
BEGIN;
SET @sample_pct = 20;
END;
IF OBJECT_ID('tempdb..#stats_ddl') IS NOT NULL
BEGIN;
DROP TABLE #stats_ddl;
END;
CREATE TABLE #stats_ddl
WITH ( DISTRIBUTION = HASH([seq_nmbr])
, LOCATION = USER_DB
)
AS
WITH T
AS
(
SELECT t.[name] AS [table_name]
, s.[name] AS [table_schema_name]
, c.[name] AS [column_name]
, c.[column_id] AS [column_id]
, t.[object_id] AS [object_id]
, ROW_NUMBER()
OVER(ORDER BY (SELECT NULL)) AS [seq_nmbr]
FROM sys.[tables] t
JOIN sys.[schemas] s ON t.[schema_id] = s.[schema_id]
JOIN sys.[columns] c ON t.[object_id] = c.[object_id]
LEFT JOIN sys.[stats_columns] l ON l.[object_id] = c.[object_id]
AND l.[column_id] = c.[column_id]
AND l.[stats_column_id] = 1
LEFT JOIN sys.[external_tables] e ON e.[object_id] = t.[object_id]
WHERE l.[object_id] IS NULL
AND e.[object_id] IS NULL -- not an external table
)
SELECT [table_schema_name]
, [table_name]
, [column_name]
, [column_id]
, [object_id]
, [seq_nmbr]
, CASE @create_type
WHEN 1
THEN CAST('CREATE STATISTICS '+QUOTENAME('stat_'+table_schema_name+ '_' + table_name + '_'+column_name)+' ON '+QUOTENAME(table_schema_name)+'.'+QUOTENAME(table_name)+'('+QUOTENAME(column_name)+')' AS VARCHAR(8000))
WHEN 2
THEN CAST('CREATE STATISTICS '+QUOTENAME('stat_'+table_schema_name+ '_' + table_name + '_'+column_name)+' ON '+QUOTENAME(table_schema_name)+'.'+QUOTENAME(table_name)+'('+QUOTENAME(column_name)+') WITH FULLSCAN' AS VARCHAR(8000))
WHEN 3
THEN CAST('CREATE STATISTICS '+QUOTENAME('stat_'+table_schema_name+ '_' + table_name + '_'+column_name)+' ON '+QUOTENAME(table_schema_name)+'.'+QUOTENAME(table_name)+'('+QUOTENAME(column_name)+') WITH SAMPLE '+CONVERT(varchar(4),@sample_pct)+' PERCENT' AS VARCHAR(8000))
END AS create_stat_ddl
FROM T
;
DECLARE @i INT = 1
, @t INT = (SELECT COUNT(*) FROM #stats_ddl)
, @s NVARCHAR(4000) = N''
;
WHILE @i <= @t
BEGIN
SET @s=(SELECT create_stat_ddl FROM #stats_ddl WHERE seq_nmbr = @i);
PRINT @s
EXEC sp_executesql @s
SET @i+=1;
END
DROP TABLE #stats_ddl;
Tüm sütunlarda tablodaki istatistikleri oluşturmak için varsayılanları kullanarak saklı yordamı yürütün.
EXEC [dbo].[prc_sqldw_create_stats] 1, NULL;
Fullscan kullanarak tablodaki tüm sütunlarda istatistik oluşturmak için bu yordamı çağırın.
EXEC [dbo].[prc_sqldw_create_stats] 2, NULL;
Tablodaki tüm sütunlarda örneklenmiş istatistikler oluşturmak için 3 girin ve örnek yüzdesini girin. Bu yordamda yüzde 20 örnek oranı kullanılır.
EXEC [dbo].[prc_sqldw_create_stats] 3, 20;
Örnekler: İstatistikleri güncelleştirme
İstatistikleri güncelleştirmek için şunları yapabilirsiniz:
- Bir istatistik nesnesini güncelleştirin. Güncelleştirmek istediğiniz istatistik nesnesinin adını belirtin.
- Tablodaki tüm istatistik nesnelerini güncelleştirin. Belirli bir istatistik nesnesi yerine tablonun adını belirtin.
Belirli bir istatistik nesnesini güncelleştirme
Belirli bir istatistik nesnesini güncelleştirmek için aşağıdaki söz dizimini kullanın:
UPDATE STATISTICS [schema_name].[table_name]([stat_name]);
Örneğin:
UPDATE STATISTICS [dbo].[table1] ([stats_col1]);
Belirli istatistik nesnelerini güncelleştirerek, istatistikleri yönetmek için gereken süreyi ve kaynakları en aza indirebilirsiniz. Bunu yapmak için, güncelleştirilecek en iyi istatistik nesnelerinin seçilmesi düşünülmesi gerekir.
Tablodaki tüm istatistikleri güncelleştirme
Bir tablodaki tüm istatistik nesnelerini güncelleştirmek için basit bir yöntem:
UPDATE STATISTICS [schema_name].[table_name];
Örneğin:
UPDATE STATISTICS dbo.table1;
ifadeyi UPDATE STATISTICS
kullanmak kolaydır. Tablodaki tüm istatistikleri güncelleştirdiğini ve bu nedenle gerekenden daha fazla iş gerçekleştirebileceğini unutmayın. Performans sorun değilse, istatistiklerin güncel olduğunu garanti etmenin en kolay ve en eksiksiz yolu budur.
Not
Bir tablodaki tüm istatistikleri güncelleştirdiğinizde, ayrılmış SQL havuzu her istatistik nesnesinin tablosunu örneklemek için bir tarama yapar. Tablo büyükse ve çok sayıda sütunu ve çok sayıda istatistiği varsa, tek tek istatistikleri ihtiyaca göre güncelleştirmek daha verimli olabilir.
Bir UPDATE STATISTICS
prosedürün uygulanması için Geçici Tablolar'a bakın. Uygulama yöntemi önceki CREATE STATISTICS
yordamdan biraz farklıdır, ancak sonuç aynıdır.
Söz diziminin tamamı için bkz İstatistikleri Güncelleştirme.
İstatistik meta verileri
İstatistikler hakkında bilgi bulmak için kullanabileceğiniz çeşitli sistem görünümleri ve işlevleri vardır. Örneğin istatistiklerin en son ne zaman oluşturulduğunu veya güncelleştirildiğini görmek için stats-date işlevini kullanarak istatistik nesnesinin güncel olup olmadığını görebilirsiniz.
İstatistikler için katalog görünümleri
Bu sistem görünümleri istatistikler hakkında bilgi sağlar:
Katalog görünümü | Açıklama |
---|---|
sys.columns | Her sütun için bir satır |
sys.objects | Veritabanındaki her nesne için bir satır |
sys.schemas | Veritabanındaki her şema için bir satır |
sys.stats | Her istatistik nesnesi için bir satır |
sys.stats_columns | İstatistik nesnesindeki her sütun için bir satır; sys.columns'a geri bağlantılar |
sys.tables | Her tablo için bir satır (dış tablolar içerir) |
sys.table_types | Her veri türü için bir satır |
İstatistikler için sistem işlevleri
Bu sistem işlevleri istatistiklerle çalışmak için kullanışlıdır:
Sistem işlevi | Açıklama |
---|---|
STATS_DATE | İstatistik nesnesinin son güncelleştirilildiği tarih |
DBCC SHOW_STATISTICS | özet düzeyi ve istatistik nesnesi tarafından anlaşıldığı gibi değerlerin dağılımı hakkında ayrıntılı bilgi |
İstatistik sütunlarını ve işlevlerini tek bir görünümde birleştirme
Bu görünüm, STATS_DATE()
işleviyle ilişkili olan istatistiklerle ve sonuçlarla sütunları bir araya getirir.
CREATE VIEW dbo.vstats_columns
AS
SELECT
sm.[name] AS [schema_name]
, tb.[name] AS [table_name]
, st.[name] AS [stats_name]
, st.[filter_definition] AS [stats_filter_definition]
, st.[has_filter] AS [stats_is_filtered]
, STATS_DATE(st.[object_id],st.[stats_id])
AS [stats_last_updated_date]
, co.[name] AS [stats_column_name]
, ty.[name] AS [column_type]
, co.[max_length] AS [column_max_length]
, co.[precision] AS [column_precision]
, co.[scale] AS [column_scale]
, co.[is_nullable] AS [column_is_nullable]
, co.[collation_name] AS [column_collation_name]
, QUOTENAME(sm.[name])+'.'+QUOTENAME(tb.[name])
AS two_part_name
, QUOTENAME(DB_NAME())+'.'+QUOTENAME(sm.[name])+'.'+QUOTENAME(tb.[name])
AS three_part_name
FROM sys.objects AS ob
JOIN sys.stats AS st ON ob.[object_id] = st.[object_id]
JOIN sys.stats_columns AS sc ON st.[stats_id] = sc.[stats_id]
AND st.[object_id] = sc.[object_id]
JOIN sys.columns AS co ON sc.[column_id] = co.[column_id]
AND sc.[object_id] = co.[object_id]
JOIN sys.types AS ty ON co.[user_type_id] = ty.[user_type_id]
JOIN sys.tables AS tb ON co.[object_id] = tb.[object_id]
JOIN sys.schemas AS sm ON tb.[schema_id] = sm.[schema_id]
WHERE 1=1
AND st.[user_created] = 1
;
DBCC SHOW_STATISTICS() örnekleri
DBCC SHOW_STATISTICS()
bir istatistik nesnesi içinde tutulan verileri gösterir. Bu veriler üç bölümden oluşur:
- Başlık
- Yoğunluk vektöru
- Histogram Grafiği
İstatistiklerle ilgili üst bilgi meta verileri. Histogram, istatistik nesnesinin ilk anahtar sütunundaki değerlerin dağılımını görüntüler. Yoğunluk vektörü, çapraz sütun bağıntısını ölçer.
Not
Ayrılmış SQL havuzu, istatistik nesnesindeki tüm verilerle kardinalite tahminlerini hesaplar.
Başlık, yoğunluk ve histogramı göster
Bu basit örnek, istatistik nesnesinin üç bölümünü de gösterir:
DBCC SHOW_STATISTICS([<schema_name>.<table_name>],<stats_name>)
Örneğin:
DBCC SHOW_STATISTICS (dbo.table1, stats_col1);
DBCC SHOW_STATISTICS() öğesinin bir veya daha fazla bölümünü gösterme
Yalnızca belirli bölümleri görüntülemek istiyorsanız yan tümcesini WITH
kullanın ve görmek istediğiniz bölümleri belirtin:
DBCC SHOW_STATISTICS([<schema_name>.<table_name>],<stats_name>) WITH stat_header, histogram, density_vector
Örneğin:
DBCC SHOW_STATISTICS (dbo.table1, stats_col1) WITH histogram, density_vector
DBCC SHOW_STATISTICS() farkları
DBCC SHOW_STATISTICS()
, SQL Server'a kıyasla ayrılmış SQL havuzunda daha katı bir şekilde uygulanır:
- Belgelenmemiş özellikler desteklenmez.
- kullanılamıyor
Stats_stream
. - İstatistik verilerinin belirli alt kümeleri için sonuçlar birleştirilemiyor. Örneğin,
STAT_HEADER JOIN DENSITY_VECTOR
. -
NO_INFOMSGS
ileti gizleme için ayarlanamaz. - İstatistik adlarının etrafındaki köşeli ayraçlar kullanılamaz.
- İstatistik nesnelerini tanımlamak için sütun adları kullanılamaz.
- Özel hata 2767 desteklenmiyor.
İlgili içerik
DMV'leri kullanarak Azure Synapse Analytics ayrılmış SQL havuzu iş yükünüzü izleme