Tại sao SQL Server không làm biểu đồ thống kê cột tổng hợp?


10

SQL Server có một thứ gọi là "thống kê nhiều cột", nhưng đó không phải là điều người ta nghĩ nó có nghĩa.

Chúng ta hãy xem bảng mẫu sau:

CREATE TABLE BadStatistics 
(
    IsArchived BIT NOT NULL,
    Id INT NOT NULL IDENTITY PRIMARY KEY,
    Mystery VARCHAR(200) NOT NULL
);

CREATE NONCLUSTERED INDEX BadIndex 
    ON BadStatistics (IsArchived, Mystery);

Cùng với đó, hai số liệu thống kê đang được tạo trên hai chỉ mục chúng ta có:

Số liệu thống kê cho Bad Index:

+--------------+----------------+-------------------------+
| All density  | Average Length | Columns                 |
+--------------+----------------+-------------------------+
| 0.5          | 1              | IsArchived              |
+--------------+----------------+-------------------------+
| 4.149378E-06 | 37             | IsArchived, Mystery     |
+--------------+----------------+-------------------------+
| 4.149378E-06 | 41             | IsArchived, Mystery, Id |
+--------------+----------------+-------------------------+

+--------------+------------+---------+---------------------+----------------+
| RANGE_HI_KEY | RANGE_ROWS | EQ_ROWS | DISTINCT_RANGE_ROWS | AVG_RANGE_ROWS |
+--------------+------------+---------+---------------------+----------------+
| 0            | 0          | 24398   | 0                   | 1              |
+--------------+------------+---------+---------------------+----------------+
| 1            | 0          | 216602  | 0                   | 1              |
+--------------+------------+---------+---------------------+----------------+

Số liệu thống kê cho chỉ số cụm:

+--------------+----------------+---------+
| All density  | Average Length | Columns |
+--------------+----------------+---------+
| 4.149378E-06 | 4              | Id      |
+--------------+----------------+---------+

+--------------+------------+---------+---------------------+----------------+
| RANGE_HI_KEY | RANGE_ROWS | EQ_ROWS | DISTINCT_RANGE_ROWS | AVG_RANGE_ROWS |
+--------------+------------+---------+---------------------+----------------+
| 1            | 0          | 1       | 0                   | 1              |
+--------------+------------+---------+---------------------+----------------+
| 240999       | 240997     | 1       | 240997              | 1              |
+--------------+------------+---------+---------------------+----------------+
| 241000       | 0          | 1       | 0                   | 1              |
+--------------+------------+---------+---------------------+----------------+

(Tôi đã điền vào bảng với dữ liệu mẫu ngẫu nhiên trong đó khoảng một phần mười hàng không được lưu trữ. Tôi đã chạy cập nhật thống kê quét đầy đủ sau đó.)

Tại sao biểu đồ của số liệu thống kê hai cột chỉ sử dụng một cột? Tôi biết rằng nhiều người đã viết về điều đó nó làm , nhưng lý do là gì? Trong trường hợp này, nó làm cho toàn bộ biểu đồ ít hữu ích hơn nhiều, bởi vì cột đầu tiên chỉ có hai giá trị. Tại sao số liệu thống kê sẽ bị hạn chế tùy tiện như vậy?

Xin lưu ý rằng câu hỏi này không đề cập đến biểu đồ đa chiều, là một con thú hoàn toàn khác. Đó là về biểu đồ một chiều với một chiều là các bộ dữ liệu chứa nhiều cột tương ứng.

Câu trả lời:


8

Lý lịch

Mô hình SQL Server hiện tại chỉ sử dụng biểu đồ cột đơn và thông tin mật độ nhiều cột. Biểu đồ cột đơn được sử dụng để ước tính độ chọn lọc cho các vị từ phù hợp, ví dụ a = 1hoặc b > 50. Một truy vấn có nhiều biến vị ngữ chỉ đơn giản là kết hợp các lựa chọn riêng lẻ (với các giả định) để tạo ra độ chọn lọc tổng thể ước tính.

Để biết ví dụ, hãy xem bài viết Ước tính Cardinality của tôi : Kết hợp Thống kê Mật độ

Mật độ nhiều cột tiếp tục thông báo cho mô hình bằng cách cung cấp thông tin tương quan yếu cho nhiều biến vị ngữ bằng nhau và các nhóm hồng y cho các tập hợp.

Thống kê liên quan đến các chỉ mục là một tiện ích bổ sung cơ hội cho mô hình đó: Công cụ cũng có thể thu thập số liệu thống kê (quét toàn bộ thông thường) trong khi nó đang xây dựng một chỉ mục. SQL Server tự động xây dựng biểu đồ cột và thông tin mật độ hàng đầu cho các khóa khác.

