Saya melihat operasi statistik pembaruan otomatis yang berjalan relatif lama (20 mnt +) di datahousehouse build harian. Tabel yang terlibat adalah
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])
Ini berjalan pada Microsoft SQL Server 2012 (SP1) - 11.0.3513.0 (X64) sehingga indeks kolom toko yang dapat ditulis tidak tersedia.
Tabel berisi data untuk dua kunci Pasar yang berbeda. Build mengaktifkan partisi untuk MarketKey tertentu ke tabel pementasan, menonaktifkan indeks columnstore, melakukan penulisan yang diperlukan, membangun kembali kolomstore, lalu mengubahnya kembali.
Rencana pelaksanaan untuk statistik pembaruan menunjukkan bahwa ia menarik semua baris dari tabel, mengurutkannya, mendapatkan perkiraan jumlah baris yang salah dengan salah dan tumpah ke tempdb
tingkat tumpahan 2.
Lari
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]');
Menunjukkan
Jika saya secara eksplisit mencoba dan mengurangi ukuran sampel dari statistik indeks itu menjadi yang digunakan oleh yang lain dengan
UPDATE STATISTICS [dbo].[factWebAnalytics] [PK_factWebAnalytics] WITH SAMPLE 897667 ROWS
Kueri berjalan selama 20 menit + lagi dan rencana eksekusi menunjukkan bahwa ia memproses semua baris, bukan sampel 897.667 yang diminta.
Statistik yang dihasilkan pada akhir semua ini tidak terlalu menarik dan jelas tidak menjamin waktu yang dihabiskan untuk pemindaian penuh.
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
Adakah ide mengapa saya menghadapi perilaku ini dan langkah apa yang bisa saya ambil selain menggunakan NORECOMPUTE
ini?
Sebuah skrip repro ada di sini . Itu hanya membuat tabel dengan PK berkerumun dan indeks kolom toko dan mencoba untuk memperbarui statistik PK dengan ukuran sampel yang rendah. Ini tidak menggunakan partisi - menunjukkan bahwa aspek partisi tidak diperlukan. Namun penggunaan pemartisian yang dijelaskan di atas memang membuat keadaan menjadi lebih buruk karena mematikan partisi dan kemudian mengubahnya kembali (bahkan tanpa perubahan lain) akan meningkatkan modifikasi_kounter dengan menggandakan jumlah baris dalam partisi sehingga praktis menjamin bahwa statistik akan menjadi dianggap basi dan otomatis diperbarui.
Saya sudah mencoba menambahkan indeks non clustered ke tabel seperti yang ditunjukkan pada KB2986627 (keduanya difilter tanpa baris dan kemudian, ketika gagal, NCI yang tidak difilter juga tanpa efek).
Repro tidak menunjukkan perilaku bermasalah pada build 11.0.6020.0 dan setelah memutakhirkan ke SP3 masalah sekarang diperbaiki.
SELECT WebAnalyticsId, MarketKey from [dbo].[factWebAnalytics] TABLESAMPLE (897667 ROWS) ORDER BY MarketKey, WebAnalyticsId
berjalan dalam waktu kurang dari 30 detik untuk saya. Itu tidak menggunakan indeks toko kolom. Ini menggunakan indeks berkerumun.