Mengapa perlu waktu lama untuk menghitung Rencana Eksekusi?

9

Salah satu pelanggan kami baru saja meningkatkan ke server baru.

Untuk prosedur tersimpan tertentu saat pertama kali Anda menjalankannya, membutuhkan waktu lebih dari tiga menit untuk dijalankan. Berjalan selanjutnya kurang dari 1 detik.

Ini membuat saya percaya bahwa tiga menit awal terutama digunakan untuk menghitung rencana eksekusi. Berjalan selanjutnya kemudian gunakan saja paket cache dan jalankan secara instan.

Pada basis data pengujian kami, dibutuhkan sekitar 5 detik untuk menghitung rencana untuk prosedur yang sama.

Saya tidak melihat sesuatu yang mengerikan dalam rencana itu sendiri - walaupun saya tidak membayangkan itu relevan karena rencana tersebut menunjukkan berapa lama waktu yang dibutuhkan untuk menjalankan kueri, tidak menghitung sendiri.

Server adalah inti 16 dengan memori 24 gb. Tidak ada CPU yang berat atau beban memori yang terjadi.

Apa yang menyebabkan perhitungan lambat hanya pada basis data tertentu?

Langkah apa yang bisa saya ambil untuk menemukan penyebab masalah?

Edit

Jadi saya telah berhasil mengakses server dan menjalankan kueri dengan SET SHOWPLAN_XML ON .

Saya dapat mengonfirmasi bahwa CompileTime untuk kueri menghabiskan 99% waktu eksekusi kueri. The StatementOptmEarlyAbortReason adalah "TimeOut" , pada database uji kami dengan salinan database mereka alasannya adalah MemoryLimitExceeded.

Mongus Pong
sumber
1
Anda yakin dengan kompilasi paket yang memakan waktu lama, tidak hanya membaca data ke dalam cache dari disk?
Mark Storey-Smith
1
Waktu kompilasi memang muncul dalam XML rencana itu sendiri. Sudahkah Anda mengidentifikasi waktu kompilasi dan bukan sesuatu yang lain misalnya pembaruan statistik otomatis yang sinkron? Apa versi SQL Server Anda?
Martin Smith
@ MarkStorey-Smith Yah aku tidak begitu yakin tentang apa pun. Saya tahu bahwa menjalankan DBCC FREEPROCCACHE , yang hanya membersihkan cache paket itu, akan membutuhkan waktu kueri berikutnya kembali hingga 3 menit.
Mongus Pong
@ MartinSmith Ah ya sangat berguna, saya telah menggunakan rencana permintaan visual. Ya waktu kompilasi kira-kira seluruh waktu pelaksanaan kueri. Kami berada di SQL Server 2008 R2.
Mongus Pong
@MongusPong - Jika Anda membuat statistik hanya salinan dari database produksi yang dapatkah Anda mereproduksi ini di lingkungan pengujian Anda? Untuk apa rencana itu StatementOptmEarlyAbortReason?
Martin Smith

Jawaban:

9

Saya benci menjawab pertanyaan saya sendiri, terutama karena saya sudah mendapat banyak bantuan dari orang lain untuk menyelesaikan solusinya, tetapi begini saja.

Masalahnya adalah karena beberapa statistik tak berguna dalam database. Melihat rencana eksekusi, pengoptimal mengharapkan 11,5 TB data yang dikembalikan dari kueri. Pada kenyataannya adalah menerima 87kb. Saya sekarang tahu bahwa ketidakcocokan besar antara baris yang diharapkan dan aktual yang dikembalikan adalah tanda bahwa statistiknya sudah ketinggalan zaman.

Cukup berlari

exec sp_updatestats

memaksa database untuk memperbarui statistik untuk semua tabel.

Ini telah menurunkan waktu eksekusi permintaan dari 3 menit menjadi 6 detik. Semua orang pemenang!

Terima kasih atas semua bantuan kalian. : 0)

Mongus Pong
sumber