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 SELECT
trong 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ề col2 và col1 (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=val3
và 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 UNIQUE
nếu điều đó đúng với (col2, col3).