Tương tác điều chỉnh hiệu suất có thể mất nhiều lượt khi bạn thực hiện nó - tất cả phụ thuộc vào những gì đang hiển thị như là vấn đề và những gì dữ liệu cho bạn biết. Một số ngày, nó xuất hiện trên một truy vấn cụ thể hoặc một tập hợp các truy vấn, có thể được cải thiện với các chỉ mục - những chỉ mục mới hoặc sửa đổi đối với các chỉ mục hiện có. Một trong những phần điều chỉnh yêu thích của tôi là làm việc với các chỉ mục và khi tôi đang suy nghĩ về bài đăng này, tôi đã muốn gắn nhãn điều chỉnh chỉ mục là một nhiệm vụ “dễ dàng hơn”… nhưng thực sự không phải vậy.
Tôi nghĩ về việc điều chỉnh chỉ mục như một nghệ thuật và một khoa học. Bạn phải thử và suy nghĩ như trình tối ưu hóa, và bạn phải hiểu lược đồ bảng và truy vấn (hoặc các truy vấn) mà bạn đang cố gắng điều chỉnh. Cả hai đều hướng đến dữ liệu và do đó thuộc phạm trù khoa học. Thành phần nghệ thuật phát huy tác dụng khi bạn nghĩ về khác chỉ mục trên bảng và tất cả cái khác các truy vấn liên quan đến bảng có thể bị ảnh hưởng bởi các thay đổi chỉ mục.
Bước 1:Xác định truy vấn và xem xét kế hoạch
Khi tôi xác định một truy vấn có thể được hưởng lợi từ một chỉ mục, tôi ngay lập tức nhận được kế hoạch của nó. Tôi thường nhận được Kế hoạch thực thi từ bộ nhớ cache kế hoạch hoặc Cửa hàng truy vấn, sau đó sử dụng SSMS để nhận Kế hoạch thực thi cộng với Thống kê thời gian chạy (hay còn gọi là Kế hoạch thực thi thực tế). Nhiều khi, hình dạng của hai kế hoạch đó giống nhau; nhưng đó không phải là một sự đảm bảo, đó là lý do tại sao tôi muốn thấy cả hai.
Kế hoạch có thể có đề xuất chỉ mục bị thiếu, kế hoạch có thể có quét chỉ mục theo nhóm (hoặc quét theo nhóm nếu không có chỉ mục được phân nhóm), kế hoạch có thể sử dụng chỉ mục không phân nhóm nhưng sau đó phải tra cứu để truy xuất các cột bổ sung. Việc khắc phục từng vấn đề đó nghe có vẻ khá dễ dàng. Chỉ cần thêm chỉ số còn thiếu, phải không? Nếu có một bản quét chỉ mục theo nhóm hoặc đống, hãy tạo chỉ mục mà tôi cần cho truy vấn và được thực hiện? Hoặc nếu có một chỉ mục đang được sử dụng nhưng nó chuyển đến bảng để lấy các cột bổ sung, chỉ cần thêm các cột vào chỉ mục đó?
Nó thường không dễ dàng như vậy và ngay cả khi nó xảy ra, tôi vẫn thực hiện quy trình mà tôi đang phác thảo ở đây.
Bước 2:Xác định (các) bảng cần xem lại
Bây giờ tôi có truy vấn của mình, tôi phải tìm ra bảng nào không được lập chỉ mục đúng cách. Ngoài việc xem xét kế hoạch, tôi cũng bật thống kê IO và TIME trong SSMS. Đây có lẽ là trường hợp cũ của tôi, vì các kế hoạch thực thi ngày càng chứa nhiều thông tin - bao gồm thời lượng và số IO cho mỗi toán tử - với mỗi bản phát hành, nhưng tôi thích thống kê IO vì tôi có thể nhanh chóng xem các lần đọc cho mỗi bảng. Đối với các truy vấn phức tạp với nhiều phép nối, hoặc truy vấn phụ, hoặc CTE, hoặc các chế độ xem lồng nhau, việc hiểu IO và / hoặc thời gian được sử dụng ở đâu trong truy vấn sẽ thúc đẩy tôi dành thời gian của mình. Bất cứ khi nào có thể từ thời điểm này, tôi thực hiện truy vấn phức tạp và lớn hơn và chuyển nó xuống phần đang gây ra vấn đề lớn nhất.
Ví dụ:nếu có một truy vấn kết hợp tới 10 bảng và có hai truy vấn phụ, kế hoạch (cùng với thông tin IO và thời lượng) sẽ giúp tôi xác định vị trí tồn tại của vấn đề. Sau đó, tôi sẽ lấy ra phần đó của truy vấn - bảng có vấn đề và có thể một vài phần khác mà nó tham gia - và tập trung vào đó. Đôi khi đó chỉ là truy vấn phụ, vì vậy tôi bắt đầu ở đó.
Bước 3:Xem xét các chỉ mục hiện có
Với truy vấn (hoặc một phần của truy vấn) được xác định, sau đó tôi tập trung vào các chỉ mục hiện có cho các bảng có liên quan. Đối với bước này, tôi dựa vào phiên bản sp_helpindex của Kimberly. Tôi thích phiên bản của cô ấy hơn sp_helpindex tiêu chuẩn vì nó cũng liệt kê BAO GỒM các cột và định nghĩa bộ lọc (nếu tồn tại). Tùy thuộc vào số lượng chỉ mục hiển thị cho một bảng, tôi thường sẽ sao chép cái này và dán nó vào Excel, sau đó sắp xếp thứ tự dựa trên khóa chỉ mục và sau đó là các cột được bao gồm. Điều này cho phép tôi nhanh chóng tìm thấy bất kỳ phần dư thừa nào.
Dựa trên kết quả ví dụ ở trên, có bảy chỉ mục bắt đầu bằng CompanyID, năm chỉ mục bắt đầu bằng AcctNumber và một số chỉ số dư thừa tiềm năng khác. Mặc dù có vẻ lý tưởng khi chỉ có một chỉ mục dẫn đến một cột cụ thể (ví dụ:CompanyID), đối với một số mẫu truy vấn là không đủ.
Khi tôi xem xét các chỉ mục hiện có, rất dễ dàng đi xuống một lỗ hổng. Tôi nhìn vào kết quả ở trên và ngay lập tức bắt đầu hỏi tại sao có bảy chỉ mục bắt đầu bằng CompanyID và tôi muốn biết ai đã tạo ra chúng, tại sao và cho truy vấn nào. Nhưng… nếu truy vấn có vấn đề của tôi không sử dụng CompanyID, tôi có nên quan tâm không? Có… vì nói chung tôi luôn ở đó để cải thiện hiệu suất và nếu điều đó có nghĩa là xem xét các chỉ mục khác trên bảng trong suốt quá trình, thì hãy cứ như vậy. Nhưng đây là lúc bạn rất dễ đánh mất thời gian (và mục đích thực sự).
Nếu truy vấn có vấn đề của tôi cần một chỉ mục dẫn trên PaidDate, tôi chỉ phải xử lý một chỉ mục hiện có. Nếu truy vấn có vấn đề của tôi cần một chỉ mục dẫn trên AcctNumber, nó sẽ trở nên phức tạp. Khi các chỉ mục hiện có bao hàm một truy vấn và tôi đang tìm cách mở rộng một chỉ mục (thêm nhiều cột hơn) hoặc hợp nhất (hợp nhất hai hoặc có thể ba chỉ mục thành một), thì tôi phải tìm hiểu kỹ.
Bước 4:Thống kê sử dụng chỉ mục
Tôi thấy rằng nhiều người không nắm bắt được số liệu thống kê sử dụng chỉ mục một cách liên tục. Điều này thật đáng tiếc, vì tôi thấy dữ liệu hữu ích khi quyết định giữ chỉ mục nào và loại bỏ hoặc hợp nhất. Trong trường hợp tôi không có số liệu thống kê sử dụng trước đây, ít nhất tôi cũng nên kiểm tra xem việc sử dụng hiện như thế nào (kể từ lần khởi động lại dịch vụ cuối cùng):
SELECT DB_NAME(ius.database_id), OBJECT_NAME(i.object_id) [TableName], i.name [IndexName], ius.database_id, i.object_id, i.index_id, ius.user_seeks, ius.user_scans, ius.user_lookups, ius.user_updates FROM sys.indexes i INNER JOIN sys.dm_db_index_usage_stats ius ON ius.index_id = i.index_id AND ius.object_id = i.object_id WHERE ius.database_id = DB_ID(N'Sales2020') AND i.object_id = OBJECT_ID('dbo.tblSales');
Một lần nữa, tôi muốn đưa điều này vào Excel, sắp xếp theo lượt tìm kiếm và sau đó quét và cũng ghi chú các bản cập nhật. Đối với ví dụ này, các chỉ mục có màu đỏ là những chỉ mục không có tìm kiếm, quét hoặc tra cứu… chỉ cập nhật. Đó là những ứng cử viên bị vô hiệu hóa và có khả năng bị loại bỏ, nếu chúng thực sự không được sử dụng (một lần nữa, có lịch sử sử dụng sẽ giúp ích ở đây). Các chỉ mục màu xanh lá cây chắc chắn đang được sử dụng, tôi muốn giữ lại các chỉ mục đó (mặc dù có lẽ trong một số trường hợp, chúng có thể được điều chỉnh). Những cái màu vàng ... một số loại đang được sử dụng, một số loại gần như không được sử dụng. Một lần nữa, lịch sử sẽ hữu ích ở đây, hoặc bối cảnh từ những người khác - đôi khi một chỉ mục có thể rất quan trọng đối với một báo cáo hoặc quy trình không chạy mọi lúc.
Nếu tôi chỉ đang tìm cách sửa đổi hoặc thêm một chỉ mục mới, thay vì dọn dẹp và hợp nhất thực sự, thì tôi chủ yếu quan tâm đến bất kỳ chỉ mục nào tương tự với những gì tôi muốn thêm hoặc thay đổi. Tuy nhiên, tôi sẽ đảm bảo chỉ ra thông tin sử dụng cho khách hàng và nếu thời gian cho phép, hãy hỗ trợ với chiến lược lập chỉ mục tổng thể cho bảng.
Tiếp theo là gì?
Chúng tôi chưa làm xong! Đây là phần 1 trong cách tiếp cận điều chỉnh chỉ mục của tôi và phần tiếp theo của tôi sẽ liệt kê các bước còn lại của tôi. Trong thời gian chờ đợi, nếu bạn không nắm bắt được số liệu thống kê sử dụng chỉ mục, thì đó là điều bạn có thể đưa ra bằng cách sử dụng truy vấn ở trên hoặc một biến thể khác. Tôi khuyên bạn nên nắm bắt số liệu thống kê sử dụng cho tất cả cơ sở dữ liệu người dùng, không chỉ một bảng và cơ sở dữ liệu cụ thể như tôi đã làm ở trên, vì vậy hãy sửa đổi vị từ nếu cần. Và cuối cùng, là một phần của công việc đã lên lịch để chụp nhanh thông tin đó vào một bảng, đừng quên một bước khác để dọn dẹp bảng sau khi dữ liệu đã ở đó một thời gian (tôi giữ nó ít nhất sáu tháng; một số người có thể nói năm là cần thiết).