Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Thứ tự hàng mặc định trong truy vấn CHỌN - SQL Server 2008 so với SQL 2012

Bạn cần quay lại và thêm ORDER BY các mệnh đề đối với mã của bạn bởi vì không có chúng, đơn đặt hàng không bao giờ được đảm bảo. Bạn đã "may mắn" trong quá khứ rằng bạn luôn nhận được cùng một thứ tự nhưng không phải vì SQL Server 2008 dù sao cũng đảm bảo điều đó. Rất có thể nó liên quan đến các chỉ mục của bạn hoặc cách dữ liệu đang được lưu trữ trên đĩa.

Nếu bạn chuyển sang một máy chủ mới khi bạn nâng cấp sự khác biệt về cấu hình phần cứng một mình có thể đã thay đổi cách các truy vấn của bạn thực thi. Chưa kể đến thực tế là máy chủ mới sẽ có thống kê được tính toán lại trên các bảng và trình tối ưu hóa truy vấn SQL Server 2012 có thể thực hiện mọi thứ hơi khác so với trình tối ưu hóa truy vấn trong SQL Server 2008.

Đó là một sai lầm mà bạn có thể dựa vào thứ tự của tập hợp kết quả trong SQL mà không nêu rõ thứ tự bạn muốn. Kết quả SQL KHÔNG BAO GIỜ có một đơn đặt hàng mà bạn có thể dựa vào mà không cần sử dụng ORDER BY mệnh đề. SQL được xây dựng dựa trên lý thuyết tập hợp. Kết quả truy vấn về cơ bản là các tập hợp (hoặc nhiều tập hợp).

Itzik Ben-Gan đưa ra một mô tả tốt về lý thuyết tập hợp liên quan đến SQL trong cuốn sách Nguyên tắc cơ bản về Microsoft SQL Server 2012 T-SQL của anh ấy

Lý thuyết tập hợp, bắt nguồn từ nhà toán học Georg Cantor, là một phần của các nhánh toán học mà mô hình quan hệ dựa trên đó. Định nghĩa của Cantor về một tập hợp như sau:

Theo một "tập hợp", chúng ta có nghĩa là bất kỳ tập hợp M nào thành một tổng thể xác định, đối tượng m (được gọi là "các phần tử" của M) trong nhận thức của chúng ta đối với suy nghĩ của chúng ta. - Joseph W. Dauben và Georg Cantor (Nhà xuất bản PrincetonUniversity, 1990)

Sau khi giải thích cặn kẽ các thuật ngữ trong định nghĩa, Itzik tiếp tục nói:

Định nghĩa của Cantor về một tập hợp có lẽ cũng quan trọng như những gì nó bao gồm. Lưu ý rằng định nghĩa không đề cập đến bất kỳ thứ tự nào giữa các phần tử tập hợp. Thứ tự liệt kê các phần tử tập hợp không có giá trị. Kí hiệu chính thức cho các phần tử tập hợp danh sách sử dụng dấu ngoặc nhọn:{a, b, c}. Bởi vì thứ tự không có liên quan, bạn có thể nhấn vào cùng một tập hợp như {b, a, c} hoặc {b, c, a}. Chuyển tới tập hợp các thuộc tính (được gọi là cột trong SQL) tạo nên tiêu đề của hàm (được gọi là bảng trong SQL), một phần tử được cho là được xác định bằng tên - không phải vị trí thứ tự. Tương tự, hãy xem xét các bộ giá trị (được gọi là hàng bởi SQL) tạo nên phần thân của mối quan hệ; một phần tử được xác định bằng các giá trị khóa của nó - không phải theo vị trí. Nhiều lập trình viên gặp khó khăn trong việc thích nghi với ý tưởng rằng, đối với các bảng truy vấn, không có thứ tự giữa các hàng. Nói cách khác, truy vấn đối với bảng có thể trả về các hàng theo bất kỳ thứ tự nào trừ khi bạn yêu cầu rõ ràng rằng dữ liệu được sắp xếp theo một cách cụ thể, có lẽ cho mục đích trình bày.

Nhưng bất kể định nghĩa học thuật của một tập hợp, ngay cả việc triển khai trong máy chủ SQL cũng chưa bao giờ đảm bảo bất kỳ thứ tự nào trong kết quả. Bài đăng trên blog MSDN này từ năm 2005 của một thành viên của nhóm tối ưu hóa truy vấn nói rằng bạn không nên dựa vào thứ tự từ các hoạt động trung gian.

Các quy tắc sắp xếp lại có thể và sẽ vi phạm giả định này (và gây bất tiện cho bạn, nhà phát triển;). Vui lòng hiểu rằng khi chúng tôi sắp xếp lại các hoạt động để tìm một kế hoạch hiệu quả hơn, chúng tôi có thể sử dụng hành vi sắp xếp để thay đổi đối với các nút trung gian trong ba. Nếu bạn đặt một phép toán vào cây giả định thứ tự trung gian theo kiểu aparticular, nó có thể bị hỏng.

Bài đăng trên blog này của Conor Cunningham (Kiến trúc sư, SQL Server Core Engine) "Không thắt dây an toàn - Dự kiến ​​thứ tự mà không có ORDER BY" nói về SQL Server 2008. Anh ta có một bảng với 20 nghìn hàng trong đó với một chỉ mục duy nhất dường như luôn trả về các hàng trong cùng một thứ tự. Thêm ORDER BY đối với truy vấn thậm chí không thay đổi kế hoạch thực thi, vì vậy không giống như việc thêm một kế hoạch vào làm cho truy vấn đắt hơn nếu trình tối ưu hóa nhận ra nó không cần đến nó. Nhưng khi anh ấy thêm 20k hàng khác vào bảng thì đột nhiên kế hoạch truy vấn thay đổi và bây giờ nó sử dụng song song và kết quả không còn được sắp xếp theo thứ tự nữa!

Điều khó khăn ở đây là không có cách nào hợp lý để bất kỳ người dùng bên ngoài nào biết khi nào một kế hoạch sẽ thay đổi. Không gian của tất cả các kế hoạch là bao trùm và khiến bạn đau đầu để suy ngẫm. Trình tối ưu hóa của SQL Server sẽ thay đổi các giao thức, ngay cả đối với các truy vấn đơn giản, nếu đủ các tham số thay đổi.

Nếu bạn cần thuyết phục hơn, chỉ cần đọc những bài viết này:

  • Không có ORDER BY, không có thứ tự sắp xếp mặc định. - Alexander Kuznetsov
  • Trật tự tại tòa án! - Thomas Kyte
  • Thứ tự của một tập hợp kết quả trong SQL - Timothy Wiseman



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Đã xảy ra lỗi liên quan đến mạng hoặc lỗi cụ thể đối với trường hợp cụ thể khi thiết lập kết nối với SQL Server

  2. Chỉ mục dựa trên hàm trong SQL Server

  3. Biểu thức chính quy trong máy chủ SQL Server?

  4. TABLOCK so với TABLOCKX

  5. Thay đổi định dạng ngày giờ mặc định trên một cơ sở dữ liệu duy nhất trong SQL Server