히스토리 데이터를 파티션 된보기로 저장하는 아카이브 데이터베이스를 유지 보수합니다. 분할 열은 날짜 / 시간입니다. 보기 아래의 각 테이블은 한 달의 데이터를 저장합니다.
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"에 영향을 줄 수 있습니다.
이 맥락에서 그것은 무엇을 의미합니까? 이러한 복잡한 필터가 옵티 마이저를 혼란스럽게합니까? 내가 걱정해야 할 것입니까?
COLLATE
범위 발현 작동하게 만이 제대로 당신은 대체 할 수 N'[0-9A-F]')
와 N'[0123456789ABCDEF]'
드롭COLLATE Latin1_General_BIN2
COLLATE Latin1_General_BIN2
에 식을 만든다checks.name
unsargable. 특정 쿼리의 경우 카디널리티 추정치에 어떤 차이가 있는지 확실하지 않습니다.