Biểu đồ cho các cột không dẫn đầu trong một chỉ mục có thể được xây dựng theo yêu cầu tự động bởi bộ xử lý truy vấn hoặc trước khi sử dụng sp_createstatsvới @indexonlytùy chọn (trong số các tùy chọn khác).

Biểu đồ nhiều cột

Các giả định được đưa ra khi kết hợp thống kê cột đơn (như trên) có thể hoặc không thể mô hình hóa thực tế của dữ liệu đủ tốt. Trong nhiều trường hợp, các tùy chọn khả dụng (dự phòng theo cấp số nhân, tính độc lập, độ chọn lọc tối thiểu) tạo ra ước tính 'đủ tốt'.

Chúng tôi cũng đã lọc các số liệu thống kê (và các chỉ mục) như là một giải pháp tự nhiên cho các chỉ mục cột hàng đầu có số lượng thẻ thấp như trong ví dụ câu hỏi. Đưa những điều này đến cực kỳ logic dẫn chúng ta đến gần hơn với các số liệu thống kê đa chiều mà câu hỏi không phải là về.

Khi các tùy chọn mô hình có sẵn không thể cung cấp ước tính phù hợp, trong một số trường hợp, biểu đồ thống kê nhiều cột có thể đưa ra ước tính chọn lọc tốt hơn cho các vị từ chỉ số phù hợp, trong một số trường hợp. Có một số khó khăn xung quanh việc kết hợp các loại dữ liệu khác nhau trong các cột khác nhau, nhưng không có gì không thể vượt qua.

Chúng tôi cũng sẽ cần một biểu đồ cho từng cấp của các khóa chỉ mục (để có kết quả tốt nhất); do đó, đối với một chỉ mục trên (a, b, c)đó có nghĩa là biểu đồ trên (a, b)(a, b, c)ngoài biểu đồ cột đơn hiện tại (a)một mình.

Cơ chế được sử dụng để phát hiện số liệu thống kê cũ cũng cần phải được sửa đổi để duy trì biểu đồ nhiều cột bị ảnh hưởng. Các biểu đồ này có thể sẽ được xây dựng lại thường xuyên hơn so với thống kê cột đơn, đơn giản vì sửa đổi nhiều cột hơn ảnh hưởng đến chúng.

Tất cả điều này thêm kích thước, độ phức tạp và chi phí bảo trì.

Thống kê nhiều cột có thể được mô phỏng (trong một phạm vi giới hạn) bằng cách sử dụng một thống kê được tạo trên một cột được tính toán cẩn thận tham chiếu nhiều cột. Truy vấn sẽ cần bao gồm một vị từ trên cột được tính toán (hoặc một kết quả khớp văn bản chính xác cho công thức cơ bản) để tận dụng lợi thế của thống kê đó. Có lẽ chỉ có những tình huống rất hạn chế trong đó phương pháp này là thực tế. Tuy nhiên, nó có một số vấn đề triển khai giống như biểu đồ nhiều cột tự động.

Cuối cùng, những người duy nhất có thể nói chắc chắn lý do tại sao SQL Server không hỗ trợ thống kê nhiều cột sẽ là chính các nhà thiết kế. Nếu bạn cảm thấy bạn có thể tạo ra một trường hợp mạnh mẽ để cải tiến sản phẩm trong lĩnh vực này với khả năng áp dụng rộng rãi, bạn có thể đề xuất nó trên Connect hoặc thông qua kênh hỗ trợ thông thường của bạn.

Chú thích

Trong trường hợp này, nó làm cho toàn bộ biểu đồ ít hữu ích hơn nhiều, bởi vì cột đầu tiên chỉ có hai giá trị

Các biểu đồ vẫn cung cấp thông tin hữu ích về sự phân bố của các giá trị trong cột hàng đầu: Khi số liệu thống kê được xây dựng, đã có 24.398 hàng nơi IsArchivedđã sai , và 216.602 hàng ở đâu là đúng .

Ngoài ra, đối tượng thống kê cho chúng ta biết có (1 / 0,5) = 2 giá trị riêng biệt cho IsArchived, (1 / 4.149378E-06) ~ = 241000 giá trị riêng biệt (IsArchived, Mystery)với kích thước hàng trung bình là 37 byte và có cùng tần số (IsArchived, Mystery, Id)với Thêm 4 byte mỗi hàng.

Đó là tất cả thông tin có mục đích chung tốt, có thể được kết hợp với thông tin thống kê về các cột khác để tạo ước tính chọn lọc trong các truy vấn có nhiều biến vị ngữ (như đã đề cập).

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.