Khi nào thì tốt hơn để tạo THỐNG KÊ thay vì tạo Chỉ mục?


38

Tôi đã tìm thấy nhiều thông tin về những gì STATISTICS : cách chúng được duy trì, cách chúng có thể được tạo thủ công hoặc tự động từ các truy vấn hoặc chỉ mục, v.v. Nhưng, tôi không thể tìm thấy bất kỳ hướng dẫn hoặc thông tin "thực tiễn tốt nhất" nào về thời điểmđể tạo chúng: những tình huống nào có lợi nhiều hơn từ một đối tượng THỐNG KÊ được tạo thủ công hơn là từ một Chỉ mục. Tôi đã thấy các số liệu thống kê được lọc được tạo thủ công giúp truy vấn trên các bảng được phân đoạn (vì số liệu thống kê được tạo cho các chỉ mục bao trùm toàn bộ bảng và không phải trên mỗi phân vùng - brillaint!), Nhưng chắc chắn phải có các kịch bản khác có lợi từ một đối tượng thống kê trong khi không cần chi tiết của một chỉ mục, cũng không đáng giá cho việc duy trì chỉ mục hoặc tăng cơ hội chặn / khóa chết.

@JonathanFite, trong một bình luận, đã đề cập đến sự khác biệt giữa các chỉ mục và thống kê:

Các chỉ mục sẽ giúp SQL tìm dữ liệu nhanh hơn bằng cách tạo các tra cứu được sắp xếp khác với chính bảng. Thống kê giúp SQL xác định lượng bộ nhớ / nỗ lực sẽ được yêu cầu để đáp ứng truy vấn.

Đó là thông tin tuyệt vời, chủ yếu là vì nó giúp tôi làm rõ câu hỏi của mình:

Làm thế nào để biết điều này (hoặc bất kỳ thông tin kỹ thuật khác trên những gì s và cách s liên quan đến hành vi và bản chất của STATISTICS) giúp xác định khi lựa chọn CREATE STATISTICShơn CREATE INDEX, đặc biệt là khi tạo một Index sẽ tạo ra liên quan STATISTICSđối tượng? Kịch bản nào sẽ được phục vụ tốt hơn khi chỉ có thông tin THỐNG KÊ và không có Chỉ mục?

Sẽ là siêu lừa đảo hữu ích, nếu có thể, để có một ví dụ hoạt động của một kịch bản trong đó STATISTICSđối tượng phù hợp hơn so với INDEX.


Vì tôi là người học / suy nghĩ trực quan, tôi nghĩ rằng có thể giúp thấy được sự khác biệt giữa STATISTICSINDEXes, cạnh nhau, như một phương tiện có thể giúp xác định khi nào STATISTICSlà lựa chọn tốt hơn.

Thingy           PROs                             CONs
-------          ----------                       -------------------
INDEX            * Can help sorts.                * Takes up space.
                 * Contains data (can             * Needs to be maintained (extra I/O).
                   "cover" a query).              * More chances for blocking / dead-locks.

STATISTICS       * Takes up very little space.    * Cannot help sorts.
                 * Lighter maintenance / won't    * Cannot "cover" queries.
                   slow down DML operations.
                 * Does not increase chances
                   of blocking / dead-locks.

Sau đây là một số tài nguyên mà tôi tìm thấy trong khi tìm kiếm cái này, một tài nguyên thậm chí hỏi cùng câu hỏi này, nhưng nó không được trả lời:

Chỉ số máy chủ SQL so với thống kê

Câu hỏi thống kê về máy chủ SQL Chúng tôi quá ngại hỏi

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

** Để rõ ràng, tôi không có câu trả lời cho điều này và thực sự đang tìm cách nhận phản hồi từ hy vọng một số người cung cấp những thông tin dường như bị thiếu một cách kỳ lạ ở đây trong các interwebs.


1
Các chỉ mục sẽ giúp SQL tìm dữ liệu nhanh hơn bằng cách tạo các tra cứu được sắp xếp khác với chính bảng. Thống kê giúp SQL xác định số lượng bộ nhớ / nỗ lực sẽ được yêu cầu để đáp ứng truy vấn.
Jonathan Fite

@JonathanFite Cảm ơn bạn đã nhận xét đó. Tôi đã kết hợp nó vào câu hỏi của tôi :).
Solomon Rutzky

Theo nhận xét của @ JonathanFite, có vẻ như Thống kê là tốt nhất để tăng hiệu suất trên các hệ thống / bảng / mẫu truy vấn ad hoc trong khi Chỉ mục tốt hơn cho các mẫu truy vấn có thể dự đoán được. Tôi muốn nói điều này giống như một câu hỏi hơn là một tuyên bố.
Dave

