Làm thế nào để xác định nếu một Index là cần thiết hoặc cần thiết


110

Tôi đã chạy một công cụ lập chỉ mục tự động trên cơ sở dữ liệu MS SQL của chúng tôi (Tôi đã sửa đổi tập lệnh có nguồn gốc từ Microsoft, xem bảng thống kê chỉ mục - Lập chỉ mục tự động tự động ). Từ các số liệu thống kê, bây giờ tôi có một danh sách các đề xuất cho các chỉ mục cần tạo.

Chỉnh sửa: Các Chỉ mục được mô tả ở trên lấy thông tin từ DMV để cho bạn biết công cụ cơ sở dữ liệu sẽ sử dụng gì cho các chỉ mục nếu chúng có sẵn và các tập lệnh lấy các đề xuất Top x (bằng cách tìm kiếm, tác động của người dùng, v.v.) và đặt chúng vào một bảng.

(Chỉnh sửa ở trên một phần được lấy từ câu trả lời của Larry Coleman bên dưới để làm rõ những gì các kịch bản đang làm)

Khi tôi chưa quen với quản trị viên cơ sở dữ liệu và đã có một tìm kiếm nhanh trên mạng, tôi miễn cưỡng thực hiện và bổ sung một cách mù quáng các chỉ mục được đề xuất. Tuy nhiên, không có kinh nghiệm trong lĩnh vực này, tôi đang tìm kiếm một số lời khuyên về cách xác định liệu các khuyến nghị có cần thiết hay không.

Tôi có cần chạy SQL Profiler không, hay tốt hơn là kiểm tra mã truy vấn các bảng? Và bạn có lời khuyên nào khác không?



kiểm tra các chỉ số không sử dụng được Bài viết có thể giúp bạn: sqlshack.com/ từ
Shiwangini Shishulkar

Câu trả lời:


80

Tôi sử dụng tập lệnh phân tích chỉ mục của Jason Strate (Vị trí cũ) . Chúng cho bạn biết bao nhiêu chỉ mục hiện tại của bạn được sử dụng cũng như bao nhiêu chỉ mục bị thiếu sẽ được sử dụng. Tôi thường không thêm chỉ mục trừ khi chúng chiếm hơn 5 hoặc 10% truy vấn trên một bảng.

Mặc dù vậy, quan trọng nhất là về việc đảm bảo ứng dụng đáp ứng đủ nhanh cho người dùng.

Cập nhật: Bài viết blog phân tích chỉ mục của Jason Strate cho các tập lệnh mới hơn (Vị trí mới)

Cập nhật kép: Những ngày này, tôi sử dụng sp_BlitzIndex® khi thực hiện phân tích chỉ mục.


Những thay đổi nào chúng ta cần phân tích tất cả các bảng?
MonsterMMORPG

1
sp_Blitz Index sẽ xem xét tất cả các bảng trên một kích thước nhất định. Bạn sẽ phải xem tài liệu để xem cách điều chỉnh nó.
Jeremiah Peschka

Các thông số để thực hiện sp_Blitz Index có tại đây: brentozar.com/blitzindex
JackArbiter

Bất kỳ cập nhật ba?
Simon_Weaver

49

Có một vài khái niệm và thuật ngữ quan trọng để hiểu khi làm việc với các chỉ mục. Tìm kiếm, quét và tra cứu là một số cách mà các chỉ mục sẽ được sử dụng thông qua các câu lệnh chọn. Tính chọn lọc của các cột chính là không thể thiếu để xác định mức độ hiệu quả của một chỉ mục.

