Mengapa SQL Server menolak untuk memperbarui statistik ini dengan apa pun kecuali fullscan?

13

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 tempdbtingkat tumpahan 2.

masukkan deskripsi gambar di sini

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

masukkan deskripsi gambar di sini

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 NORECOMPUTEini?


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.

Martin Smith
sumber

Jawaban:

10

Hal pertama yang saya coba adalah memperbarui contoh SQL Server dari SP1 CU16 dengan QFE yang Anda miliki sekarang, ke SP3 CU1 (build 2012 saat ini) kemudian menguji ulang untuk melihat apakah perilakunya sama.

Sebagai contoh:

PERBAIKI: STATISTIK PEMBARUAN melakukan pengambilan sampel yang salah dan pemrosesan untuk tabel dengan indeks columnstore di SQL Server

... pertama kali dirilis dalam SP2 CU2 mungkin relevan.

Yang mengatakan, saya tidak yakin apakah kolomstore 2012 mendukung tablesample, diperlukan untuk statistik sampel. Saya akan memperbarui jawaban ini setelah repro tersedia dalam pertanyaan.

Paul White 9
sumber
1
(Mengenai paragraf terakhir) SELECT WebAnalyticsId, MarketKey from [dbo].[factWebAnalytics] TABLESAMPLE (897667 ROWS) ORDER BY MarketKey, WebAnalyticsIdberjalan dalam waktu kurang dari 30 detik untuk saya. Itu tidak menggunakan indeks toko kolom. Ini menggunakan indeks berkerumun.
Martin Smith
2
Ya itu pasti terlihat seperti sesuatu yang diperbaiki di versi yang lebih baru. Saya menghasilkan repro sederhana di sini pastebin.com/7f4TwmKW dan pada server uji yang menjalankan 11.0.5343.0 menemukan permintaan saya untuk ukuran sampel 10.000 baris diabaikan dan semua 8.000.000 baris sampel i.stack.imgur.com/DbbjZ.png (paket) sama seperti yang ada di pertanyaan) - Tapi saya tidak menemukan ini di Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (baris sampel ada 274.649 yang cukup dekat dengan perkiraan jumlah baris di bangunan yang lebih awal dan rencananya menggunakan CI daripada kolom kolom.)
Martin Smith