Tại sao số lần quét chỉ số quét cụm thực thi rất cao?


15

Tôi có hai truy vấn tương tự tạo cùng một kế hoạch truy vấn, ngoại trừ một kế hoạch truy vấn thực hiện Quét chỉ mục cụm 1316 lần, trong khi truy vấn kia thực hiện 1 lần.

Sự khác biệt duy nhất giữa hai truy vấn là tiêu chí ngày khác nhau. Truy vấn chạy dài thực sự thu hẹp tiêu chí ngày và lấy lại ít dữ liệu hơn.

Tôi đã xác định được một số chỉ mục sẽ trợ giúp cho cả hai truy vấn, nhưng tôi chỉ muốn hiểu tại sao toán tử Clustered Index Scan lại thực thi 1316 lần trên một truy vấn gần giống như truy vấn mà nó thực hiện 1 lần.

Tôi đã kiểm tra số liệu thống kê về PK đang được quét và chúng tương đối cập nhật.

Truy vấn gốc:

select distinct FIR_Incident.IncidentID
from FIR_Incident
left join (
    select incident_id as exported_incident_id
    from postnfirssummary
) exported_incidents on exported_incidents.exported_incident_id = fir_incident.incidentid
where FI_IncidentDate between '2011-06-01 00:00:00.000' and '2011-07-01 00:00:00.000'
    and exported_incidents.exported_incident_id is not null

Tạo kế hoạch này: nhập mô tả hình ảnh ở đây

Sau khi thu hẹp tiêu chí phạm vi ngày:

select distinct FIR_Incident.IncidentID
from FIR_Incident
left join (
    select incident_id as exported_incident_id
    from postnfirssummary
) exported_incidents on exported_incidents.exported_incident_id = fir_incident.incidentid
where FI_IncidentDate between '2011-07-01 00:00:00.000' and '2011-07-02 00:00:00.000'
    and exported_incidents.exported_incident_id is not null

Tạo kế hoạch này: nhập mô tả hình ảnh ở đây


Bạn có thể sao chép / dán các truy vấn của mình trong một khối mã thay vì các tệp hình ảnh không?
Eric Humphrey - lotahelp

Chắc chắn - Tôi đã thêm các truy vấn đang tạo ra mỗi kế hoạch.
Seibar

Bảng nào là quét chỉ mục cụm xảy ra trên?
Eric Humphrey - lotahelp

Quét chỉ mục cụm là trên truy vấn con trong liên kết bên trái (PostNFIRSSummary)
Seibar

1
Có lẽ lần trước các số liệu thống kê được cập nhật, chỉ có 0 hoặc một hàng đáp ứng các FI_IncidentDate between '2011-07-01 00:00:00.000' and '2011-07-02 00:00:00.000'tiêu chí và kể từ đó đã có một số lượng chèn không tương xứng trong phạm vi đó. Nó ước tính chỉ cần 1,07 lần thực hiện cho phạm vi ngày đó. Không phải là 1.316 xảy ra trong thực tế.
Martin Smith

Câu trả lời:


9

THAM GIA sau khi quét cho một manh mối: với ít hàng hơn ở một bên của lần nối cuối cùng (tất nhiên là đọc từ phải sang trái), trình tối ưu hóa chọn một "vòng lặp lồng" chứ không phải là "phép nối băm".

Tuy nhiên, trước khi xem xét điều này, tôi sẽ nhắm đến việc loại bỏ Tra cứu khóa và DISTINCT.

  • Tra cứu chính: chỉ mục của bạn trên FIR_Incident phải được che lại, có thể (FI_IncidentDate, incidentid)hoặc ngược lại. Hoặc có cả hai và xem cái nào được sử dụng thường xuyên hơn (cả hai đều có thể)

  • Đây DISTINCTlà một hệ quả của LEFT JOIN ... IS NOT NULL. Trình tối ưu hóa đã loại bỏ nó (các kế hoạch đã "bán trái" trong THAM GIA cuối cùng) nhưng tôi sử dụng EXISTS cho rõ ràng

Cái gì đó như:

select 
    F.IncidentID
from 
    FIR_Incident F
where 
    exists (SELECT * FROM postnfirssummary P
           WHERE P.incident_id = F.incidentid)
    AND
    F.FI_IncidentDate between '2011-07-01 00:00:00.000' and '2011-07-02 00:00:00.000'

Bạn cũng có thể sử dụng hướng dẫn kế hoạch và gợi ý THAM GIA để khiến SQL Server sử dụng phép nối băm, nhưng hãy cố gắng làm cho nó hoạt động bình thường trước: hướng dẫn hoặc gợi ý có thể sẽ không vượt qua được thử thách vì chúng chỉ hữu ích cho dữ liệu và truy vấn bạn chạy bây giờ, không phải trong tương lai

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.