Hãy xem xét kế hoạch thực hiện và truy vấn AdventureWorks đơn giản dưới đây. Truy vấn chứa các vị từ được kết nối với AND
. Ước tính cardinality của trình tối ưu hóa là 41.211 hàng:
-- Estimate 41,211 rows
SELECT COUNT_BIG(*)
FROM Production.TransactionHistory AS TH
WHERE
TH.TransactionID BETWEEN 100000 AND 168336
AND TH.TransactionDate BETWEEN '2007-09-01' AND '2008-03-13';
Sử dụng số liệu thống kê mặc định
Chỉ đưa ra các thống kê cột đơn, trình tối ưu hóa tạo ra ước tính này bằng cách ước tính số lượng thẻ cho từng vị từ một cách riêng biệt và nhân các kết quả chọn lọc với nhau. Heuristic này giả định rằng các vị ngữ hoàn toàn độc lập.
Chia truy vấn thành hai phần để tính toán dễ nhìn hơn:
-- Estimate 68,336.4 rows
SELECT COUNT_BIG(*)
FROM Production.TransactionHistory AS TH
WHERE
TH.TransactionID BETWEEN 100000 AND 168336;
Bảng Lịch sử giao dịch có tổng cộng 113.443 hàng, vì vậy ước tính 68.336,4 thể hiện độ chọn lọc là 68336.4 / 113443 = 0.60238533 cho vị từ này. Ước tính này có được bằng cách sử dụng thông tin biểu đồ cho TransactionID
cột và các giá trị không đổi được chỉ định trong truy vấn.
-- Estimate 68,413 rows
SELECT COUNT_BIG(*)
FROM Production.TransactionHistory AS TH
WHERE
TH.TransactionDate BETWEEN '2007-09-01' AND '2008-03-13';
Vị ngữ này có độ chọn lọc ước tính là 68413.0 / 113443 = 0.60306056 . Một lần nữa, nó được tính từ các giá trị không đổi của vị từ và biểu đồ củaTransactionDate
đối tượng thống kê.
Giả sử các vị từ hoàn toàn độc lập, chúng ta có thể ước tính độ chọn lọc của hai vị từ với nhau bằng cách nhân chúng với nhau. Ước tính cardinality cuối cùng thu được bằng cách nhân độ chọn lọc kết quả với 113.443 hàng trong bảng cơ sở:
0.60238533 * 0.60306056 * 113443 = 41210.987
Sau khi làm tròn, đây là ước tính 41.211 được thấy trong truy vấn ban đầu (trình tối ưu hóa cũng sử dụng toán học dấu phẩy động trong nội bộ).
Không phải là một ước tính tuyệt vời
Các cột TransactionID
và TransactionDate
cột có mối tương quan chặt chẽ trong tập dữ liệu AdventureWorks (vì các phím tăng đơn điệu và cột ngày thường làm). Mối tương quan này có nghĩa là giả định độc lập bị vi phạm. Kết quả là, kế hoạch truy vấn sau khi thực hiện hiển thị 68.095 hàng thay vì ước tính 41.211:
Cờ dấu vết 4137
Kích hoạt cờ theo dõi này thay đổi các heuristic được sử dụng để kết hợp các vị từ. Thay vì giả định sự độc lập hoàn toàn, trình tối ưu hóa xem xét rằng độ chọn lọc của hai vị từ đủ gần để chúng có khả năng tương quan với nhau:
-- Estimate 68,336.4
SELECT COUNT_BIG(*)
FROM Production.TransactionHistory AS TH
WHERE
TH.TransactionID BETWEEN 100000 AND 168336
AND TH.TransactionDate BETWEEN '2007-09-01' AND '2008-03-13'
OPTION (QUERYTRACEON 4137);
Hãy nhớ lại rằng TransactionID
vị ngữ một mình ước tính 68.336,4 hàng và TransactionDate
riêng vị ngữ ước tính 68.413 hàng. Trình tối ưu hóa đã chọn mức thấp hơn của hai ước tính này thay vì nhân các mức chọn lọc.
Tất nhiên, đây chỉ là một heuristic khác, nhưng một thứ có thể giúp cải thiện các ước tính cho các truy vấn với các AND
vị từ tương quan . Mỗi vị từ được xem xét cho mối tương quan có thể có, và có những điều chỉnh khác được thực hiện khi có nhiều AND
điều khoản liên quan, nhưng ví dụ đó phục vụ để hiển thị những điều cơ bản của nó.
Thống kê nhiều cột
Chúng có thể giúp trong các truy vấn có tương quan, nhưng thông tin biểu đồ vẫn chỉ dựa trên cột hàng đầu của thống kê. Do đó, thống kê nhiều cột của ứng viên sau đây khác nhau theo một cách quan trọng:
CREATE STATISTICS
[stats Production.TransactionHistory TransactionID TransactionDate]
ON Production.TransactionHistory
(TransactionID, TransactionDate);
CREATE STATISTICS
[stats Production.TransactionHistory TransactionDate TransactionID]
ON Production.TransactionHistory
(TransactionDate, TransactionID);
Chỉ lấy một trong số đó, chúng ta có thể thấy rằng thông tin bổ sung duy nhất là các mức bổ sung của mật độ 'tất cả'. Biểu đồ vẫn chỉ chứa thông tin chi tiết về TransactionDate
cột.
DBCC SHOW_STATISTICS
(
'Production.TransactionHistory',
'stats Production.TransactionHistory TransactionDate TransactionID'
);
Với các số liệu thống kê nhiều cột tại chỗ ...
SELECT COUNT_BIG(*)
FROM Production.TransactionHistory AS TH
WHERE
TH.TransactionID BETWEEN 100000 AND 168336
AND TH.TransactionDate BETWEEN '2007-09-01' AND '2008-03-13';
... kế hoạch thực hiện cho thấy một ước tính hoàn toàn giống như khi chỉ có số liệu thống kê cột đơn:
Statistics objects on multiple columns also store statistical information about the correlation of values among the columns