Tìm kiếm xảy ra khi Trình tối ưu hóa truy vấn SQL Server xác định rằng cách tốt nhất để tìm dữ liệu bạn yêu cầu là quét một phạm vi trong một chỉ mục. Tìm kiếm thường xảy ra khi một truy vấn được "bao phủ" bởi một chỉ mục, điều đó có nghĩa là các vị từ tìm kiếm nằm trong khóa chỉ mục và các cột được hiển thị nằm trong khóa hoặc được bao gồm. Quá trình quét xảy ra khi Trình tối ưu hóa truy vấn SQL Server xác định rằng cách tốt nhất để tìm dữ liệu là quét toàn bộ chỉ mục và sau đó lọc kết quả. Việc tra cứu thường xảy ra khi một chỉ mục không bao gồm tất cả các cột được yêu cầu, trong khóa chỉ mục hoặc trong các cột được bao gồm. Sau đó, trình tối ưu hóa truy vấn sẽ sử dụng khóa được phân cụm (đối với chỉ mục được nhóm) hoặc RID (đối với một đống) để "tra cứu" các cột được yêu cầu khác.

Thông thường, các hoạt động tìm kiếm hiệu quả hơn quét, do truy vấn vật lý một tập dữ liệu nhỏ hơn. Có những tình huống không phải là trường hợp này, chẳng hạn như một tập dữ liệu ban đầu rất nhỏ, nhưng nó vượt quá phạm vi câu hỏi của bạn.

Bây giờ, bạn đã hỏi làm thế nào để xác định mức độ hiệu quả của một chỉ số và có một số điều cần lưu ý. Các cột khóa của một chỉ mục được nhóm được gọi là khóa phân cụm. Đây là cách các bản ghi được tạo ra duy nhất trong bối cảnh của một chỉ mục được nhóm. Tất cả các chỉ mục không bao gồm sẽ bao gồm khóa cụm theo mặc định, để thực hiện tra cứu khi cần thiết. Tất cả các chỉ mục sẽ được chèn vào, cập nhật hoặc xóa khỏi cho mọi câu lệnh DML tương ứng. Điều đó đã được nói, tốt nhất là cân bằng hiệu suất tăng trong các câu lệnh được chọn so với các lần truy cập hiệu năng trong các câu lệnh chèn, xóa và cập nhật.

Để xác định mức độ hiệu quả của một chỉ mục, bạn phải xác định tính chọn lọc của các khóa chỉ mục. Độ chọn lọc có thể được định nghĩa là tỷ lệ phần trăm của các bản ghi riêng biệt trên tổng số bản ghi. Nếu tôi có bảng [người] với tổng số 100 bản ghi và cột [First_name] chứa 90 giá trị riêng biệt, chúng tôi có thể nói rằng cột [First_name] được chọn 90%. Độ chọn lọc càng cao, khóa chỉ số càng hiệu quả. Hãy ghi nhớ sự chọn lọc, tốt nhất là đặt các cột chọn lọc nhất của bạn lên đầu trong khóa chỉ mục của bạn. Sử dụng ví dụ [người] trước đây của tôi, điều gì xảy ra nếu chúng ta có cột [last_name] được chọn 95%? Chúng tôi muốn tạo một chỉ mục với [last_name], [first_name] làm khóa chỉ mục.

Tôi biết đây là một câu trả lời hơi dài dòng, nhưng thực sự có rất nhiều điều cần xác định mức độ hiệu quả của một chỉ số, và rất nhiều điều bạn phải cân nhắc với bất kỳ hiệu suất nào đạt được.


1
Tôi chỉ muốn nhấn mạnh vào những gì đã được nói ở trên: Các chỉ mục làm chậm việc chèn / xóa và cập nhật của bạn. Nếu bạn phải nói chèn một lượng lớn dữ liệu hàng loạt, tốt hơn hết là không có chỉ mục (bạn có thể tạo dữ liệu sau, nó sẽ nhanh hơn).
Nicolas de Fontenay

Sẽ là chính xác khi đề cập rằng chỉ mục trên các cột [last_name], [first_name] chỉ có thể được sử dụng nếu truy vấn sẽ lọc trên last_name và first_name? Trong trường hợp nó chỉ lọc trên First_name, chỉ mục không thể được sử dụng, phải không?
Magier

Câu trả lời hay - Tính chọn lọc quan trọng hơn tính chính xác khi quyết định có lập chỉ mục hay không
Kỹ sư đảo ngược

