SQL Server Query Store - Apa yang dianggap sebagai permintaan 'ad-hoc'?


10

Saya telah melakukan penyelaman yang dalam ke SQL Server Query Store dan saya sering melihat referensi ke pertanyaan 'ad-hoc'. Namun, saya belum melihat apa yang Query Store tentukan sebagai permintaan ad-hoc. Saya telah melihat tempat-tempat yang dapat disimpulkan sebagai kueri tanpa parameter atau kueri yang dieksekusi hanya satu kali. Apakah definisi formal ada untuk ini? Maksud saya tidak secara umum. Maksud saya terkait dengan Query Store.

Sebagai contoh, halaman ini menunjukkan contoh menghapus kueri ad-hoc dari toko kueri, tetapi tampaknya kriteria yang digunakannya adalah jumlah eksekusi hanya satu. Ini sepertinya definisi aneh dari permintaan ad-hoc. BTW, jika Anda pergi ke halaman, cari 'Hapus permintaan ad-hoc'.



@SqlWorldWide - Saya telah menulis ulang pertanyaan saya. Maksud saya tidak secara umum. Maksud saya terkait dengan Query Store.
Randy Minder

Bagaimana toko kueri Anda dikonfigurasi - semua atau otomatis?
Kin Shah

@ Kin - Diatur sebagai Otomatis
Randy Minder

Jawaban:


8

Setelah sedikit mencari, saya tidak dapat menemukan sumber yang konkret dan memuaskan dari dokumentasi Microsoft untuk menjawab pertanyaan ini. Ada banyak deskripsi pihak ketiga yang baik dan definisi adhoc / ad-hoc / ad hoc di luar sana, tetapi untuk kekhususan dari pertanyaan ini saya pikir yang dekat dengan sumber itu ideal.

Bergerak melewati definisi umum (tetapi masih akurat) seperti pos SO ini (terima kasih SqlWorldWide), jika kita melihat apa yang dikatakan dokumentasi tentang topik tersebut, ia setuju dengan apa yang Anda sebutkan tentang definisi yang didasarkan pada jumlah eksekusi , Saya pikir kita bisa menganggapnya sebagai fakta.

Artikel tentang pengoptimalan untuk alur kerja ad hoc mengatakan,

Ketika opsi ini diatur ke 1, Mesin Database menyimpan rintisan paket terkompilasi kecil di cache paket saat kumpulan dikompilasi untuk pertama kalinya, alih-alih paket terkompilasi penuh. Ini membantu mengurangi tekanan memori dengan tidak membiarkan cache rencana dipenuhi dengan paket terkompilasi yang tidak digunakan kembali. Stub paket yang dikompilasi memungkinkan Mesin Database untuk mengenali bahwa batch ad hoc ini telah dikompilasi sebelumnya tetapi hanya menyimpan stub paket yang sudah dikompilasi, jadi ketika batch ini dipanggil (dikompilasi atau dieksekusi) lagi, Engine Database mengkompilasi ... dan menambahkan paket kompilasi penuh ke cache paket.

Jadi akan muncul opsi konfigurasi server permintaan ad hoc juga menggunakan definisi eksekusi tunggal sebagai definisi ad hoc. Jika kueri terus dieksekusi dan menghasilkan rencana yang sama, maka tidak akan lagi diperlakukan seperti itu.

Artikel tentang Praktik Terbaik untuk Query Store juga selaras dengan ini,

Bandingkan jumlah nilai query_hash yang berbeda dengan jumlah total entri di sys.query_store_query. Jika rasionya mendekati 1, beban kerja ad-hoc Anda menghasilkan kueri yang berbeda.

Ini, tentu saja, untuk pertanyaan yang belum digunakan sebagai prosedur tersimpan, parameter, dll. Karena mereka dapat dikenali dan diperlakukan dengan tepat langsung dari kelelawar.

Jadi berdasarkan semua ini, kita dapat mengatakan bahwa permintaan diperlakukan sebagai ad hoc jika:

  • Itu tidak parameter
  • Ini tidak secara terprogram disimpan dalam database (proc tersimpan, fungsi, pemicu, dll.)
  • Permintaan yang sama hanya dieksekusi satu kali ATAU Permintaan yang sama dieksekusi beberapa kali tetapi menghasilkan rencana permintaan yang berbeda untuk setiap eksekusi berikutnya.

4

Untuk kueri ad-hoc, kolom object_id di sys.query_store_queryDMV akan menjadi 0, seperti yang dinyatakan dalam dokumentasi sys.query_store_query :

object_id :

ID objek database yang menjadi bagian dari kueri (prosedur tersimpan, pemicu, CLR UDF / UDAgg, dll.). 0 jika kueri tidak dieksekusi sebagai bagian dari objek basis data (permintaan ad-hoc).

Anda dapat mengidentifikasi kueri ad-hoc berdasarkan nilai itu, meskipun tidak secara eksplisit dinyatakan sebagai "ini adalah yang definisi dari ad-hoc query ". :)


0

Istilah ad-hoc digunakan untuk merujuk ke pertanyaan yang hanya dieksekusi sekali. Ini konsisten dengan definisi yang digunakan untuk pengaturan database "Optimalkan untuk beban kerja ad-hoc".

Tautan yang Anda rujuk tentang penghapusan kueri ad-hoc menyertakan definisi khusus ini "Hapus kueri ad-hoc: Ini menghapus kueri yang hanya dieksekusi sekali saja dan yang lebih dari 24 jam."


0

Ad-hoc dari sys.dm_exec_cached_plans dmv ini objtypekolom di docs.microsoft.com.

Adhoc: Permintaan ad hoc. Mengacu pada Transact-SQL yang dikirimkan sebagai peristiwa bahasa dengan menggunakan osql atau sqlcmd alih-alih sebagai panggilan prosedur jarak jauh.

Salah satu penggunaan kolom ini adalah untuk melihat dalam kasus Permintaan dengan beberapa paket untuk melihat apakah beberapa paket disebabkan oleh Adhoc.

    SELECT  DISTINCT 
        QCP.objtype
        ,MultipleQ.PlanCount
        ,qStat.query_hash
        ,sText.text AS QueryText
FROM ( 
        SELECT query_hash,
               COUNT(query_hash) AS PlanCount
        FROM sys.dm_exec_query_stats
        GROUP BY query_hash
    ) AS MultipleQ
INNER JOIN sys.dm_exec_query_stats qStat ON MultipleQ.query_hash = qStat.query_hash
INNER JOIN sys.dm_exec_cached_plans  QCP
    ON QCP.plan_handle = qStat.plan_handle
CROSS APPLY sys.dm_exec_sql_text(qStat.sql_handle) AS sText
CROSS APPLY sys.dm_exec_query_plan(qStat.plan_handle) AS qp
WHERE PlanCount > 1
ORDER BY MultipleQ.PlanCount DESC

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.