Bir günlük datawarehouse derlemede nispeten uzun çalışan (20 dakika +) otomatik güncelleme istatistik işlemi fark ettim. İlgili tablo
CREATE TABLE [dbo].[factWebAnalytics](
[WebAnalyticsId] [bigint] IDENTITY(1,1) NOT NULL,
[MarketKey] [int] NOT NULL CONSTRAINT [DF_factWebAnalytics_MarketKey] DEFAULT ((-1)),
/*Other columns removed*/
CONSTRAINT [PK_factWebAnalytics] PRIMARY KEY CLUSTERED
(
[MarketKey] ASC,
[WebAnalyticsId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [MarketKeyPS]([MarketKey])
) ON [MarketKeyPS]([MarketKey])
Bu, Microsoft SQL Server 2012 (SP1) - 11.0.3513.0 (X64) üzerinde çalıştığından yazılabilir sütun deposu dizinleri kullanılamaz.
Tabloda iki ayrı Market anahtarı için veriler bulunmaktadır. Yapı, belirli bir MarketKey için bölümü bir hazırlama tablosuna geçirir, sütun deposu dizinini devre dışı bırakır, gerekli yazma işlemlerini gerçekleştirir, sütun deposunu yeniden oluşturur, sonra yeniden açar.
Güncelleme istatistiklerinin yürütme planı, tüm satırları tablodan çıkardığını, sıraladığını, tahmini satır sayısını çok yanlış aldığını ve tempdb
dökülme seviyesi 2'ye döktüğünü göstermektedir .
Koşu
SELECT [s].[name] AS "Statistic",
[sp].*
FROM [sys].[stats] AS [s]
OUTER APPLY sys.dm_db_stats_properties ([s].[object_id], [s].[stats_id]) AS [sp]
WHERE [s].[object_id] = OBJECT_ID(N'[dbo].[factWebAnalytics]');
Gösteriler
Açıkça denemek ve bu dizinin istatistiklerinin örnek boyutunu diğerlerinin kullandığı
UPDATE STATISTICS [dbo].[factWebAnalytics] [PK_factWebAnalytics] WITH SAMPLE 897667 ROWS
Sorgu yeniden 20 dakika + boyunca çalışır ve yürütme planı, istenen 897,667 örneğini değil tüm satırları işlediğini gösterir.
Tüm bunların sonunda oluşturulan istatistikler çok ilginç değil ve kesinlikle tam bir tarama için harcanan zamanı garanti etmiyor gibi görünüyor.
Statistics for INDEX 'PK_factWebAnalytics'.
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Name Updated Rows Rows Sampled Steps Density Average Key Length String Index
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
PK_factWebAnalytics Jan 22 2016 11:31AM 420072086 420072086 2 0 12 NO 420072086
All Density Average Length Columns
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0.5 4 MarketKey
2.380544E-09 12 MarketKey, WebAnalyticsId
Histogram Steps
RANGE_HI_KEY RANGE_ROWS EQ_ROWS DISTINCT_RANGE_ROWS AVG_RANGE_ROWS
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 0 3.441652E+08 0 1
2 0 7.590685E+07 0 1
Neden bu davranışla karşılaştığım ve NORECOMPUTE
bunlarda kullanmaktan başka hangi adımları atabileceğim hakkında herhangi bir fikir ?
Bir repro betiği burada . Kümelenmiş bir PK ve bir sütun deposu dizinine sahip bir tablo oluşturur ve PK istatistiklerini düşük bir örnek boyutuyla güncellemeye çalışır. Bu, bölümleme özelliğinin gerekli olmadığını gösteren bölümleme kullanmaz. Bununla birlikte, yukarıda açıklanan bölümlemenin kullanılması, bölümün kapatılması ve daha sonra tekrar (başka bir değişiklik yapılmaksızın) geri getirilmesi, bölümdeki satır sayısını iki katına çıkararak modifikasyon_sayıcısını artıracak ve böylece istatistiklerin eski ve otomatik olarak güncellenir.
KB2986627'de belirtildiği gibi tabloya kümelenmemiş bir dizin eklemeyi denedim.
Repro, 11.0.6020.0 derlemesinde sorunlu davranışı göstermedi ve SP3'e yükselttikten sonra sorun düzeltildi.
SELECT WebAnalyticsId, MarketKey from [dbo].[factWebAnalytics] TABLESAMPLE (897667 ROWS) ORDER BY MarketKey, WebAnalyticsId
benim için 30 saniyeden daha kısa sürede çalışıyor. Yine de columntore dizinini kullanmaz. Kümelenmiş dizini kullanır.