Memperbarui statistik tanpa pemindaian penuh pada SQL Server 2014 menggunakan cpu 100%, pada 2008 R2, 15%

10

Mengapa statistik pembaruan pindai penuh menggunakan 100% CPU pada SQL Server 2014 ketika mungkin menggunakan 20% CPU pada SQL Server 2008 R2, untuk tabel yang sama, dengan kemampuan perangkat keras yang serupa?

Saya telah melihat MAXDOP, opsi lain, dan benar-benar melihat tidak ada yang menonjol. Saya menyadari bahwa mungkin ada pengaturan yang dapat menyebabkan ini, tetapi pengaturannya sangat mirip untuk kedua basis data (misalnya, MAXDOPadalah 4 untuk keduanya, dengan keduanya memiliki beberapa inti). Keduanya adalah Edisi Perusahaan.

Apakah ada sesuatu yang "berbeda" dalam SQL Server 2014 versus SQL Server 2008 R2 yang dapat menjelaskan hal ini? Saya memiliki opsi memori sebesar 90% untuk kedua server. Adakah pemikiran tentang apa yang harus dicari?

Saya menjalankan pembaruan statistik dengan pemindaian penuh (100%) seminggu sekali di dua server menggunakan SQL Server 2008 R2 / SP3 dan SQL Server 2014 / SP2, dan database memiliki struktur yang sama. Pada server R2 2008, statistik pembaruan dari dua tabel yang sangat besar membutuhkan waktu beberapa jam, itulah yang saya harapkan, tetapi CPU tetap di bawah 20% atau lebih pemanfaatan sepanjang waktu. Di server 2014, CPU berjalan ke 100% selama sekitar 40 menit. Tabel sedikit lebih kecil di server 2014. Saya melihat ini dengan menggunakan menu analisis Monitor SQL.

Berikut ini adalah output dari file log Ola pada SQL Server 2014, CPU menjadi 100% dari sekitar 2:10 hingga 2:45:

Date and time: 2017-06-24 02:10:20  
Command: UPDATE STATISTICS [InVA].[dbo].[AuditField] [_WA_Sys_00000005_15502E78] WITH FULLSCAN  
Outcome: Succeeded  
Duration: 00:07:48  
Date and time: 2017-06-24 02:18:08  
Date and time: 2017-06-24 02:18:08  
Command: UPDATE STATISTICS [InVA].[dbo].[AuditField] [_WA_Sys_00000006_15502E78] WITH FULLSCAN  
Outcome: Succeeded  
Duration: 00:32:22  
Date and time: 2017-06-24 02:50:30  

Berikut ini adalah output dari file log Ola pada 2008 R2 SQL Server untuk dua statistik di atas, tetapi CPU pergi ke mungkin 15%:

Date and time: 2017-06-24 03:30:32  
Command: UPDATE STATISTICS [InGA].[dbo].[AuditField] [_WA_Sys_00000003_0425A276] WITH FULLSCAN  
Outcome: Succeeded  
Duration: 00:05:00  
Date and time: 2017-06-24 03:35:32  
Date and time: 2017-06-24 03:35:32  
Command: UPDATE STATISTICS [InGA].[dbo].[AuditField] [_WA_Sys_00000004_0425A276] WITH FULLSCAN  
Outcome: Succeeded  
Duration: 00:52:31  
Date and time: 2017-06-24 04:28:03

Saya tidak bisa menjalankannya dengan server maxdop = 1 karena itu menghilangkan semua pembuatan paket paralel, dan itu bisa merusak aplikasi. Saya berencana untuk pergi ke arah yang berlawanan dan meningkatkannya menjadi 8 (ada 16 core di kotak) dan melihat apa yang terjadi. Dapat berjalan lebih cepat untuk mengurangi lamanya waktu CPU dipatok. Pekerjaan ini berjalan saat sebagian besar pengguna pergi.

TRH_SETRANS
sumber
Apakah Anda memeriksa apakah prosesnya terikat IO pada server 2008 R2? Apakah tempdbkonfigurasinya sama? Itu bisa digunakan saat UPDATE STATISTICSsedang berjalan, sehingga bisa juga menjadi masalah.
MicSim
1
Saya juga akan curiga bahwa paralelisme mungkin adalah penyebabnya. Sudahkah Anda memeriksa Ambang Batas Biaya untuk Paralelisme? Juga, mungkin ide yang baik untuk mendapatkan daftar sp_configure lengkap dari kedua kotak dan membedakannya untuk melihat apa lagi yang berbeda.
DBADon

