Ketika Anda mengaktifkan opsi " Optimalkan untuk Beban Kerja Ad Hoc ", Anda akan menyebabkan permintaan ad-hoc yang dijalankan pada kali ke-2 menjadi sama lambatnya dengan tanggal 1, karena Anda akan Menyusun Rencana Eksekusi dan menarik data yang sama ( tanpa itu di-cache) itu 2 kali pertama.
Ini mungkin bukan masalah besar, tetapi Anda akan menyadarinya saat menguji kueri.
Jadi apa yang terjadi sekarang, tanpa opsi ini dihidupkan dan cache penuh dengan permintaan Ad-Hoc 1-Off?
Algoritma Manajemen Caching:
Ketika fitur Optimasi ini diperkenalkan, algoritma manajemen caching juga diperbarui.
Artikel Kimberly Tripp juga merujuk pada posting Kalen Delaney tentang perubahan algoritma ini.
Dia menjelaskan yang terbaik:
Perubahan sebenarnya menghitung ukuran cache rencana di mana SQL Server mengakui bahwa ada tekanan memori, dan itu akan mulai menghapus paket dari cache. Paket yang akan dihapus adalah paket murah yang belum digunakan kembali, dan ini adalah HAL YANG BAIK.
Ini berarti rencana satu kali sial itu akan menjadi yang pertama ketika Anda perlu membebaskan sumber daya.
Jadi sekarang pertanyaannya menjadi:
" Mengapa kita MEMBUTUHKAN 'Optimalkan untuk Beban Kerja Ad Hoc' ketika SQL Server menangani menghapus paket yang tidak digunakan bila perlu? "
Jawaban saya adalah, jika Anda secara teratur memiliki s-ton oodles dinamis-sql yang menghasilkan iklan tanpa parameter permintaan -hoc, maka masuk akal untuk mengaktifkan fitur ini.
Anda ingin menghindari menempatkan beban pada sumber daya sistem, sehingga memaksa rencana cache / penghapusan data setelah Anda menggunakan ruang memori cache maksimal.
Bagaimana saya tahu kapan saya harus menyalakan ini?
Berikut adalah kueri yang saya tulis untuk menunjukkan kepada Anda berapa banyak Rencana Ad-Hoc yang saat ini Anda cached dan berapa banyak ruang disk yang mereka makan (hasilnya akan berubah sepanjang hari - jadi ujilah selama waktu beban berat):
--Great query for making the argument to use "Optimize for Ad Hoc Workloads":
SELECT S.CacheType, S.Avg_Use, S.Avg_Multi_Use,
S.Total_Plan_3orMore_Use, S.Total_Plan_2_Use, S.Total_Plan_1_Use, S.Total_Plan,
CAST( (S.Total_Plan_1_Use * 1.0 / S.Total_Plan) as Decimal(18,2) )[Pct_Plan_1_Use],
S.Total_MB_1_Use, S.Total_MB,
CAST( (S.Total_MB_1_Use * 1.0 / S.Total_MB ) as Decimal(18,2) )[Pct_MB_1_Use]
FROM
(
SELECT CP.objtype[CacheType],
COUNT(*)[Total_Plan],
SUM(CASE WHEN CP.usecounts > 2 THEN 1 ELSE 0 END)[Total_Plan_3orMore_Use],
SUM(CASE WHEN CP.usecounts = 2 THEN 1 ELSE 0 END)[Total_Plan_2_Use],
SUM(CASE WHEN CP.usecounts = 1 THEN 1 ELSE 0 END)[Total_Plan_1_Use],
CAST((SUM(CP.size_in_bytes * 1.0) / 1024 / 1024) as Decimal(12,2) )[Total_MB],
CAST((SUM(CASE WHEN CP.usecounts = 1 THEN (CP.size_in_bytes * 1.0) ELSE 0 END)
/ 1024 / 1024) as Decimal(18,2) )[Total_MB_1_Use],
CAST(AVG(CP.usecounts * 1.0) as Decimal(12,2))[Avg_Use],
CAST(AVG(CASE WHEN CP.usecounts > 1 THEN (CP.usecounts * 1.0)
ELSE NULL END) as Decimal(12,2))[Avg_Multi_Use]
FROM sys.dm_exec_cached_plans as CP
GROUP BY CP.objtype
) AS S
ORDER BY S.CacheType
Hasil:
Saya tidak akan mengatakan, " Ketika Anda memiliki X MB's " atau " Jika X% dari Ad Hoc Anda Sekali Pakai " untuk mengaktifkannya.
Itu tidak mempengaruhi Sprocs, Pemicu, Tampilan atau Parameterized / SQL Siap - hanya permintaan Ad-Hoc.
Rekomendasi pribadi saya adalah hanya menyalakan di Lingkungan Prod Anda, tetapi pertimbangkan meninggalkannya di Lingkungan Dev Anda.
Saya mengatakan ini hanya untuk Dev, karena jika Anda mengoptimalkan permintaan yang membutuhkan waktu satu menit atau lebih untuk dijalankan, maka Anda tidak ingin menjalankannya 3 kali sebelum Anda dapat melihat seberapa cepat itu akan pergi dengan itu di-cache - setiap satu kali Anda mengeditnya untuk menemukan desain optimasi terbaik.
Jika pekerjaan Anda tidak melibatkan melakukan ini sepanjang hari, maka gila dan minta DBA Anda untuk menyalakannya di mana-mana.