Lập chỉ mục từ đầu hoặc khi vấn đề hiệu suất phát sinh?


15

Câu hỏi của tôi liên quan đến việc sử dụng các chỉ mục.

  1. Tôi nên bắt đầu lập chỉ mục ngay từ đầu hoặc khi vấn đề về hiệu suất phát sinh?

  2. Chúng tôi cũng có thể tạo chỉ mục tạm thời trong khi thực hiện một truy vấn. Những ưu và nhược điểm của các kỹ thuật như vậy là gì?

Câu trả lời:


17

Tôi nên bắt đầu lập chỉ mục ngay từ đầu hoặc khi vấn đề về hiệu suất phát sinh?

Chiến lược lập chỉ mục có xu hướng phát triển khi các mô hình sử dụng xuất hiện. Điều đó nói rằng, cũng có các chiến lược và hướng dẫn thiết kế có thể được áp dụng lên phía trước.

  • Chọn một khóa cụm tốt . Bạn thường có thể xác định chỉ mục được nhóm thích hợp tại thời điểm thiết kế, dựa trên mẫu chèn dự kiến ​​vào bảng. Nếu một trường hợp hấp dẫn nổi lên cho một sự thay đổi trong tương lai, vì vậy hãy là nó.

  • Tạo các ràng buộc chính và duy nhất khác của bạn . Chúng sẽ được thực thi bởi các chỉ mục duy nhất.

  • Tạo khóa ngoại của bạn và các chỉ mục không được liên kết . Khóa ngoại là các cột tham gia được tham chiếu thường xuyên nhất của bạn, vì vậy hãy lập chỉ mục chúng từ đầu.

  • Tạo các chỉ mục cho bất kỳ truy vấn rõ ràng có tính chọn lọc cao . Đối với các mẫu truy vấn bạn đã biết sẽ có tính chọn lọc cao và có khả năng sử dụng tra cứu thay vì quét.

Ngoài những điều trên, hãy thực hiện một cách tiếp cận dần dần và toàn diện để thực hiện các chỉ mục mới. Theo tổng thể, tôi có nghĩa là đánh giá lợi ích và tác động tiềm năng đối với tất cả các truy vấn và chỉ mục hiện có khi đánh giá một bổ sung.

Một vấn đề không phổ biến trong các vòng tròn SQL Server là quá mức, do kết quả của hướng dẫn từ các gợi ý DMV và chỉ số SSMS bị thiếu. Cả hai công cụ này đều không đánh giá các chỉ mục hiện có và sẽ vui lòng đề nghị bạn tạo một chỉ mục 6 cột mới thay vì thêm một cột vào chỉ mục 5 cột hiện có.

-- If you have this
CREATE NONCLUSTERED INDEX [IX_MyTable_MyIndex] ON [dbo].[MyTable] 
(
    [col1] ASC
    , [col2] ASC
    , [col3] ASC
    , [col4] ASC
    , [col5] ASC
)

-- But your query would benefit from the addition of a column
CREATE NONCLUSTERED INDEX [IX_MyTable_MyIndex] ON [dbo].[MyTable] 
(
    [col1] ASC
    , [col2] ASC
    , [col3] ASC
    , [col4] ASC
    , [col5] ASC
    , [col6] ASC
)

-- SSMS will suggest you create this instead
CREATE NONCLUSTERED INDEX [IX_MyTable_AnotherIndexWithTheSameColumnsAsTheExistingIndexPlusCol6] ON [dbo].[MyTable] 
(
    [col1] ASC
    , [col2] ASC
    , [col3] ASC
    , [col4] ASC
    , [col5] ASC
    , [col6] ASC
)

Kimberly Tripp có một số tài liệu tuyệt vời về chiến lược lập chỉ mục mà trong khi SQL tập trung có thể áp dụng cho các nền tảng khác. Đối với dân gian SQL Server, có một số công cụ tiện dụng để xác định các bản sao giống như ví dụ trên.

Chúng tôi cũng có thể tạo chỉ mục tạm thời trong khi thực hiện một truy vấn. Những ưu và nhược điểm của các kỹ thuật như vậy là gì?

Điều này thường chỉ áp dụng cho các truy vấn hiếm khi chạy, điển hình là ETL. Bạn cần đánh giá:

  1. Có phải thời gian để tạo chỉ mục làm giảm thời gian thực hiện truy vấn.
  2. Có phải chi phí bảo trì để giữ chỉ số tại chỗ lớn hơn thời gian cần thiết để tạo / giảm khi cần thiết.

