Hai cột có và không có chỉ mục trong mệnh đề where - Chỉ mục hoạt động như thế nào


7

Tôi đang thực hiện một truy vấn trên SQL Server 2008:

SELECT col1
FROM table1
WHERE col2=val2 AND col3=val3

Ở đây col2 có một chỉ mục không được nhóm, col1 là PRIMARY KEYvà col3 không có bất kỳ chỉ mục nào. Kế hoạch thực hiện truy vấn là tương tự như thế này. nhập mô tả hình ảnh ở đây

Tôi muốn biết làm thế nào thực hiện truy vấn hoạt động ở đây. Từ kế hoạch thực hiện, tôi có thể thấy một chỉ mục tìm kiếm trên 'col2' và Tra cứu khóa trên 'col3' (hiển thị song song).

  • Có phải nó sẽ tìm nạp tất cả các hàng khớp với điều kiện 'col2 = val2' và kiểm tra điều kiện khác không?
  • Tại sao hai-Index tìm kiếm và Tra cứu khóa, được hiển thị song song trong kế hoạch thực hiện?
  • Nó sẽ luôn sử dụng chỉ mục có sẵn trên 'col2', xem xét một tập dữ liệu lớn và giả sử gần như tất cả các mục trong 'col2' là duy nhất?

Câu trả lời:


12

Tôi muốn biết cách thực hiện truy vấn ở đây

Mô hình thực thi chung là một đường ống dẫn, trong đó mỗi lần lặp trả về một hàng tại một thời điểm. Thực thi bắt đầu tại trình lặp gốc (ở phía bên trái, được dán nhãn SELECTtrong ví dụ của bạn).

Sau khi khởi tạo, trình lặp gốc yêu cầu một hàng từ đứa con ngay lập tức của nó, và cứ thế đi xuống chuỗi cho đến khi một trình vòng lặp có thể trả về một hàng được tìm thấy. Điều này chuyển ngược lại chuỗi đến gốc nơi nó được xếp hàng để gửi đến máy khách. Đó là một tổng quan rất đơn giản, để biết thêm chi tiết, xem:

Có phải nó sẽ tìm nạp tất cả các hàng khớp với điều kiện 'col2 = val2' và kiểm tra điều kiện khác không?

Tìm kiếm chỉ mục không bao gồm sẽ xác định vị trí một hàng khớp col2=val2. Nó sẽ có thể trả về col2col1 (xem danh sách đầu ra của nó) vì col1 có trong chỉ mục (vì khóa chính được nhóm trong trường hợp này).

Hàng này được chuyển đến các vòng lặp lồng nhau, sau đó chuyển điều khiển đến tra cứu khóa. Tra cứu sử dụng giá trị col1 để tìm kiếm trong cây b-index chỉ mục để tìm giá trị của col3 trong hàng này. Giá trị được kiểm tra theo vị ngữ col3=val3và chỉ được trả về nếu nó khớp.

Nếu có sự trùng khớp, hàng (c1, c2, c3) được truyền lên chuỗi và được xếp hàng để truyền đến máy khách. Khi điều khiển xuống cây một lần nữa, bất kỳ kết quả mới nào cho col2 trong chỉ mục không được bao gồm sẽ dẫn đến việc lặp lại các vòng lặp lồng nhau tham gia -> tra cứu -> chu kỳ hàng trả về. Ngay khi tìm kiếm chỉ mục không bao gồm hết hàng, quá trình hoàn thành khi điều khiển tiếp theo trả về bộ lặp gốc.

Tại sao hai-Index tìm kiếm và Tra cứu khóa, được hiển thị song song trong kế hoạch thực hiện?

Đó chỉ là cách kế hoạch đồ họa được đặt ra. Xem các liên kết và thảo luận ở trên để biết cách chính xác để hiểu chi tiết quá trình thực hiện.

Nó sẽ luôn sử dụng chỉ mục có sẵn trên 'col2', xem xét một tập dữ liệu lớn và giả sử gần như tất cả các mục trong 'col2' là duy nhất?

Nhiều khả năng là có. Trình tối ưu hóa đưa ra lựa chọn dựa trên chi phí giữa các chiến lược có sẵn. Với rất ít trận đấu được mong đợi, trình tối ưu hóa thường sẽ đánh giá một chỉ số không bao gồm tìm kiếm với một tra cứu là lựa chọn rẻ nhất. Một ngoại lệ xảy ra khi bảng rất nhỏ. Trong trường hợp đó, quét chỉ mục được nhóm và áp dụng cả hai vị từ cho mỗi hàng sẽ có vẻ rẻ nhất.

Như một lưu ý cuối cùng, một chỉ số không bao gồm sẽ tránh được việc tra cứu là:

CREATE [UNIQUE] NONCLUSTERED INDEX [dbo.table1 col2,col3 (col1)]
ON dbo.table1 (col2, col3)
INCLUDE (col1);

Nó nên được chỉ định UNIQUEnếu điều đó đúng với (col2, col3).

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.