Saya telah menyimpan log kueri berjalan mahal, bersama dengan rencana kueri mereka, dalam tabel untuk memungkinkan kami memantau tren kinerja dan mengidentifikasi area yang perlu dioptimalkan.
Namun, itu sampai pada titik di mana rencana kueri mengambil terlalu banyak ruang (karena kami menyimpan seluruh rencana terhadap setiap kueri).
Karena itu saya mencoba menormalkan data yang ada dengan mengekstraksi QueryPlanHash dan QueryPlan ke tabel lain.
CREATE TABLE QueryPlans
(
QueryPlanHash VARBINARY(25),
QueryPlan XML,
CONSTRAINT PK_QueryPlans PRIMARY KEY
(
QueryPlanHash
)
);
Karena definisi query_plan_hash
in sys.dm_exec_query_stats
adalah bidang biner (dan saya akan secara teratur memasukkan data baru), saya menggunakan VARBINARY
tipe data di tabel baru saya.
Namun, masukkan di bawah gagal ...
INSERT INTO QueryPlans
( QueryPlanHash, QueryPlan )
SELECT queryplanhash, queryplan
FROM
(
SELECT
p.value('(./@QueryPlanHash)[1]', 'varchar(20)') queryplanhash,
QueryPlan,
ROW_NUMBER() OVER (PARTITION BY p.value('(./@QueryPlanHash)[1]', 'varchar(20)') ORDER BY DateRecorded) rownum
FROM table
CROSS APPLY QueryPlan.nodes('/ShowPlanXML/BatchSequence/Batch/Statements/StmtSimple[@QueryPlanHash]') t(p)
) data
WHERE rownum = 1
.... dengan kesalahan
Implicit conversion from data type varchar to varbinary is not allowed. Use the CONVERT function to run this query.
Masalahnya adalah bahwa hash rencana kueri sudah dalam format biner, namun disimpan sebagai VARCHAR dalam Paket Kueri XML misalnya
0x9473FBCCBC01AFE
dan CONVERT to BINARY memberikan nilai yang sama sekali berbeda
0x3078393437334642434342433031414645
Saya mencoba mengubah definisi nilai dalam pilih XQuery ke biner, tetapi kemudian tidak mengembalikan nilai.
Bagaimana cara mengekstrak nilai dari 0x9473FBCCBC01AFE
paket kueri XML sebagai VARBINARY
, bukan sebagai VARCHAR
?
,1
itulah yang saya lewatkan. Itu lebih mudah dari yang saya harapkan! Terima kasih!