3
+1 Khóa phân cụm, Khóa ngoài, Khóa duy nhất / Khóa chính và không tin tưởng các DMV chỉ mục bị thiếu theo mệnh giá ... Tất cả những điều này là lời khuyên tuyệt vời. Xử lý các chỉ mục hiện có, trong SQL Server, khá dễ dàng để theo dõi bằng sys.dm_db_index_usage_stats DMV. Trong một khoảng thời gian, bạn có thể liệt kê các chỉ mục chưa được quét hoặc tìm kiếm, đồng thời thấy rằng các chỉ mục tương tự đã được cập nhật nhiều lần. Đây là dấu hiệu của overindexing.
Matt M

1
+1, tuy nhiên 'tạo chỉ mục cho bất kỳ truy vấn rõ ràng có tính chọn lọc cao nào.' không bao gồm tất cả các kịch bản khác. Các chỉ mục có thể giúp sắp xếp kết quả ngay cả khi các truy vấn của bạn không có tính chọn lọc cao. Họ cũng có thể tăng tốc truy vấn nếu chúng bao gồm tất cả các cột được chọn.
Không hợp lý

1
Đồng ý, nhưng câu hỏi là tìm kiếm một điểm khởi đầu hơn là trò chơi kết thúc. Xác định các truy vấn để che là khó khăn mà không có mô hình sử dụng vì bạn hiếm khi có thể bao gồm tất cả chúng.
Mark Storey-Smith

8

Có những rủi ro thực sự liên quan đến cả hai phương pháp:

Tùy chọn a) Lập chỉ mục từ đầu, nhưng không nhận ra bạn đã tạo một số chỉ mục không bao giờ được sử dụng. Chúng thêm một số chi phí (đáng chú ý nhất vào các truy vấn sửa đổi dữ liệu, nhưng cũng tối ưu hóa các câu lệnh CHỌN cố gắng xác định chỉ mục tốt nhất).

Bạn sẽ cần phải kỷ luật bản thân để xác định các chỉ mục không còn được sử dụng nữa và thử và loại bỏ chúng (PostgreQuery có thể làm điều này; thật không may, MySQL bằng cách so sánh là rất yếu trong trường hợp này.)

Tùy chọn b) Không thêm chỉ mục cho đến khi mọi người bắt đầu phàn nàn hoặc công cụ chẩn đoán của bạn kích hoạt một số truy vấn nhất định chậm và có thể được cải thiện.

Rủi ro mà bạn giới thiệu là bạn không có cửa sổ thời gian đủ lớn giữa khi bạn nhận thấy bạn cần chỉ mục và khi bạn phải thêm nó.

PostgreSQL hỗ trợ xây dựng các chỉ mục CONCURRENTLY, giúp giảm một số căng thẳng từ yêu cầu bổ sung chỉ mục đột ngột này, nhưng có một số lưu ý trong hướng dẫn.


Tùy chọn (b) có xu hướng là sở thích của tôi, nhưng tôi nghĩ rằng sự kết hợp của cả hai tùy chọn có lẽ là giải pháp tốt nhất. Nó liên quan đến mức độ tự tin của bạn về việc bạn có nghĩ rằng một chỉ số sẽ thực sự được sử dụng hay không.

Điều làm cho điều này trở thành một cuộc thảo luận đặc biệt phức tạp là thường dễ thay đổi các chỉ mục, nhưng khó thay đổi lược đồ hơn. Tôi không muốn thúc đẩy phản ứng chậm trễ của b như một cái cớ để liều lĩnh.


4

Ngoài câu trả lời của Mark

Bạn có thể cảm nhận bằng cách có dữ liệu thử nghiệm thực tế với số lượng dự kiến. Tôi đã thấy nhiều, rất nhiều (quá nhiều) trường hợp một truy vấn chạy OK với 1000 hàng nhưng không phải là hàng triệu sản phẩm.

Nếu bạn có thể, hãy làm việc trên một bản sao của sản xuất sau này,

Tất nhiên, tôi đã thấy vấn đề kỳ lạ chỉ trong sản xuất vì mô hình sử dụng khi mọi thứ khác giống hệt nhau