Câu trả lời:


19

Câu hỏi của bạn xoay quanh - Khi nào nên tạo số liệu thống kê so với tạo chỉ mục (tạo chỉ số).

Từ ghi chú bên trong máy chủ sql của tôi (lớp SQLSkills- IE1 và IE2) và cuốn sách nội bộ của SQL Server , dưới đây là sự hiểu biết hạn chế của tôi :

Thống kê SQL Server không có gì ngoài các đối tượng hệ thống chứa thông tin quan trọng về các giá trị khóa chỉ mục và giá trị cột thông thường.

SQL Server sử dụng mô hình dựa trên chi phí để chọn kế hoạch thực hiện "đủ tốt" nhanh nhất có thể. Ước tính cardanility (ước tính số hàng được xử lý trên mỗi bước thực hiện truy vấn) là yếu tố quan trọng nhất trong tối ưu hóa truy vấn, điều này ảnh hưởng đến chiến lược tham gia, yêu cầu cấp bộ nhớ, lựa chọn luồng công nhân cũng như lựa chọn chỉ mục khi truy cập dữ liệu .

SQL Server sẽ không sử dụng các chỉ mục không bao gồm khi ước tính rằng không có lớn. các hoạt động lặp lại KEY hoặc RID sẽ được yêu cầu, do đó, nó duy trì số liệu thống kê về các chỉ mục (và trên các cột) sẽ giúp ích cho các ước tính đó.

Có 2 điều quan trọng về số liệu thống kê:

  1. Biểu đồ lưu trữ thông tin về phân phối dữ liệu cho cột CHỈ thống kê (chỉ mục) ngoài cùng bên trái. Nó cũng lưu trữ thông tin về mật độ nhiều cột của các giá trị chính. Vì vậy, về cơ bản, biểu đồ chỉ lưu trữ phân phối dữ liệu cho cột thống kê ngoài cùng bên trái.

  2. SQL Server sẽ giữ lại tối đa 200 bước trong biểu đồ không phân biệt kích thước bảng. Các khoảng được bao phủ bởi mỗi bước biểu đồ tăng lên khi bảng tăng lên dẫn đến thống kê "kém chính xác" hơn cho các bảng lớn.

    Hãy nhớ rằng độ chọn lọc của chỉ số là một số liệu tỷ lệ nghịch với mật độ, nghĩa là cột càng có nhiều giá trị duy nhất thì độ chọn lọc của nó càng cao.

Khi các truy vấn cụ thể không chạy thường xuyên, bạn có thể chọn để tạo số liệu thống kê cấp cột thay vì chỉ mục. Thống kê cấp cột giúp Trình tối ưu hóa truy vấn tìm các kế hoạch thực hiện tốt hơn, mặc dù các kế hoạch thực hiện đó là tối ưu do quét chỉ mục có liên quan. Đồng thời, số liệu thống kê không thêm chi phí trong các hoạt động sửa đổi dữ liệu và chúng giúp tránh bảo trì chỉ mục. Cách tiếp cận này chỉ hoạt động cho các truy vấn hiếm khi được thực hiện.

Tham khảo :

Lưu ý: Một số người như Paul White hoặc Aaron Bertrand có thể hô vang để cung cấp thêm màu sắc cho câu hỏi hay của bạn .


"Máy chủ SQL sẽ không sử dụng các chỉ mục không bao gồm khi ước tính rằng sẽ cần một số lượng lớn các hoạt động lặp lại KEY hoặc RID" Vì vậy, QO có thể sử dụng đối tượng thống kê dựa trên một chỉ mục độc lập với chỉ mục không? Có nghĩa là, nếu chỉ mục không tối ưu, nhưng cột hàng đầu nằm trong truy vấn, thì các số liệu thống kê vẫn có liên quan. Vì vậy, họ sẽ được sử dụng? Hoặc thông tin này ngụ ý rằng có thể có trường hợp khi chỉ mục có thể sẽ không được sử dụng, nhưng vì các số liệu thống kê vẫn có giá trị, nên không có lý do thực sự để tạo chỉ mục, chỉ cần làm số liệu thống kê?
Solomon Rutzky

8

Tôi muốn nói rằng bạn cần một chỉ mục khi bạn cần có thể giới hạn số lượng dữ liệu / nhận được dữ liệu chính xác một cách nhanh chóng dựa trên (các) trường.

Bạn cần số liệu thống kê khi bạn cần trình tối ưu hóa để hiểu bản chất của dữ liệu để có thể thực hiện các hoạt động theo cách tốt nhất có thể.

