2011-08-25 44 views
25

Tôi đã phải xem xét một số mã, và bắt gặp một cái gì đó mà một người nào đó đã làm, và không thể nghĩ ra một lý do theo cách của tôi là tốt hơn. Và nó có lẽ không phải là, vì vậy, đó là tốt hơn/an toàn hơn/hiệu quả hơn?MAX so với Top 1 - tốt hơn?

SELECT MAX(a_date) FROM a_table WHERE a_primary_key = 5 GROUP BY event_id 

HOẶC

SELECT TOP 1 a_date FROM a_table WHERE a_primary_key = 5 ORDER BY a_date 

tôi đã có thể đi với các tùy chọn thứ 2, nhưng không chắc chắn lý do tại sao, và nếu điều đó là đúng.

Trả lời

13

Hiệu suất thường tương tự, nếu bảng của bạn được lập chỉ mục.

Worth xem xét mặc dù: Top thường chỉ có ý nghĩa nếu bạn đang đặt hàng kết quả của bạn (? Khác, top của )

đặt hàng Kết quả là đòi hỏi chế biến hơn.

Min không phải lúc nào cũng yêu cầu đặt hàng. (Chỉ cần phụ thuộc, nhưng thông thường bạn không cần phải đặt hàng hoặc nhóm theo, v.v.)

Trong hai ví dụ của bạn, tôi mong đợi tốc độ/x-kế hoạch là rất giống nhau. Bạn luôn có thể chuyển sang số liệu thống kê của mình để đảm bảo, nhưng tôi nghi ngờ sự khác biệt sẽ là đáng kể.

+1

SQL Server TOP 1 hoạt động khác với Oracle sử dụng rowNum = 1. Oracle thực sự lấy đầu tiên nó tìm thấy TRƯỚC KHI đặt hàng, vì vậy phương pháp này chỉ hợp lệ cho SQL Server. Một lợi ích khác của TOP 1 này so với Max() là bạn có thể lấy bao nhiêu cột tùy thích, miễn là bạn bao gồm thứ tự áp dụng. Tôi đã thử nghiệm bằng cách sử dụng Max() và tìm thấy ngay cả với GROUP BY rằng nó dường như không mang lại chỉ 1 bản ghi. Có lẽ ai đó mạnh hơn mojo có thể nói làm thế nào để có được chỉ là một hàng nếu bạn muốn nhận được hàng đầu từ nhiều cột w/o một truy vấn phụ? – gordon

10

Đó là các truy vấn khác nhau.

Người đầu tiên trả lại nhiều hồ sơ (các a_date lớn nhất đối với mỗi event_id tìm thấy trong a_primary_key = 5)

thứ hai trả về một bản ghi (nhỏ nhất a_date tìm thấy trong a_primary_key = 5).

+2

o.O truy vấn đầu tiên sẽ vẫn trả lại một bản ghi –

+1

@Shredder Được cung cấp 'a_primary_key' thực sự là một khóa chính, nó sẽ. Nhưng nếu nó là khóa chính, bạn chỉ có một ngày trong 'a_date', và bạn không cần' max' hay 'top'. – GSerg

+0

Thậm chí nếu không, nó vẫn sẽ trả về một bản ghi. http://www.w3schools.com/sql/sql_func_max.asp –

0

MAXTOP hoạt động khác nhau. Truy vấn đầu tiên của bạn sẽ trả lại giá trị tối đa được tìm thấy cho a_date có một số a_primary_key = 5 cho mỗi khác nhau event_id được tìm thấy. Truy vấn thứ hai sẽ chỉ cần lấy số a_date đầu tiên có số a_primary_key = 5 được tìm thấy trong tập hợp kết quả.

+1

Nó sẽ không lấy giá trị đầu tiên. 'Top', khi được kết hợp với' order by asc', sẽ chọn giá trị nhỏ nhất. – GSerg

+0

wth là bạn smokin bro, gimme một số đó .. Nó * sẽ * lấy giá trị đầu tiên được tìm thấy, và có, trong trường hợp này nó sẽ là nhỏ nhất kể từ khi đặt hàng của ASC đi từ nhỏ nhất đến lớn nhất, làm cho giá trị đầu tiên nhỏ nhất .. –

5

Đối với các truy vấn để có kết quả tương tự, bạn sẽ cần:

SELECT MAX(a_date) FROM a_table WHERE a_primary_key = 5 

SELECT TOP 1 a_date FROM a_table WHERE a_primary_key = 5 ORDER BY a_date DESC 

Cách tốt nhất để biết đó là nhanh hơn là để kiểm tra kế hoạch truy vấn và làm tiêu chuẩn của bạn. Có nhiều yếu tố có thể ảnh hưởng đến tốc độ, chẳng hạn như kích thước bảng/heap, v.v. Và thậm chí các phiên bản khác nhau của cùng một cơ sở dữ liệu có thể được tối ưu hóa để ưu tiên một truy vấn so với khác.

+3

Không cần phải nhóm trong ví dụ đầu tiên (vì bạn chỉ có một nhóm, theo mệnh đề WHERE của bạn). – Chains

+0

@kuru: Tôi không chắc chắn bạn có thể sử dụng chức năng tổng hợp với nhóm, nhưng nếu vậy ... bạn đang đúng – vol7ron

+3

Miễn là bạn chỉ chọn mức độ nghiêm trọng (như bạn đang trả lời), bạn ổn. Nếu bạn bao gồm một giá trị không tăng trưởng trong lựa chọn, thì bạn cần một nhóm theo. – Chains

28

1) Khi có một chỉ số clustered trên bảng và cột để được truy vấn, cả MAX() điều hành và truy vấn SELECT TOP 1 sẽ có hiệu suất gần như giống hệt nhau.

2) Khi không có chỉ mục nhóm trên bàn và cột được truy vấn, toán tử MAX() mang lại hiệu suất tốt hơn.

tham khảo: http://www.johnsansom.com/performance-comparison-of-select-top-1-verses-max/

0

tôi thực hiện tối đa và hàng đầu trên một bảng với 20,00,000+ hồ sơ, và thấy rằng trên cho nhanh kết quả với trật tự do hơn so với tối đa hoặc hàm min.

Vì vậy, cách tốt nhất là thực thi cả truy vấn của bạn từng lần một và kiểm tra thời gian kết nối đã trôi qua.

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