Chỉ số tạm thời? Ngoài các mẫu tải ETL, nếu bạn cần chúng một lần, bạn sẽ cần lại chúng. Đừng quên: tạo / thả chỉ mục là ghi và được ghi = tải thêm


3

Chỉ cần thêm một vài điều.

  • Các chỉ mục tạm thời là một ý tưởng tồi tệ .. trừ khi chỉ mục nằm trên bảng tạm thời.
  • Các chỉ mục chiếm nhiều dataspace hơn (cũng như các chi phí khác) so với mọi người nhận ra. Do đó, tạo ra chúng một cách bảo thủ.

Đây là cách tiếp cận của tôi.

  1. Tương tự như Mark, tạo các chỉ mục nơi chúng có ý nghĩa, nhưng đừng quá hạn.
  2. Bạn không phải đợi cho đến khi hiệu suất chậm để tạo chỉ mục mới. Bất cứ khi nào bạn viết SQL mới, hãy chạy một kế hoạch truy vấn (tốt nhất là dựa vào cơ sở dữ liệu prod của bạn). Bạn sẽ có thể xem nếu một chỉ mục mới là bắt buộc.
  3. Đừng ngại đặt > 0hoặc > ""trong các mệnh đề của bạn cho các cột không được sử dụng.

    1. Tức là giả sử bạn có chỉ số trên A, B, C và D. Tuy nhiên, bạn chỉ có thông tin A, B, D. Không có lý do gì bạn không thể làm-
    select * from blah 
    where A="one" 
    and B="two" 
    and C>=""     --to match index
    and D="four"
    
    --This will use your existing index. No need to create a redundant one.

Một điều nữa, đây là trong diễn đàn "dba", nhưng việc tạo chỉ mục thực sự phải là trách nhiệm của nhà phát triển, chứ không phải của dba. (Đối với trường hợp chúng tách biệt hoàn toàn.)
user606723

2
Tuyên bố của bạn về không gian được chiếm bởi các chỉ mục là một chút sai lệch, có rất ít chi phí trong một chỉ mục không được nhóm. Nếu bạn có thể đăng một câu hỏi về điểm đó, nó sẽ đáng để khám phá thêm. Thứ hai, tôi không đồng ý rằng việc tạo chỉ mục là miền của nhà phát triển. Đó là một trong những lĩnh vực mà sự hợp tác giữa nhà phát triển và DBA có thể mang lại kết quả tốt nhất.
Mark Storey-Smith

1
Tôi sẽ cho bạn một ví dụ về một trong những bảng của chúng tôi. kích thước bảng: 21052404 KB. Kích thước của một chỉ mục không được nhóm trên bảng này: 6637470 KB. Rất ít chi phí? Tôi nghĩ là không. Hơn nữa, tôi không nói rằng các DBA không nên hợp tác với nhau, tôi nói rằng đó là trách nhiệm của nhà phát triển để xác định xem có cần tạo một chỉ mục mới hay không. Họ không nên viết SQL và mong đợi các dbas tự mình tìm ra điều này.
dùng606723

1
Bạn không thể trích dẫn những con số như thế mà không có ngữ cảnh. Nếu không chỉ định các cột chỉ mục NC và khóa cụm, không thể tính tỷ lệ chi phí so với dữ liệu.
Mark Storey-Smith

Chạm vào. Khóa này là [số (24), char, ngày] và các cột NC là [ngày, số (24)]. (Chỉ hai cột trong chỉ mục cụ thể này).
dùng606723

2

Tôi sẽ cố gắng chỉ trả lời câu hỏi đầu tiên. Nếu bạn có thể ước tính thậm chí ngay từ đầu có bao nhiêu bản ghi bạn sẽ có trong các bảng của mình sau một khoảng thời gian nhất định, thì tôi sẽ nói rằng tốt hơn là bắt đầu từ đầu để thiết kế một số chỉ mục. Hãy thử sử dụng một số công cụ kiểm tra hoặc tập lệnh kiểm tra sẽ tự động hóa càng nhiều cuộc gọi càng tốt cho các cuộc gọi ứng dụng mà bạn nghĩ sẽ được sử dụng thường xuyên nhất và bạn sẽ thấy những gì có thể tránh được việc quét bảng ngay từ đầu.

Nó sẽ là một công việc đoán ngay từ đầu, nhưng theo thời gian, khi bạn có số liệu thống kê sử dụng phù hợp, bạn sẽ có một hình ảnh rõ ràng hơn.

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.