27

Gần đây tôi đã phát hiện ra một kịch bản miễn phí tuyệt vời từ mọi người tại BrentOzar Unltd http://www.brentozar.com/blitzindex/

Điều này thực hiện một số phân tích tốt về chỉ mục nào tồn tại, tần suất sử dụng và tần suất công cụ truy vấn đang tìm kiếm một chỉ mục không tồn tại.

Đó là hướng dẫn nói chung là tốt. Đôi khi nó có một chút gợi ý quá mức. Tôi thường đã làm như sau cho đến nay:

  • Các chỉ mục đã bị xóa KHÔNG BAO GIỜ được đọc (hoặc có thể ít hơn 50 lần một tháng).
  • Đã thêm các chỉ mục rõ ràng nhất trên các khóa và trường nước ngoài mà tôi biết chúng ta sử dụng rất nhiều.

Tôi đã không thêm tất cả các chỉ mục được đề xuất và đã quay lại một tuần sau đó để thấy rằng chúng không còn được đề xuất vì công cụ truy vấn đang sử dụng một số chỉ mục mới khác thay thế!

Nói chung, bạn nên tránh các chỉ mục trên:

  • Các bảng rất nhỏ (dưới 50 đến 200 bản ghi): thường thì công cụ truy vấn sẽ nhanh hơn nếu nó quét bảng thay vì tải lên chỉ mục, đọc, xử lý nó, v.v.
  • Tránh lập chỉ mục trên các cột có Cardinality thấp ( http://en.wikipedia.org/wiki/Cardinality_(Query_statements) ) trên cột được đề cập đầu tiên. Ví dụ: Lập chỉ mục trường giới tính (M / F) rất ít được sử dụng, việc quét bảng và tìm ~ 50% phù hợp là điều thực tế. Nếu nó được liệt kê sau một cái gì đó cụ thể hơn trong chỉ mục (ví dụ: [ngày sinh, giới tính]) thì tốt hơn - bạn có thể muốn tất cả Nam giới sinh ra trong một khoảng thời gian nhất định.

Các chỉ mục được nhóm là tốt - thông thường chúng được dựa trên khóa chính của bạn. Chúng giúp công cụ cơ sở dữ liệu đưa dữ liệu vào đĩa theo thứ tự tốt. Rất cần thiết để hiểu điều này đối với các bảng lớn nhất vì một chỉ mục được nhóm tốt thường làm giảm không gian mà bảng chiếm.

Tôi đã giảm một số bảng từ 900MB xuống 400 MB, chỉ vì chúng là các đống không có cấu trúc trước đó. http://msdn.microsoft.com/en-us/l Library / aa933131 (v = sql.80) .aspx

Sắp xếp lại / Xây dựng lại

Bạn nên tìm kiếm để kiểm tra các chỉ số bị phân mảnh. Một chút phân mảnh là được, đừng bị ám ảnh! http://technet.microsoft.com/en-us/l Library / ms189858.aspx Biết sự khác biệt giữa sắp xếp lại và xây dựng lại!

Xem lại thường xuyên

Các truy vấn thay đổi, khối lượng dữ liệu thay đổi, các tính năng mới được thêm vào, các tính năng cũ bị xóa. Bạn nên xem xét chúng mỗi tháng một lần (hoặc thường xuyên hơn nếu bạn có khối lượng lớn) và tìm kiếm nơi bạn có thể giúp cơ sở dữ liệu!

Bao nhiêu

Trong một video gần đây, Brent khuyến nghị (thường) không có thêm 5 chỉ mục trên một bảng có nhiều chữ viết (ví dụ: bảng đơn hàng) và không quá 10 nếu nó được đọc nhiều hơn so với viết (ví dụ: bảng ghi nhật ký phân tích) http: / /www.youtube.com/watch?v=gOsflkQkHjg

Tổng thể, nói chung

Nó phụ thuộc!

Số dặm của bạn thay đổi theo cơ sở dữ liệu. Che rõ ràng (họ của nhân viên, ngày đặt hàng, v.v.) trên các bảng lớn hơn (hiện tại / tương lai) của bạn. Theo dõi, xem xét và điều chỉnh khi cần thiết. Nó nên là một phần của danh sách kiểm tra thường xuyên của bạn khi quản lý (các) cơ sở dữ liệu của bạn :)

