성능 추세를 모니터링하고 최적화가 필요한 영역을 식별 할 수 있도록 쿼리 계획과 함께 비싼 실행 쿼리 로그를 테이블에 보관했습니다.
그러나 쿼리 계획이 너무 많은 공간을 차지하는 시점에 도달했습니다 (각 쿼리에 대해 전체 계획을 저장하기 때문에).
따라서 QueryPlanHash 및 QueryPlan을 다른 테이블로 추출하여 기존 데이터를 정규화하려고합니다.
CREATE TABLE QueryPlans
(
QueryPlanHash VARBINARY(25),
QueryPlan XML,
CONSTRAINT PK_QueryPlans PRIMARY KEY
(
QueryPlanHash
)
);
query_plan_hash
in 의 정의는 sys.dm_exec_query_stats
이진 필드이므로 정기적으로 새 데이터를 삽입 할 것이므로 VARBINARY
새 테이블의 데이터 유형에 사용 하고 있었습니다 .
그러나 아래 삽입이 실패합니다 ...
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
.... 오류와 함께
Implicit conversion from data type varchar to varbinary is not allowed. Use the CONVERT function to run this query.
문제는 쿼리 계획 해시가 이미 이진 형식이지만 XML 쿼리 계획에 VARCHAR로 저장되어 있다는 것입니다.
0x9473FBCCBC01AFE
BINARY로 변환은 완전히 다른 값을 제공합니다.
0x3078393437334642434342433031414645
XQuery select의 값 정의를 이진으로 변경하려고 시도했지만 값이 반환되지 않았습니다.
0x9473FBCCBC01AFE
XML 쿼리 계획에서 값을 ?가 VARBINARY
아닌 로 추출하는 방법은 VARCHAR
무엇입니까?
,1
내가 놓친 것입니다. 내가 기대했던 것보다 쉬웠다! 감사!