Bagaimana cara mendapatkan kinerja query yang akurat?

9

Saya berusaha meningkatkan kinerja prosedur tersimpan. Ketika saya menjalankan SP, hampir selesai secara instan, seolah-olah ada sesuatu yang di-cache. Saya diberitahu untuk menggunakan dua baris SQL berikut sebelum mengeksekusi SP di SSMS:

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

Ketika saya menjalankan SP dengan dua baris kode di atas SP selesai dalam waktu sekitar 8 detik. Namun, apakah ini benar-benar memberi saya waktu eksekusi yang sebenarnya (seolah-olah saya menjalankan ini dari aplikasi)? Bagaimana aku tahu?

OO
sumber

Jawaban:

9

Perintah-perintah itu melakukan dua hal:

  • Bersihkan cache halaman, yang menyimpan halaman data yang telah diambil dari disk (biasanya faktor terbesar waktu dalam kueri adalah akses disk)
  • Hapus cache rencana kueri, yang berarti server perlu membuat rencana kueri baru. Ini biasanya tidak signifikan kecuali untuk volume transaksi yang sangat tinggi.

Anda pada dasarnya mendapatkan waktu yang setara dengan skenario "kasus terburuk" - Anda baru saja me-reboot server dan tidak ada yang ada dalam memori. Proses selanjutnya tidak perlu membayar biaya untuk menarik data dari disk karena halaman tersebut sudah dimuat ke dalam memori.

Ini mirip dengan situasi dunia nyata - pengguna pertama Anda yang menjalankan kueri tertentu kemungkinan harus menunggu lebih lama daripada yang berjalan berikutnya, dengan asumsi Anda memeriksa data yang sama.

Metode bagus yang saya suka gunakan adalah menjalankan beberapa kali dan mengambil rata-rata. Ini sangat membantu dalam lingkungan bersama karena Anda tidak memiliki kontrol penuh atas sumber daya bersama seperti tempdb.

Anda juga dapat menggunakan perintah ini untuk mendapatkan informasi lebih lanjut tentang apa yang sebenarnya terjadi di balik layar:

SET STATISTICS IO ON
SET STATISTICS TIME ON

Ini akan memberi Anda informasi terperinci tentang pembacaan halaman dari disk (per objek), pembacaan halaman logis, waktu yang dihabiskan untuk menyusun rencana, dan waktu yang dihabiskan untuk menjalankan kueri.

JNK
sumber
jawaban yang sangat baik seperti JNK biasa.
OO
Saya senang bisa membantu! Anda kebetulan mengajukan pertanyaan tentang banyak hal yang telah saya tangani. Jika Anda bertanya tentang replikasi atau manajemen memori saya tidak akan menambahkan banyak :)
JNK
2
Saya tahu tentang SET STATISTIK IO ON, tetapi saya tidak pernah tahu tentang SET STATISTIK. Terima kasih JNK.
datagod
2
Hanya FYI Anda bisa mendapatkan banyak informasi ini tanpa semua pengaturan SET dengan membuat rencana aktual menggunakan SQL Sentry Plan Explorer. Dan untuk mendapatkan beberapa (katakanlah, 5) berjalan Anda cukup mengakhiri batch dengan GO 5seperti di SSMS. Ini unduhan gratis, saya tidak mencoba menjual apa pun kepada Anda. sqlsentry.net/plan-explorer/sql-server-query-view.asp
Aaron Bertrand
1
@JNK, tentu saja, gratis, menghemat waktu, dan menunjukkan informasi yang mustahil atau sangat rumit untuk keluar dari Management Studio. Dan saya bekerja di sana. :-)
Aaron Bertrand