Tôi có nên sử dụng nhiều chỉ mục trường đơn, thay vì chỉ mục nhiều cột cụ thể không?


35

Câu hỏi này là về hiệu quả của kỹ thuật lập chỉ mục SQL Server. Tôi nghĩ nó được gọi là "giao điểm".

Tôi đang làm việc với một ứng dụng SQL Server (2008) hiện có một số vấn đề về hiệu năng và độ ổn định. Các nhà phát triển đã làm một số điều kỳ lạ với lập chỉ mục. Tôi đã không thể có được điểm chuẩn kết luận về các vấn đề này, và tôi cũng không thể tìm thấy bất kỳ tài liệu thực sự tốt nào trên mạng.

Có nhiều cột có thể tìm kiếm trên một bảng. Các nhà phát triển đã tạo một chỉ mục cột duy nhất trên MACHI các cột có thể tìm kiếm. Lý thuyết là SQL Server sẽ có thể kết hợp (giao nhau) từng chỉ mục này để truy cập hiệu quả vào bảng trong hầu hết các trường hợp. Dưới đây là một ví dụ đơn giản (bảng thực có nhiều trường hơn):

CREATE TABLE [dbo].[FatTable](
    [id] [bigint] IDENTITY(1,1) NOT NULL,
    [col1] [nchar](12) NOT NULL,
    [col2] [int] NOT NULL,
    [col3] [varchar](2000) NOT NULL, ...

CREATE NONCLUSTERED INDEX [IndexCol1] ON [dbo].[FatTable]  ( [col1] ASC )
CREATE NONCLUSTERED INDEX [IndexCol2] ON [dbo].[FatTable] ( [col2] ASC )

select * from fattable where col1 = '2004IN' 
select * from fattable where col1 = '2004IN' and col2 = 4

Tôi nghĩ rằng nhiều chỉ mục cột được nhắm mục tiêu cho tiêu chí tìm kiếm tốt hơn nhiều, nhưng tôi có thể sai. Tôi đã thấy các kế hoạch truy vấn cho thấy SQL Server đang thực hiện khớp băm trên hai lần tìm kiếm chỉ mục. Có lẽ điều này có ý nghĩa khi bạn không biết làm thế nào bảng được tìm kiếm? Cảm ơn.


@brentozar có một video hay về các chỉ mục đáng xem: brentozar.com/sql-server-training-ideo/ mẹo
DForck42

Câu trả lời:


38

Những gì bạn cần là bao gồm các chỉ số, tức là. các chỉ mục có thể tự đáp ứng một truy vấn. Nhưng chỉ mục 'bao phủ' có một vấn đề: đó là bao gồm một truy vấn cụ thể . Vì vậy, để phát triển một chiến lược lập chỉ mục tốt, bạn cần hiểu khối lượng công việc của mình: những truy vấn nào đang truy cập cơ sở dữ liệu, những truy vấn nào là quan trọng và những truy vấn nào không, tần suất mỗi loại truy vấn được chạy, v.v. Và sau đó bạn cân bằng điều này với chi phí ghi và cập nhật của từng chỉ mục và ở đó bạn có chiến lược lập chỉ mục của mình. Nếu nó âm thanh phức tạp đó là bởi vì nó phức tạp.

Tuy nhiên bạn có thể áp dụng một số quy tắc của ngón tay cái. MSDN bao gồm những điều cơ bản khá tốt:

Ngoài ra còn có vô số bài viết được đóng góp bởi cộng đồng, vd. Ghi trên webcast - Giải thưởng DBA Darwin: Phiên bản Index .

Và để trả lời câu hỏi của bạn một cách cụ thể: các chỉ mục riêng biệt trên mỗi cột có thể hoạt động, miễn là mỗi cột có độ chọn lọc cao (nhiều giá trị riêng biệt, mỗi giá trị chỉ xuất hiện một vài lần trong cơ sở dữ liệu). Kế hoạch truy cập kết quả bằng cách sử dụng hàm băm giữa hai lần quét phạm vi chỉ mục thường hoạt động khá tốt. Các cột có độ chọn lọc thấp (vài giá trị riêng biệt, mỗi giá trị xuất hiện nhiều lần trong cơ sở dữ liệu) không có ý nghĩa để tự lập chỉ mục, trình tối ưu hóa truy vấn sẽ đơn giản bỏ qua chúng. Tuy nhiên, các cột có độ chọn lọc thấp nhiều lần tạo ra các khóa tổng hợp tốt khi chúng được ghép với một cột có độ chọn lọc cao.


Cảm ơn Remus. Tôi đang tự hỏi về lợi thế tương đối của việc tạo các chỉ mục nhiều cột được nhắm mục tiêu (và bao gồm), so với việc sử dụng các chỉ mục riêng biệt. Nếu nó "hoạt động khá tốt" là đủ tốt, nó có thể ổn. (Sẽ loại bỏ các chỉ mục trên các trường có độ chọn lọc thấp). Kỹ thuật này sẽ giúp ích khi chúng tôi không có quyền truy cập vào cơ sở dữ liệu sản xuất và không thể nhắm mục tiêu các chỉ mục của chúng tôi vào việc sử dụng thực tế.
RaoulRubin
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.