Những gì tôi đã tìm ra, các số liệu thống kê được lọc giúp ích khi bạn có dữ liệu sai lệch ảnh hưởng đến kế hoạch, ví dụ như trong ngăn xếp tràn, một số người dùng có số lượng bài đăng rất lớn, vì vậy chỉ sử dụng các bài đăng trung bình trên mỗi người dùng không thực sự là ước tính tốt nhất. Vì vậy, bạn có thể tạo số liệu thống kê được lọc trên userId dựa trên tên người dùng và sau đó SQL Server sẽ biết rằng khi tên người dùng này nằm trong truy vấn, đây là id người dùng sẽ nhận được và có thể tìm ra rằng trường được lập chỉ mục trong bảng bài viết sẽ có một lượng lớn hàng với id đó vì biểu đồ tồn tại ở đó. Với mức trung bình, không thể làm điều đó.


1
Xin chào, và cảm ơn vì đã trả lời. Vì vậy, khi nào tôi cần / muốn trình tối ưu hóa hiểu rõ hơn về bản chất của dữ liệu và không giới hạn dữ liệu đó hoặc muốn truy cập nhanh hơn hoặc cần nó để "che" truy vấn? Tương tự cho ví dụ chỉ mục được lọc của bạn. Tôi hiểu những gì bạn đang nói về việc phá vỡ các trường hợp cạnh từ mức trung bình, nhưng tại sao các số liệu thống kê được lọc sẽ tốt hơn một chỉ mục được lọc trên cùng các trường? Đây là sự khác biệt tôi đang cố gắng để có được.
Solomon Rutzky

Giống như trong ví dụ, bạn không thể tạo một chỉ mục được lọc trên tên người dùng vào bảng bài viết vì nó không tồn tại ở đó. Bạn có thể tạo nó dựa trên id người dùng, nhưng điều đó không có trong mệnh đề where.
James Z

Nhưng sẽ không UserIDở trong điều kiện THAM GIA, ngay cả khi không ở trong WHERE? Và điều đó có đủ tốt để chọn Chỉ số được lọc không?
Solomon Rutzky

@srutzky Có thể nhiều khả năng trong các phiên bản mới nhất, nhưng nói chung tôi sẽ không dựa vào điều đó ... trong hầu hết các trường hợp, các vị từ phải khớp chính xác. Tôi quên nếu họ đã sửa lỗi này nhưng tại một thời điểm, một chỉ mục được lọc WHERE BitColumn = 0sẽ không được chọn cho một truy vấn đơn giản WHERE BitColumn <> 1. (Và rõ ràng, cột bit không thể rỗng.) Tôi nghĩ có những trường hợp tương tự như IntColumn > 10không khớp IntColumn >= 11.
Aaron Bertrand

Các chỉ mục được lọc không thể được sử dụng nếu có khả năng lần sau ai đó sử dụng các kế hoạch, chỉ mục được lọc không còn phù hợp nữa. Tôi không thể nghĩ rằng bất kỳ tham gia nào có thể sử dụng một chỉ mục được lọc. Ngay cả các biến cũng không thể được sử dụng vì lần sau giá trị có thể là thứ không phù hợp.
James Z

4

Từ 70-461 Cuốn sách đào tạo của Itzik Ben-Gan

Chỉ có một vài lý do có thể để tạo số liệu thống kê bằng tay. Một ví dụ là khi một vị từ truy vấn chứa nhiều cột có mối quan hệ giữa các cột; thống kê trên nhiều cột có thể giúp cải thiện kế hoạch truy vấn. Thống kê trên nhiều cột chứa mật độ cột chéo không có sẵn trong thống kê cột đơn. Tuy nhiên, nếu các cột đã có trong cùng một chỉ mục, thì đối tượng thống kê nhiều màu đã tồn tại, do đó bạn không nên tạo thêm một cột theo cách thủ công.


Cảm ơn đã đăng bài này. Câu trả lời này là một phần câu hỏi của tôi nhưng vẫn để ngỏ câu hỏi: Nếu tôi cần số liệu thống kê nhiều cột, tại sao tôi chỉ tạo THỐNG KÊ thay vì Chỉ mục, bao gồm THỐNG KÊ cộng với thông tin bổ sung có thể giúp truy vấn thêm ( ies)?
Solomon Rutzky

1
Tôi nghĩ rằng lời giải thích của Kin sẽ giải thích thêm về những gì bạn đang theo đuổi. Có lẽ một đống thường xuyên được chèn, nhưng hiếm khi truy vấn?
Kentaro
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.