식의 유형 변환은 쿼리 계획 선택의 "CardinalityEstimate"에 영향을 줄 수 있습니까?


10

히스토리 데이터를 파티션 된보기로 저장하는 아카이브 데이터베이스를 유지 보수합니다. 분할 열은 날짜 / 시간입니다. 보기 아래의 각 테이블은 한 달의 데이터를 저장합니다.

datetime 열에 대한 점검 제한 조건으로 각 테이블의 이벤트를 제한합니다. 이를 통해 옵티마이 저는 이벤트 날짜 시간 컬럼에서 필터링하는 쿼리에 대해 검색되는 테이블을 제한 할 수 있습니다.

검사 제한 조건의 이름은 SQL Server에서 생성되었으므로 이름을 확인하여 수행하는 작업을 알기가 어렵습니다.

제약 조건 이름이 'CK_TableName_Partition'형식을 갖기를 원합니다.

이 쿼리를 사용하고 sql_text 열에서 데이터를 복사하여 이름 바꾸기 스크립트를 생성 할 수 있습니다. WHERE 절은 이름이 SQL Server에서 생성 된 것처럼 보이는 검사 제한 조건과 일치합니다.

SELECT
  checks.name AS check_name,
  tabs.name AS table_name,
  skemas.name AS schema_name,
  cols.name AS column_name,
  N'
EXECUTE sys.sp_rename
  @objname = N''' + skemas.name + N'.' + checks.name + N''',
  @newname = N''CK_' + tabs.name + N'_Partition'',
  @objtype = ''OBJECT'';' AS sql_text
FROM sys.check_constraints AS checks
INNER JOIN sys.tables AS tabs ON
  tabs.object_id = checks.parent_object_id
INNER JOIN sys.schemas AS skemas ON
  skemas.schema_id = tabs.schema_id
INNER JOIN sys.columns AS cols ON
  tabs.object_id = cols.object_id AND
  cols.column_id = checks.parent_column_id
WHERE checks.name LIKE (
  N'CK__' + SUBSTRING(tabs.name, 1, 9) +
  N'__' + SUBSTRING(cols.name, 1, 5) +
  N'__' + REPLACE(N'xxxxxxxx', N'x', N'[0-9A-F]') COLLATE Latin1_General_BIN2
)
ORDER BY table_name;

결과는 다음과 같습니다.

check_name  table_name  schema_name column_name sql_text
CK__tbAcquisi__Acqui__5C4299A5  tbAcquisitions_201301   Archive AcquisitionDT   EXECUTE sys.sp_rename  @objname = N'Archive.CK__tbAcquisi__Acqui__5C4299A5',  @newname = N'CK_tbAcquisitions_201301_Partition',  @objtype = 'OBJECT';
CK__tbAcquisi__Acqui__76026BA8  tbAcquisitions_201302   Archive AcquisitionDT   EXECUTE sys.sp_rename  @objname = N'Archive.CK__tbAcquisi__Acqui__76026BA8',  @newname = N'CK_tbAcquisitions_201302_Partition',  @objtype = 'OBJECT';
CK__tbAcquisi__Acqui__7D6E8346  tbAcquisitions_201303   Archive AcquisitionDT   EXECUTE sys.sp_rename  @objname = N'Archive.CK__tbAcquisi__Acqui__7D6E8346',  @newname = N'CK_tbAcquisitions_201303_Partition',  @objtype = 'OBJECT';
...
CK__tbRequest__Reque__60132A89  tbRequests_201301   Archive RequestDT   EXECUTE sys.sp_rename  @objname = N'Archive.CK__tbRequest__Reque__60132A89',  @newname = N'CK_tbRequests_201301_Partition',  @objtype = 'OBJECT';
CK__tbRequest__Reque__1392CE8F  tbRequests_201302   Archive RequestDT   EXECUTE sys.sp_rename  @objname = N'Archive.CK__tbRequest__Reque__1392CE8F',  @newname = N'CK_tbRequests_201302_Partition',  @objtype = 'OBJECT';
CK__tbRequest__Reque__1AFEE62D  tbRequests_201303   Archive RequestDT   EXECUTE sys.sp_rename  @objname = N'Archive.CK__tbRequest__Reque__1AFEE62D',  @newname = N'CK_tbRequests_201303_Partition',  @objtype = 'OBJECT';

쿼리 결과가 올바른 것으로 보이며 서버가 신속하게 실행합니다.

그러나 실행 계획의 루트 노드에는 경고가 있습니다.

식의 형식 변환 (CONVERT_IMPLICIT (nvarchar (128), [o]. [name], 0))은 쿼리 계획 선택의 "CardinalityEstimate"에 영향을 줄 수 있습니다.

이 맥락에서 그것은 무엇을 의미합니까? 이러한 복잡한 필터가 옵티 마이저를 혼란스럽게합니까? 내가 걱정해야 할 것입니까?


2
COLLATE Latin1_General_BIN2에 식을 만든다 checks.nameunsargable. 특정 쿼리의 경우 카디널리티 추정치에 어떤 차이가 있는지 확실하지 않습니다.
Martin Smith

2
바이너리를 가정하면 COLLATE범위 발현 작동하게 만이 제대로 당신은 대체 할 수 N'[0-9A-F]')N'[0123456789ABCDEF]'드롭COLLATE Latin1_General_BIN2
마틴 스미스

답변:


16

쿼리 결과가 올바른 것으로 보이며 서버가 신속하게 실행합니다.

그러나 실행 계획의 루트 노드에는 경고가 있습니다.

식의 형식 변환 (CONVERT_IMPLICIT (nvarchar (128), [o]. [name], 0))은 쿼리 계획 선택의 "CardinalityEstimate"에 영향을 줄 수 있습니다.

이 맥락에서 그것은 무엇을 의미합니까? 이러한 복잡한 필터가 옵티 마이저를 혼란스럽게합니까? 내가 걱정해야 할 것입니까?

경고는 정보 제공 용입니다. 쿼리가 느리게 수행되거나 카디널리티 예상치가 잘못되었음을 발견하면 가능한 원인을 찾을 수있는 위치에 대한 정보가 경고에 표시됩니다.

데이터 정렬 변경에 사용되는 암시 적 변환에 의해 경고가 트리거됩니다. 데이터 정렬을 사용하는 것이 올바른 결과를 얻는 가장 쉬운 방법이라면 그대로 두십시오. 또는 왜 필요한지 더 자세히 설명하면 누군가 조언 해 줄 것입니다.

옆으로 다음 REPLACE과 같이 대체 할 수 있습니다.

REPLICATE(N'[0-9A-F]', 8);

(이 답변은 질문에 대한 의견 요약입니다.)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.