Jawaban:

1

Pembaruan statistik dapat dilakukan secara paralel berdasarkan banyak opsi berbeda di SQL Server:

  • Ambang Batas Biaya untuk Paralelisme - kueri harus setinggi ini untuk naik kereta paralelisme. Dua server Anda dapat memiliki pengaturan CTFP berbeda yang menyebabkan pembaruan 2008R2 menjadi single-threaded, sedangkan yang 2014 bisa multi-threaded.
  • Derajat Paralelisme Maks - menentukan berapa inti yang dapat digunakan kueri, paling banyak, jika SQL Server memutuskan untuk memaralelasinya sejauh itu. Kotak 2008R2 mungkin memiliki MAXDOP diatur ke 1, sedangkan kotak 2014 mungkin menetapkannya ke default 0 (tidak terbatas.)
  • Resource Resource - fitur Edisi Perusahaan ini memungkinkan Anda membatasi berbagai grup pengguna atau aplikasi ke berbagai MAXDOP.

Di versi SQL Server yang lebih baru (2016 & yang lebih baru), ini menjadi lebih rumit:

  • Opsi cakupan tingkat basis data - Anda dapat mengklik kanan pada basis data, masuk ke properti, dan mengatur tingkat MAXDOP untuk basis data itu.
  • Petunjuk paralelisme statistik - mulai tahun 2016 SP2, laporan statistik & pernyataan pembaruan menerima petunjuk MAXDOP

Seperti yang Anda catat, yang 2008R2 Anda akan single-threaded, sedangkan yang 2014 akan multi-threaded (sehingga selesai lebih cepat, tetapi memaksimalkan CPU saat berjalan.)

Untuk menemukan keseimbangan yang tepat untuk pekerjaan statistik Anda, pikirkan:

  • Apa beban kerja lain yang terjadi di database pada saat yang bersamaan? Apakah Anda mampu mendominasi kotak selama periode singkat? Misalnya, di gudang data yang tidak digunakan selama sebagian besar jam akhir pekan, saya telah melihat orang-orang mengeruk pembaruan statistik dengan fullscans ketika mereka tahu tidak ada yang menggunakan server. Dalam lingkungan transaksional tugas berat, Anda harus mulai menggunakan dampak yang lebih sedikit untuk tugas pemeliharaan jika pengguna mengeluh bahkan selama periode tengah malam.
  • Apakah fullscan benar-benar diperlukan? Apakah Anda melihat pertanyaan yang hanya mendapatkan rencana bagus ketika Anda menggunakan opsi fullscan, atau apakah Anda hanya melakukannya sebagai hal praktik terbaik? Seiring bertambahnya basis data Anda, jika investasi perangkat keras Anda tidak mengimbangi, Anda mungkin harus mulai melakukan tradeoff dalam pengambilan sampel statistik daripada melakukan fullscans.
  • Bisakah Anda memperbarui statistik lebih jarang? Misalnya, perbarui 1/4 statistik Anda setiap akhir pekan, dan kemudian setiap bulan, semuanya akan mendapat pembaruan statistik?
  • Bisakah Anda memperbarui lebih sedikit objek? Seringkali saya melihat orang-orang memperbarui statistik bahkan pada audit besar atau tabel arsip hanya karena beberapa lusin sisipan baru dilakukan, tetapi sisipan tersebut tidak benar-benar memengaruhi statistik di atas meja (dan toh tidak ada yang menanyakannya.)
Brent Ozar
sumber
0

Jawaban wiki komunitas :

Tebakan terbaik: Paket yang dipilih untuk memperbarui statistik adalah paralel, atau lebih paralel, pada kotak 2014 daripada kotak 2008 R2.

Statistik pembaruan paralel untuk fullscantelah ada sejak 2005, dan untuk statistik sampel dimulai dengan 2016, lihat Penambahan Kueri Pengoptimal dalam SQL Server 2016 oleh Gjorgji Gjeorgjievski di SQL Server Database Engine Blog.

Jika Anda memiliki Edisi Perusahaan, Anda bisa menggunakan Resource Governor untuk membatasi CPU yang digunakan oleh pekerjaan pemeliharaan Anda.

Pertimbangkan juga memberi suara untuk parameter Sambungkan saran Tambahkan MAXDOPke Perbarui Statistik oleh Javier Villegas.

Tanya Jawab Terkait: Pembaruan Statistik Paralel

user126897
sumber