Saya memiliki SQL Server 2005 yang telah menjadi tak terduga akhir-akhir ini, dan saya menggaruk-garuk kepala mengapa. Pertanyaan yang dieksekusi dalam hitungan detik mengubah rencana dan mengambil menit (meluangkan waktu dalam pemindaian tabel penuh atau spool indeks). Sekarang hal pertama dan yang paling jelas adalah, statistiknya usang sehingga pengoptimal menjadi bingung tetapi saya yakin ini tidak terjadi - pertama karena data yang mendasarinya tidak berubah secara signifikan (misalnya menambahkan data satu hari di atas data setahun sudah ada dalam tabel) dan kedua karena Statistik Buat Otomatis dan Statistik Pembaruan Otomatis keduanya benar. Namun optimizer adalah semakin bingung; menjalankan SQL di Tuning Advisor memberi saya banyak CREATE STATISTICS
pernyataan multi-kolom yang sepertinya memperbaikinya (sampai bit berikutnya dari SQL yang nakal).
Adakah ide strategi yang dapat saya gunakan untuk melakukan pendekatan terhadap penyebab masalah ini? Adakah alasan mengapa statistik "normal" tidak mencukupi?
sumber
where col=(cast @var...)
) dan@var
mungkin'%'
. Saya baru saja mewarisinya satu atau dua minggu yang lalu, dan pada dasarnya harus tetap berfungsi sampai diganti. Terima kasih untuk tautannya, saya akan berputar.SOS_SCHEDULER_YIELD
adalahCXPACKET
dansp_configure "max degree of parallelism", 1
untuk saat ini - telah mengetuk kedua masalah di kepala. Terima kasih!Dari MSDN :
" Sisipkan Operasi yang Terjadi pada Menanjak atau Menurun Kolom Kunci Statistik pada kolom kunci naik atau turun, seperti IDENTITY atau kolom timestamp waktu-nyata, mungkin memerlukan pembaruan statistik yang lebih sering daripada yang dilakukan pengoptimal query. Memasukkan operasi menambahkan nilai baru ke kolom naik atau turun. Jumlah baris yang ditambahkan mungkin terlalu kecil untuk memicu pembaruan statistik. Jika statistik tidak mutakhir dan kueri pilih dari baris yang paling baru ditambahkan, statistik saat ini tidak akan memiliki perkiraan kardinalitas untuk nilai-nilai baru ini. menghasilkan perkiraan kardinalitas yang tidak akurat dan kinerja kueri yang lambat.
Misalnya, permintaan yang memilih dari tanggal pesanan penjualan terbaru akan memiliki perkiraan kardinalitas yang tidak akurat jika statistik tidak diperbarui untuk menyertakan perkiraan kardinalitas untuk tanggal pesanan penjualan terbaru.
Setelah Operasi Pemeliharaan Pertimbangkan untuk memperbarui statistik setelah melakukan prosedur perawatan yang mengubah distribusi data, seperti memotong tabel atau melakukan penyisipan massal sebagian besar baris. Ini dapat menghindari penundaan di masa depan dalam pemrosesan permintaan sementara permintaan menunggu pembaruan statistik otomatis. "
Anda dapat menggunakan "EXEC sp_updatestats" dari waktu ke waktu di sistem Anda (dijadwalkan beberapa waktu) atau menggunakan fungsi STATS_DATE pada semua objek dan melihat kapan statistik mereka benar-benar diperbarui terakhir kali dan jika ada terlalu banyak waktu sejak saat itu, gunakan UPDATE STATISTIK untuk objek tertentu. Dalam pengalaman saya, bahkan dengan statistik Otomatis diaktifkan kami masih dipaksa untuk memperbarui statistik dari waktu ke waktu, karena operasi penyisipan yang tidak memicu pembaruan otomatis.
Untuk menambahkan kode pribadi saya (digunakan dalam pekerjaan mingguan yang membuat pernyataan dinamis untuk pembaruan statistik):
Di sini saya mendapatkan semua objek di mana statistik tidak diperbarui selama lebih dari 3 bulan atau sejak statistik terakhir diperbarui memiliki lebih dari 10% dari baris diubah.
sumber
SOS_SCHEDULER_YIELD
tetapi saya tidak bisa mengatakan sekarang apakah itu karena rencana yang buruk, atau bahwa kotak ini (6 tahun, 2-prosesor, 4G RAM) benar-benar hanya kelebihan beban sekarang dan saya sudah melewati beberapa titik kritis.Dugaan saya adalah bahwa satu atau lebih tabel Anda menjadi cukup besar sehingga mereka tidak mencapai 20% dari perubahan yang diperlukan untuk membantu menandai bahwa statistik saat ini basi sehingga Statistik Pembaruan Otomatis akan muncul, namun ada cukup pembaruan (atau sisipan ) bahwa memiliki statistik yang diperbarui akan banyak membantu. Saya menemukan hal yang sama baru-baru ini di lingkungan tertentu setelah memutakhirkan dari SQL 2000 ke SQL 2008.
Selain situs lain yang disebutkan dalam jawaban di atas, saya sarankan memeriksa sumber daya online berikut.
1) Red-Gate memiliki sejumlah ebook gratis yang tersedia untuk diunduh termasuk "SQL Server Statistics" oleh Holger Schmeling, di mana Anda akan menemukan kutipan berikut:
http://www.red-gate.com/our-company/about/book-store/
"tabel dengan lebih dari 500 baris setidaknya 20% dari data kolom harus diubah untuk membatalkan statistik yang tertaut"
2) SQL Sentry memiliki alat Plan Explorer gratis yang membantu melacak masalah dalam rencana SQL, seperti perkiraan terlalu banyak atau terlalu sedikit baris dibandingkan dengan jumlah aktual baris untuk tabel tertentu dalam kueri. Simpan saja rencana eksekusi yang sebenarnya dari SSMS dan kemudian berjalanlah melalui bagian-bagian berbeda dari rencana menggunakan Plan Explorer. Bukan berarti informasi tersebut tidak tersedia di SSMS menggunakan rencana eksekusi grafik, tetapi alat dari SQL Sentry membuatnya lebih mudah untuk dilihat.
http://www.sqlsentry.com/plan-explorer/sql-server-query-view.asp
3) Periksa sendiri tanggal pembaruan statistik untuk tabel di kueri yang paling Anda minati menggunakan STATS_DATE (), Anda dapat menemukan kueri cepat untuk mendapatkan statistik terlama menggunakan kueri yang ditemukan dalam diskusi berikut.
http://blog.sqlauthority.com/2010/01/25/sql-server-find-statistics-update-date-update-update-statistics/
Saya harap ini membantu!
Saya pikir Anda akan sangat menikmati buku dari Red-Gate!
-Jeff
sumber