Tôi đã ghi nhật ký các truy vấn đang chạy đắt tiền, cùng với các gói truy vấn của họ, trong một bảng để cho phép chúng tôi theo dõi các xu hướng về hiệu suất và xác định các khu vực cần tối ưu hóa.
Tuy nhiên, đã đến lúc các kế hoạch truy vấn chiếm quá nhiều không gian (vì chúng tôi đang lưu trữ toàn bộ kế hoạch đối với từng truy vấn).
Do đó, tôi đang cố gắng bình thường hóa dữ liệu hiện có bằng cách trích xuất QueryPlanHash và QueryPlan sang một bảng khác.
CREATE TABLE QueryPlans
(
QueryPlanHash VARBINARY(25),
QueryPlan XML,
CONSTRAINT PK_QueryPlans PRIMARY KEY
(
QueryPlanHash
)
);
Vì định nghĩa của query_plan_hash
in sys.dm_exec_query_stats
là trường nhị phân (và tôi sẽ thường xuyên chèn dữ liệu mới), tôi đã sử dụng VARBINARY
cho loại dữ liệu trong bảng mới của mình.
Tuy nhiên, phần chèn bên dưới không thành công ...
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
.... với lỗi
Implicit conversion from data type varchar to varbinary is not allowed. Use the CONVERT function to run this query.
Vấn đề là các băm của kế hoạch truy vấn đã ở định dạng nhị phân, tuy nhiên được lưu trữ dưới dạng VARCHAR trong Kế hoạch truy vấn XML, vd
0x9473FBCCBC01AFE
và CHUYỂN ĐỔI để BINary mang lại một giá trị hoàn toàn khác
0x3078393437334642434342433031414645
Tôi đã thử thay đổi định nghĩa giá trị trong XQuery select thành nhị phân, nhưng sau đó nó không trả về giá trị nào.
Làm cách nào để trích xuất giá trị 0x9473FBCCBC01AFE
từ một kế hoạch truy vấn XML dưới dạng VARBINARY
chứ không phải là một VARCHAR
?
,1
là những gì tôi đã thiếu. Điều đó dễ dàng hơn tôi mong đợi! Cảm ơn!