Performa kueri yang buruk

10

Kami memiliki prosedur besar (10.000+ garis) yang biasanya berjalan dalam 0,5-6,0 detik tergantung pada seberapa banyak data yang harus dikerjakan. Selama sebulan terakhir ini sudah mulai lebih dari 30 detik setelah kami melakukan pembaruan statistik dengan FULLSCAN. Ketika melambat, sp_recompile "memperbaiki" masalah, sampai pekerjaan statistik malam berjalan lagi.

Dengan membandingkan rencana eksekusi yang lambat dan cepat, saya mempersempitnya ke tabel / indeks tertentu. Ketika berjalan lambat ia memperkirakan ~ 300 baris akan dikembalikan dari indeks tertentu, ketika berjalan cepat ia memperkirakan 1 baris. Ketika berjalan lambat ia menggunakan Spool Tabel setelah melakukan pencarian pada indeks, ketika berjalan cepat itu tidak melakukan Spool Tabel.

Menggunakan DBSS SHOW_STATISTICS, saya membuat grafik histogram indeks di excel. Saya biasanya mengharapkan grafik lebih "bergulir bukit", tetapi sebaliknya, terlihat seperti gunung, titik tertinggi menjadi 2x-3x lebih tinggi daripada kebanyakan nilai lain pada grafik.

Histogram Indeks

Jika saya memperbarui statistik di atasnya, tanpa FULLSCAN, itu terlihat lebih normal. Jika saya kemudian menjalankannya dengan FULLSCAN lagi sepertinya saya jelaskan di atas.

Ini terasa seperti masalah mengendus parameter, dan secara khusus terkait dengan (tampaknya) distribusi indeks aneh di atas.

Proc mengambil parameter tabel bernilai, dapatkah sniffing parameter terjadi pada parameter tabel bernilai?

EDIT: Proc juga mengambil 12 parameter lain, beberapa di antaranya opsional, dua di antaranya adalah tanggal mulai dan berakhir.

Apakah histogramnya aneh, atau saya menggonggong pohon yang salah?

Saya tentu saja nyaman mencoba menyesuaikan kueri dan / atau mencoba menyesuaikan indeks saya. Jika itu adalah perbaikan yang hebat, pada saat itu pertanyaan saya lebih tentang histogram miring.

Saya harus menyebutkan bahwa ini adalah indeks berkerumun IDENTITAS PK. Kami memiliki dua sistem yang saling berbicara, satu sistem warisan, satu sistem baru yang dikembangkan di rumah. Kedua sistem menyimpan data yang serupa. Untuk tetap menyinkronkan PK pada tabel ini di sistem baru bertambah ketika ada hal-hal yang ditambahkan ke sistem lama, bahkan jika data tidak datang (RESEED dilakukan). Jadi mungkin ada beberapa kesenjangan dalam penomoran di kolom ini. Catatan jarang, jika pernah, dihapus.

Pikiran apa pun akan sangat dihargai. Saya lebih dari senang untuk mengumpulkan / memasukkan lebih banyak info.

Mark Wilkinson
sumber
Apakah satu - satunya parameter pada prosedur ini adalah TVP atau ada params lain juga?
Martin Smith
1
Jika Anda melihat rencana lambat dan cepat XML akankah perbedaannya dapat dijelaskan oleh berbeda ParameterCompiledValueuntuk params lainnya?
Martin Smith
1
Rentang tanggal yang dihimpunnya secara dramatis lebih sempit (5 hari, bukan 31). Untuk sebagian besar panggilan, proc ini akan dijalankan selama sebulan. Saya bisa mencoba menambahkan petunjuk kompilasi ulang ke pernyataan spesifik itu.
Mark Wilkinson
1
Itu jelas tampak seperti distribusi aneh untuk kolom identitas. Saya baru saja membaca artikel ini, dan bertanya-tanya apakah Anda dapat menguraikan apa yang Anda lihat untuk perkiraan vs aktual pada dua rencana ini? > blogs.technet.com/b/mspfe/archive/2013/04/18/…
Richard Schweiger
1
Hanya untuk menjadi jelas: apa grafik sebenarnya? RANGE_HI_KEYpada sumbu x mungkin, tetapi apa yang ada di sumbu y? EQ_ROWS? RANGE_ROWS? Jumlahnya?
Paul White 9

Jawaban:

3

Ini akhirnya terkait dengan sniffing parameter. Kebetulan beberapa versi aneh dari kueri ini dieksekusi BENAR SETELAH statistik dibangun kembali. Jadi rencana yang di-cache tidak mewakili mayoritas panggilan. Saya menggunakan trik menyalin parameter tanggal ke variabel lokal dan ini berfungsi dengan baik, dengan sedikit atau tidak ada dampak pada kinerja. Ini tidak menjawab mengapa histogram terlihat "tidak aktif", tetapi ini menjelaskan masalah kinerja saya.

Mark Wilkinson
sumber