Theo thứ tự các hàng được lấy vắng mặt mệnh đề ORDER BY?


11

Một lập trình viên đang kiểm tra và so sánh cùng một ứng dụng sử dụng cùng cấu trúc cơ sở dữ liệu và cùng một dữ liệu, chỉ trong hai cơ sở dữ liệu riêng biệt, một với Oracle 8 và một với Oracle 9.

Ứng dụng chạy một truy vấn không có ORDER BY mệnh đề.

Ông tuyên bố rằng truy vấn ORDER-BY-less sẽ trả về các hàng theo cùng một thứ tự trong cả hai cơ sở dữ liệu.

Tôi nói với anh ta rằng không có bảo hành của cùng một đơn hàng trừ khi bạn tự tin cung cấp một mệnh đề ORDER BY.

Cơ sở dữ liệu có cùng chỉ mục và khóa. Nhưng kế hoạch giải thích cho thấy rằng trong một trong các cơ sở dữ liệu, công cụ đang sử dụng khóa của một trong các bảng đã tham gia trong khi trong cơ sở dữ liệu khác, nó sử dụng cơ sở dữ liệu khác.

Anh ta khẳng định rằng hai môi trường DB không bằng nhau, điều này là do chúng có số liệu thống kê khác nhau, các công cụ rdbms khác nhau, v.v., nhưng không phải vì tôi thất bại trong việc sao chép mọi chỉ mục mà cơ sở dữ liệu gốc có.

Tôi nói với anh ta rằng anh ta phải tự hào cung cấp một ORDER BYđiều khoản nếu thứ tự thực sự quan trọng.

Câu hỏi

Vì vậy, tôi có thể giải thích anh ta tốt hơn:

Theo thứ tự nào một truy vấn tìm nạp các hàng khi bạn không khám phá cung cấp mệnh đề ORDER BY và tại sao truy vấn đó không trả về các hàng theo cùng một thứ tự?


3
Nó không được xác định. Tôi không tin rằng đặc tả SQL nêu thứ tự cụ thể mà các bản ghi sẽ được trả về, vì vậy nó sẽ phụ thuộc vào việc triển khai.
Robert Harvey

1
@RobertHarvey Đó chính xác là lý do tại sao tôi nói với anh ấy. Trong thực tế: theo định nghĩa các bảng quan hệ phải không có thứ tự cụ thể.
Tulains Córdova

1
Có thể có ý nghĩa ngay cả trên cùng một phiên bản phần mềm để sử dụng một chỉ mục khác vì nó có thể được lựa chọn nhiều hơn dựa trên số liệu thống kê chỉ mục mà nó đã thu thập cho dữ liệu chính xác trong cơ sở dữ liệu đó. Vì vậy, bạn thực sự không thể dựa vào đơn đặt hàng nếu bạn không chỉ định nó.
psr

Bạn thực sự có thể mong đợi truy vấn đầu tiên theo cột không được lập trình theo thứ tự "chèn thời gian"; theo chỉ mục "thời gian cập nhật". Các yêu cầu liên tiếp có thể có khả năng bị "làm mờ" bởi các kết quả được lưu trong bộ nhớ cache và do đó khá ngẫu nhiên; tuy nhiên không bao giờ phụ thuộc vào nó - nó có thể thay đổi từ phiên bản này sang phiên bản khác, bởi các tham số, bởi các hoạt động cập nhật và do thời tiết xấu vào trăng tròn. "Không xác định" là câu trả lời chính xác, và bất cứ điều gì khác là ở những dự đoán được thông báo tốt nhất.
SF.

1
Các bộ kết quả được RDMBS-es trả về chỉ là: các bộ , theo định nghĩa không có thứ tự cụ thể. Vì vậy, RDBMS có thể trả về chúng theo bất kỳ thứ tự nào nó thích và thay đổi thứ tự một lần nữa trong lần thực hiện truy vấn tiếp theo. Dựa vào một thứ tự cụ thể mà không có mệnh đề ORDER BY sẽ là một sai lầm. Tôi luôn cố gắng giải thích điều này với đồng nghiệp của mình, nhưng tôi chỉ thành công một nửa thời gian: D.
Radu Murzea

