Tôi duy trì một cơ sở dữ liệu lưu trữ lưu trữ dữ liệu lịch sử trong các khung nhìn được phân vùng. Cột phân vùng là một datetime. Mỗi bảng dưới dạng xem lưu trữ một tháng dữ liệu.
Chúng tôi ràng buộc các sự kiện trên mỗi bảng bằng một ràng buộc kiểm tra trên cột datetime. Điều này cho phép trình tối ưu hóa giới hạn các bảng được tìm kiếm cho các truy vấn lọc trên cột datetime sự kiện.
Tên của các ràng buộc kiểm tra được tạo bởi SQL Server, vì vậy thật khó để biết họ làm gì bằng cách nhìn vào tên của họ.
Tôi muốn các tên ràng buộc có dạng 'CK_TableName_Partition'.
Tôi có thể tạo tập lệnh đổi tên bằng truy vấn này và sao chép dữ liệu từ cột sql lòng. Mệnh đề WHERE khớp với các ràng buộc kiểm tra có tên giống như được tạo bởi 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;
Đầu ra trông như thế này:
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';
Kết quả của truy vấn dường như là chính xác và máy chủ thực hiện nó một cách nhanh chóng.
Nhưng nút gốc của kế hoạch thực hiện có một cảnh báo:
Chuyển đổi loại trong biểu thức (CONVERT_IMPLICIT (nvarchar (128), [o]. [Name], 0)) có thể ảnh hưởng đến "CardinalityEstimate" trong lựa chọn gói truy vấn
Điều đó có nghĩa gì trong bối cảnh này? Là một bộ lọc phức tạp như vậy gây nhầm lẫn tối ưu hóa? Có phải là điều tôi nên lo lắng?
COLLATE
chỉ có để làm cho công việc biểu hiện phạm vi một cách chính xác bạn có thể thay thế N'[0-9A-F]')
với N'[0123456789ABCDEF]'
và thảCOLLATE Latin1_General_BIN2
COLLATE Latin1_General_BIN2
biểu thức trên không thể mởchecks.name
rộng. Đối với truy vấn cụ thể của bạn, không chắc chắn bao nhiêu nếu có bất kỳ sự khác biệt nào đối với các ước tính về số lượng thẻ.