Chuyển đổi loại trong biểu thức có thể ảnh hưởng đến Thẻ CardinalityEstimate Nhận trong lựa chọn gói truy vấn?


10

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?


2
Các COLLATE Latin1_General_BIN2biểu thức trên không thể mở checks.namerộ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ẻ.
Martin Smith

2
Giả sử các nhị phân COLLATEchỉ 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
Martin Smith

Câu trả lời:


16

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?

Cảnh báo là thông tin. Nếu truy vấn của bạn thực hiện chậm hoặc bạn nhận thấy rằng ước tính cardinality không chính xác, cảnh báo sẽ cung cấp cho bạn thông tin về nơi cần tìm nguyên nhân có thể.

Cảnh báo được kích hoạt bởi chuyển đổi ngầm định được sử dụng cho thay đổi đối chiếu. Nếu sử dụng đối chiếu là cách dễ nhất để có kết quả chính xác, vui lòng để nguyên như vậy. Ngoài ra, nếu bạn giải thích thêm về lý do cần thiết, sẽ có người tư vấn cho bạn.

Như một bên, REPLACEcó thể được thay thế bằng:

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

(Câu trả lời này là một bản tóm tắt các ý kiến ​​cho câu hỏi.)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.