Câu trả lời:


25

Từ Wikipedia :

Mệnh đề ORDER BY xác định các cột được sử dụng để sắp xếp dữ liệu kết quả và theo hướng chúng sẽ được sắp xếp (các tùy chọn tăng dần hoặc giảm dần). Nếu không có mệnh đề ORDER BY, thứ tự các hàng được trả về bởi truy vấn SQL sẽ không được xác định.

Vì vậy, nó không được xác định.

Đặc tả SQL không nêu thứ tự cụ thể mà các bản ghi sẽ được trả về, do đó, nó sẽ phụ thuộc vào việc thực hiện.

Không có chỉ mục trên bảng, thứ tự hợp lý sẽ là thứ tự mà các bản ghi được chèn vào. Với Khóa chính được xác định, thứ tự hợp lý sẽ là thứ tự của Khóa chính. Nhưng vì thông số ANSI không yêu cầu một đơn đặt hàng cụ thể, tùy thuộc vào nhà cung cấp và độ nhạy cảm của chúng có thể khác với của bạn hoặc của tôi.

Vì đơn đặt hàng không được nêu trong đặc tả, nên việc dựa vào hành vi của một nhà cung cấp cụ thể là không khôn ngoan, vì nó có thể thay đổi từ nhà cung cấp này sang nhà cung cấp khác và nhà cung cấp có thể thay đổi đơn hàng bất cứ lúc nào họ muốn mà không cần cảnh báo.

Như bạn đã nói, chỉ bao gồm các ORDER BYđiều khoản, nếu thứ tự là quan trọng.


Truy vấn có một số bảng đã tham gia. Vì vậy, một công cụ DB sắp xếp tập kết quả theo một tiêu chí và DB khác sử dụng tiêu chí khác. Obvioulsy, khi một mệnh đề ORDER BY được cung cấp, cả hai truy vấn sẽ trả về các hàng theo thứ tự được chỉ định.
Tulains Córdova

+1 AFAICR, thứ tự thậm chí được phép thay đổi mỗi khi bạn thực hiện bất kỳ truy vấn cụ thể nào trên một trường hợp cơ sở dữ liệu cụ thể.
MarkJ

2
Tôi sẽ nói rằng, không có mệnh đề ORDER BY, thứ tự kết quả hợp lý duy nhất là bất cứ thứ gì tạo ra ít chi phí nhất. Đối với các công cụ lưu trữ và truy vấn DB đơn giản, đó thường sẽ là thứ tự chèn (và đối với các khóa chính được tạo giống như thứ tự khóa chính). Nhưng ngay sau khi bạn có hàm băm tham gia vào đó, tôi hy vọng thứ tự về cơ bản là ngẫu nhiên.
Michael Borgwardt

2

Rõ ràng chỉ ra rằng thông số kỹ thuật không cho biết dữ liệu đến theo thứ tự nào, đã không hoạt động. Có lẽ bởi vì anh ta biết dữ liệu trên một đĩa hoặc trong bộ nhớ ở đâu đó và do đó có một thứ tự. Hỏi anh ta thứ tự của dữ liệu tính toán từ một số bảng. Tức là tạo một ví dụ trong đó bạn tham gia 4 bảng, thực hiện phép tính trên 2 bảng và chỉ trả về giá trị đã tính.

Công cụ trả về dữ liệu theo thứ tự mà nó tìm thấy (không có thứ tự theo), nhưng cách nó tìm thấy nó phụ thuộc vào các yếu tố có thể thay đổi - chỉ số, số liệu thống kê, bộ nhớ cache. Nói chung, dữ liệu sẽ theo một thứ tự nhất quán - nhưng nếu bạn phụ thuộc vào thứ tự, bạn cần yêu cầu nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.