Số liệu thống kê. Là biểu đồ nhiều màu có thể?


12

Tôi đang nghĩ đến một tình huống mà tôi có hai cột với mật độ cao nhưng các cột này không độc lập.

Định nghĩa

Đây là định nghĩa của bảng mà tôi đã tạo cho mục đích thử nghiệm.

CREATE TABLE [dbo].[StatsTest](
    [col1] [int] NOT NULL,  --can take values 1 and 2 only
    [col2] [int] NOT NULL,  --can take integer values from 1 to 4 only
    [col3] [int] NOT NULL,  --integer. it has not relevance just to ensure that each row is different
    [col4]  AS ((10)*[col1]+[col2])  --a computed column ensuring that if two rows have different values in col1 or col2 have different values in col4 
) ON [PRIMARY]

Dữ liệu

Dữ liệu cho thí nghiệm như sau

col1    col2    col3    col4
1       1       1       11
1       2       2       12
1       2       3       12
1       3       4       13
1       3       5       13
1       3       6       13
1       4       7       14
1       4       8       14
1       4       9       14
1       4       10      14
2       1       11      21
2       1       12      21
2       1       13      21
2       1       14      21
2       2       15      22
2       2       16      22
2       2       17      22
2       3       18      23
2       3       19      23
2       4       20      24

Bước 1: Lọc theo col1

SELECT * FROM StatsTest WHERE col1=1

Như mong đợi, Trình tối ưu hóa truy vấn sẽ đoán chính xác số lượng hàng. Số hàng thực tế = 10 và Số lượng hàng ước tính = 10

Bước 2: Lọc theo col2

SELECT * FROM StatsTest WHERE col2=1

Một lần nữa chúng ta có một ước tính hoàn hảo.

Số hàng thực tế = 5 và Số hàng ước tính = 5

Bước 3: Lọc theo col1 và col2

SELECT * FROM StatsTest WHERE col1=1 AND col2=1

Ở đây ước tính không phải là gần với số lượng hàng thực tế. Số hàng thực tế = 1 và Số lượng hàng ước tính = 3,53553

Vấn đề là hàm ẩn của trình phân tích truy vấn giả định rằng col1 và col2 là độc lập nhưng thực tế thì không.

Bước 4: Lọc theo col4

SELECT * FROM StatsTest WHERE col4 = 11

Tôi có thể lọc theo col4 = 11 để có kết quả giống như truy vấn trong Bước 3, vì col4 là cột được tính toán và theo cách nó đã được xác định col1 = 1 và col2 = 1 tương đương với col4 = 11 Tuy nhiên, ở đây , như dự đoán là ước tính là hoàn hảo.

Số hàng thực tế = 1 và Số lượng hàng ước tính = 1

Kết luận / câu hỏi

Solution Đây có phải là giải pháp nhân tạo và không phù hợp là lựa chọn khả dụng duy nhất để đạt được ước tính chính xác khi xử lý lọc bằng hai hoặc nhiều cột không độc lập? Cột được tính toán và bộ lọc bằng cột được tính có cần thiết để đạt được độ chính xác thực tế không?

Ví dụ trong sqlfiddle


Tại sao không xây dựng một số chỉ mục trên col1 / 2?
LowlyDBA

Thực tế tôi đã làm nhưng tôi không bao gồm ở đây vì nó không hoạt động. Đối với biểu đồ, chỉ có cột đầu tiên được xem xét và mật độ chỉ xem xét số lượng giá trị khác nhau chứ không phải phân phối của chúng
JGA

Câu trả lời:


15

Là biểu đồ nhiều màu có thể?

Không đúng biểu đồ đa chiều, không.

Đây có phải là giải pháp nhân tạo và không phù hợp là lựa chọn khả dụng duy nhất để đạt được ước tính chính xác khi xử lý lọc bằng hai hoặc nhiều cột không độc lập?

SQL Server không hỗ trợ thống kê "nhiều cột" , nhưng họ chỉ nắm bắt thông tin mật độ trung bình (tương quan) bên cạnh biểu đồ trên cột được đặt tên đầu tiên. Chúng chỉ hữu ích cho việc so sánh bình đẳng.

Thông tin mật độ trung bình không nắm bắt bất kỳ chi tiết nào, do đó bạn sẽ có cùng độ chọn lọc cho bất kỳ cặp giá trị nào trên đối tượng thống kê hai cột. Trong một số trường hợp, thống kê nhiều cột có thể đủ tốt và tốt hơn không có gì. Thống kê nhiều cột được tự động xây dựng trên các chỉ mục nhiều cột.

Tùy thuộc vào phiên bản SQL Server, bạn cũng có thể sử dụng các chỉ mục được lọcthống kê được lọc :

-- Filtered statistics example
CREATE STATISTICS stats_StatsTest_col2_col1_eq_1
ON dbo.StatsTest (col2)
WHERE col1 = 1;

CREATE STATISTICS stats_StatsTest_col2_col1_eq_2
ON dbo.StatsTest (col2)
WHERE col1 = 2;

Hoặc bạn có thể xây dựng chế độ xem được lập chỉ mục (có thể hỗ trợ các chỉ mục và thống kê của riêng nó). Các khung nhìn được lập chỉ mục là cơ chế đằng sau DATE_CORRELATION_OPTIMIZATIONcài đặt cơ sở dữ liệu , một tính năng ít được sử dụng cho các mối tương quan giữa các bảng, nhưng áp dụng cho tinh thần của câu hỏi.

Là cột được tính toán và bộ lọc của cột được tính toán có thực sự cần thiết để có được độ chính xác thực tế không?

Nó không phải là phương pháp duy nhất. Ngoài những điều đã được đề cập, bạn cũng có thể chỉ định định nghĩa văn bản chính xác của cột được tính toán và trình tối ưu hóa thường sẽ khớp với thống kê trên cột được tính toán.

Ngoài ra còn có các cờ theo dõi thay đổi các giả định được thực hiện về tương quan nhiều cột. Ngoài ra, giả định tương quan mặc định trong SQL Server 2014 (với công cụ ước tính cardinality mới được bật) được thay đổi từ Độc lập sang Backoffential Backoff (chi tiết tại đâytại đây ). Cuối cùng, đây chỉ là một giả định khác. Nó sẽ tốt hơn trong nhiều trường hợp, và tồi tệ hơn trong những trường hợp khác.

Độ chính xác chính xác trong ước lượng cardinality không phải lúc nào cũng cần thiết để có được một kế hoạch thực hiện tốt. Luôn có sự đánh đổi giữa việc tạo ra một kế hoạch có thể được sử dụng lại cho các giá trị tham số khác nhau và một kế hoạch tối ưu cho việc thực hiện cụ thể, nhưng không được sử dụng lạ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.