2012-12-18 28 views
8

Tôi đang chạy SQL Server 2012.Hiệu suất sử dụng DISTINCT COUNT địa chỉ

Tôi có một câu hỏi rằng khi sọc để nó nhất hình thức cơ bản trông như thế này:

SELECT COUNT(DISTINCT fullAddress) as quickCount 
FROM leads 
WHERE yearID >=12 AND yearID <=21 

Bảng dẫn có khoảng 149 triệu bản ghi trong nó. Có một chỉ số nhóm trên leadID và một chỉ mục không nhóm được lập chỉ mục trên YearID và có một bao gồm cho fullAddress.

Truy vấn này vì nó mất khoảng 40 giây để chạy. Tôi nhận ra điều đó không tệ nhưng trong tình huống này không đủ nhanh.

Tôi đã xem kế hoạch thực hiện và từ những gì tôi có thể biết khoảng 60% chi phí là DISTINCT COUNT.

Khi tôi chạy cùng một truy vấn mà không COUNT DISTINCT như thế này:

SELECT COUNT(*) as quickCount 
FROM leads 
WHERE yearID >=12 AND yearID <=21 

Nó chỉ mất 1 giây để chạy.

Thật không may, tôi cần nhận được một số địa chỉ đầy đủ khác biệt. Vì vậy, tôi đang cố gắng tìm ra nếu có bất cứ điều gì tôi có thể làm để làm cho truy vấn đầu tiên chạy nhanh hơn.

Đây là một ảnh chụp màn hình của kế hoạch thực hiện cho cả Truy vấn:

enter image description here

Dưới đây là một liên kết đến đó để xem nó lớn hơn - http://www.sequenzia.com/execPlan.jpg

Từ những gì tôi có thể nói vấn đề chính của tôi là Phân loại riêng biệt (52%).

Bất kỳ trợ giúp hoặc phản hồi nào về điều này sẽ thật tuyệt vời.

Cảm ơn!

CẬP NHẬT

tôi đã tư vấn Thilo và áp dụng chỉ số này:

CREATE INDEX IDX_X ON LEADS(FULLADDRESS, YEARID); 

Tôi thực sự tạo ra 2 bảng thử nghiệm mới với cùng 1 triệu hồ sơ chính xác trong mỗi trong số họ. Tôi đã áp dụng cùng một chỉ mục gốc cho cả hai và sau đó chỉ mục trên chỉ là một. Bây giờ khi tôi so sánh 2 bảng trên cùng một kế hoạch thực hiện, một với chỉ số trên là tốt hơn một chút 48% đến 52%. Đây là kế hoạch thực hiện mới - http://www.sequenzia.com/execPlan2.jpg

Điều đó giúp một số nhưng tôi thực sự cần hiệu suất cao hơn. Có ý tưởng nào khác không?

Trả lời

1

Một điều cần thử là loại bỏ phân loại, bằng cách đặt chỉ mục trên fullAddress (cũng bao gồm cột yearID để bạn có thể đáp ứng mệnh đề where).

CREATE INDEX IDX_X ON LEADS(FULLADDRESS, YEARID); 

Bằng cách này, bạn sẽ nhận được Quét toàn bộ chỉ số nhanh (có thể chậm hơn phạm vi chỉ mục Quét bạn có số lượng không phân biệt, nhưng hy vọng nhanh hơn 40 giây).

Nhưng tại sao cần phải nhanh như vậy? Đây không phải là điều bạn cần làm mọi lúc, đúng không?Nếu điều này là cho một trang web công cộng, bạn có thể nhận được ngay với một kết quả được lưu trữ hơi lỗi thời, tôi sẽ nghĩ.

Các vấn đề liên quan