Sebelum menjalankan tes kinerja / baseline untuk aplikasi yang menggunakan SQL Server, saya ingin dapat mengatur instance ke keadaan "bersih", tanpa memulai kembali instance. Ada langkah-langkah yang cenderung saya ikuti, tetapi saya ingin membangun daftar definitif yang berada dalam urutan yang benar, dan tidak memiliki langkah-langkah yang berlebihan.
Apakah daftar langkah ini menyelesaikan pengaturan SQL Server ke keadaan "bersih"?
Apakah urutannya logis / benar?
Apakah ada langkah yang berlebihan?
CHECKPOINT -- Write all dirty pages
DBCC DROPCLEANBUFFERS -- All should be clean after checkpoint?
DBCC FREEPROCCACHE -- Clear the plan cache
DBCC FREESYSTEMCACHE -- Is this necessary after FREEPROCCACHE?
DBCC FREESESSIONCACHE -- May not be necessary if distributed queries aren't used, but want to catch all scenarios
EXEC SP_UPDATESTATS -- Refresh stats
'BEGIN TESTING!'
sql-server
dbcc
performance-testing
cache
Eric Higgins
sumber
sumber
DROPCLEANBUFFERS
bagus untuk pengujian tetapi tidak selalu akurat. Jika Anda mereferensikan tabel volume tinggi, sangat mungkin Anda hampir selalu memiliki halaman di memori, dan waktu IO tidak akan menjadi faktor besar dalam kueri itu. Anda mungkin memberi bobot lebih pada IO daripada yang realistis dalam hal itu.Jawaban:
Pertama, saya akan mundur dan bertanya pengukuran apa yang Anda rencanakan untuk dikumpulkan selama tes. Jika Anda menghitung pembacaan logis dengan kueri, misalnya, maka Anda tidak perlu membebaskan cache. Saya penggemar berat menggunakan pembacaan logis karena tidak tergantung apakah data di-cache atau di disk - dan dalam produksi, sulit untuk menebak apakah data kueri akan di-cache atau tidak (kecuali jika Anda menyimpan seluruh database di memori) . Jika Anda menyetel untuk meminimalkan pembacaan logis, maka aplikasi akan berjalan lebih cepat apakah data ada dalam cache atau tidak.
Selanjutnya, saya akan mempertanyakan apa yang berubah di antara proses. Misalnya, dengan menjalankan EXEC SP_UPDATESTATS di setiap basis data seperti yang Anda sarankan, Anda akan menguji ulang statistik untuk tabel yang telah diperbarui. Namun, kecuali Anda memperbarui statistik dengan fullscan, Anda mendapatkan baris acak dari tabel - itu tidak terlalu berulang, dan saya tidak berpikir Anda benar-benar ingin melakukan itu. Sebagai gantinya, Anda mungkin ingin mengembalikan basis data di antara setiap proses sehingga Anda selalu menguji data yang persis sama. Jika tes Anda melakukan sisipan / pembaruan / penghapusan, tes tersebut mungkin memiliki profil kinerja yang berbeda pada setiap proses jika Anda tidak memulihkan database (karena mereka menambah / mengubah data, ditambah mengubah statistik pada data) - dan lebih buruk lagi,
sumber