Hi vọng điêu nay co ich!


14

Thông thường người ta đi bằng cách có một khối lượng công việc cụ thể (truy vấn) và kiểm tra cẩn thận tác động của từng chỉ mục mới đến khối lượng công việc. Quá trình lặp này phải luôn luôn bao gồm phân tích cẩn thận về các kế hoạch thực hiện, điều này sẽ tiết lộ những chỉ mục nào được sử dụng. Chủ đề phân tích truy vấn là một câu hỏi dài và bắt đầu với chương MSDN chuyên dụng Phân tích truy vấn là một lựa chọn tốt.

Đôi khi khi khối lượng công việc quá phức tạp hoặc kiến ​​thức về thiết kế cơ sở dữ liệu còn sơ sài, người ta sẽ sử dụng Trình cố vấn điều chỉnh động cơ cơ sở dữ liệu , một số phân tích tự động về khối lượng công việc của bạn và đề xuất một số chỉ số. Tất nhiên, các đề xuất nên được phân tích cẩn thận và tác động cần được đo lường ngay lập tức.

Vì vậy, nếu bạn làm theo ý tưởng của tôi, việc thêm chỉ mục và đo lường tác động thực sự chỉ là trường hợp thử nghiệm A / B : bạn chạy khối lượng công việc của mình với chỉ số là một đường cơ sở, sau đó bạn chạy nó với chỉ mục, đo lường và so sánh với đường cơ sở và sau đó quyết định, dựa trên các số liệu được quan sát và đo lường, nếu tác động có lợi. Khối lượng công việc tốt nhất là một bộ kiểm tra chất lượng tốt, nhưng nó cũng có thể là một phát lại của một khối lượng công việc bị bắt, xem Cách làm: Phát lại một tệp theo dõi .

Một câu trả lời tổng hợp hơn là nhìn vào sys.dm_db_index_usage_statskhung nhìn và xem các chỉ số đang được sử dụng như thế nào, nhưng đó thường là một cách tiếp cận để phân tích tại chỗ trên một khối lượng công việc không xác định (ví dụ: một chuyên gia tư vấn được gọi để giúp đỡ có thể sẽ bắt đầu với điều này).


7

Bắt đầu với SQL 2005, SQL Server có DMV cho bạn biết công cụ cơ sở dữ liệu sẽ sử dụng các chỉ mục nào nếu chúng có sẵn. Các khung nhìn có thể cho bạn biết cột nào sẽ là cột chính, cột nào sẽ được đưa vào và quan trọng nhất là số lần chỉ mục sẽ được sử dụng.

Một cách tiếp cận tốt sẽ là sắp xếp các truy vấn chỉ mục bị thiếu theo số lần tìm kiếm và xem xét thêm các chỉ mục hàng đầu trước.

Xem thêm: tài liệu MS DMV chính thức


-1

Nó phụ thuộc vào cách sử dụng bảng đó. ví dụ: giả sử tôi có một bảng được đọc rất nhiều lần nhưng các bản cập nhật và chèn rất hiếm. Thêm vào đó tôi luôn truy vấn bảng trên một số cột khóa ngoại. Sẽ có ý nghĩa khi tạo chỉ mục (không phân cụm) trên khóa ngoại đó để tăng tốc truy vấn đọc. Nhưng nhược điểm là, chèn, cập nhật của bạn sẽ trở nên chậm.

Có một vài truy vấn thống kê cho biết các truy vấn đang mất bao nhiêu thời gian. Bắt đầu với những cái chậm nhất. Nếu vị từ truy vấn không có chỉ mục, việc tạo một sẽ giú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.