2009-02-06 33 views
5

Tôi đang cố gắng chọn danh sách riêng biệt trong đó các bản sao được tạo trên nhiều trường. Ví dụ:Trong SQL, việc sử dụng DISTINCT ảnh hưởng như thế nào đến hiệu suất?

SELECT tablename.field1Date, 
     tablename.field2Number, 
     tablename.field3Text 
FROM tablename; 

Sẽ chọn bản ghi trùng lặp theo ngày, số và trường văn bản tương ứng.

Bây giờ, khi tôi chọn các bản ghi riêng biệt để cung cấp những gì tôi đang tìm kiếm, hiệu suất dường như giảm đáng kể.

SELECT DISTINCT tablename.field1Date, 
       tablename.field2Number, 
       tablename.field3Text 
FROM tablename; 

Có lý do nào cho điều này không? Tôi phải thừa nhận tôi đang sử dụng MS Access 2003 có thể là vấn đề.

Trả lời

10

Có, về cơ bản nó phải sắp xếp kết quả và sau đó xử lý lại để loại bỏ các bản sao. Điều này cũng có thể được thực hiện trong khi sắp xếp, nhưng chúng tôi chỉ có thể suy đoán về cách chính xác mã hoạt động trong nền. Bạn có thể thử và cải thiện hiệu suất bằng cách tạo chỉ mục bao gồm tất cả ba (3) trường.

+0

Bạn có nghĩ rằng có sự khác biệt về hiệu suất giữa chỉ mục tổng hợp trên cả ba trường và chỉ mục riêng lẻ trên mỗi trường? –

+0

Tôi hy vọng rằng sẽ có một số cải tiến. Nếu không, chỉ sử dụng chỉ mục của một hợp chất để đảm bảo tính duy nhất, thay vì giúp tìm kiếm các n-tuple. – BIBD

1

Có, ứng dụng cần so sánh mọi bản ghi với bộ nhớ cache "riêng biệt" khi nó trôi qua. Bạn có thể cải thiện hiệu suất bằng cách sử dụng một chỉ mục, đặc biệt là trên các trường số và ngày tháng.

+0

Thao tác bạn mô tả là O (n²). Do đó, nhiều khả năng câu trả lời của CodeSlave là chính xác, vì việc phân loại chỉ mất O (n log n) và loại bỏ các bản sao từ một danh sách được sắp xếp là O (n). –

4

Trang này có các mẹo về cải thiện hiệu suất truy vấn của bạn và cũng có một số thông tin về cách sử dụng trình phân tích hiệu suất. Nó sẽ cho bạn biết nếu cần bất kỳ chỉ số nào.

http://support.microsoft.com/kb/209126

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