Hãy thử xóa tất cả các ví dụ ALL
. Hoặc thậm chí chỉ một trong số họ. Bây giờ hãy xem xét rằng loại tối ưu hóa phải xảy ra ở đó (và nhiều loại khác) cũng sẽ có thể khi truy vấn SELECT
là các truy vấn thực tế đối với các bảng và được tối ưu hóa riêng biệt. Nếu không có ORDER BY
, việc đặt hàng trong mỗi truy vấn sẽ tùy ý và bạn không thể đảm bảo rằng các truy vấn đó sẽ được xử lý theo bất kỳ thứ tự nào.
Nói UNION ALL
không có số ORDER BY
giống như nói "Chỉ cần ném tất cả các viên bi trên sàn." Có lẽ mỗi khi bạn ném tất cả các viên bi trên sàn nhà, chúng sẽ được sắp xếp theo màu sắc. Điều đó không có nghĩa là lần sau bạn ném chúng trên sàn nhà, chúng sẽ hoạt động theo cùng một cách. Điều này cũng đúng cho việc đặt hàng trong SQL Server - nếu bạn không nói ORDER BY
thì SQL Server giả định bạn không quan tâm đến thứ tự. Bạn có thể thấy trùng hợp một thứ tự nhất định được trả lại mọi lúc, nhưng nhiều thứ có thể ảnh hưởng đến thứ tự tùy ý đã được chọn lần sau. Thay đổi dữ liệu, thay đổi thống kê, biên dịch lại, lập kế hoạch tuôn ra, nâng cấp, gói dịch vụ, hotfix, theo dõi cờ ... quảng cáo nauseum.
tôi sẽ đặt này bằng chữ lớn để làm cho nó rõ ràng:
Bạn không thể đảm bảo một trật tự mà không cần ORDER BY
Một số đọc thêm:
http://sqlblog.com/blogs/aaron_bertrand/archive/2010/02/08/bad-habits-to-kick-relying-on-undocumented-behavior.aspx
Ngoài ra, please read this post by Conor Cunningham, a pretty smart guy on the SQL team.
Nguồn
2013-04-02 14:28:18
Tại sao mọi người lại có thể đảm bảo đặt hàng ngoại trừ khi có điều khoản 'ORDER BY'? - Có một cơ hội rõ ràng cho tính song song (nếu có đủ tài nguyên) để tính toán từng tập kết quả song song và phục vụ mỗi hàng kết quả (từ các truy vấn song song) đến máy khách theo thứ tự bất kỳ mà mỗi hàng kết quả riêng lẻ có sẵn. –
@Damien_The_Unbeliever và mỗi cái có thể được tối ưu hóa để sắp xếp khác nhau do các yếu tố khác không hiển nhiên trong chính truy vấn. –
@Damien_The_Unbeliever. . . Trong thực tế, MySQL đảm bảo thứ tự sau một 'nhóm by' (" Nếu bạn sử dụng GROUP BY, các hàng đầu ra được sắp xếp theo các cột GROUP BY như thể bạn có một ORDER BY cho cùng một cột. "Tại http: // dev.mysql.com/doc/refman/5.5/en/select.html). Tôi xem đây là một hạn chế lớn về khả năng MySQL tối ưu hóa các biểu thức tập hợp. Nó thậm chí không hỗ trợ tập hợp băm. –