2010-10-11 36 views
7

Tôi hoang mang bởi một truy vấn trong Oracle đang trở lại theo thứ tự dường như ngẫu nhiên.Tại sao Oracle trả về chuỗi cụ thể nếu các giá trị 'orderby' giống hệt nhau?

SELECT 
    Date, 
    Amount 
FROM MyTable 
WHERE Date = '26-OCT-2010' 
ORDER BY Date 

này trả về dữ liệu sau:

| Date  | Amount 
-------------------------- 
1 | 26-OCT-10 | 85 
2 | 26-OCT-10 | 9 
3 | 26-OCT-10 | 100 

Tôi không thể hiểu được lý do tại sao cơ sở dữ liệu trả về dữ liệu theo thứ tự cụ thể này, hoặc tại sao, kể từ khi bảng gốc sẽ trả lại dữ liệu theo cách này.

Đúc Date để TIMESTAMP khẳng định rằng tất cả các Date giá trị là cùng một giá trị - 26-OCT-10 00.00.00.000000000, do đó, tôi có thể loại trừ rằng có một sự khác biệt trong các giá trị. Tuy nhiên, khi tôi thực hiện việc này, các hàng sẽ trả về theo thứ tự 1, 3, 2.

Điều này khiến tôi phát điên lên vì vậy sẽ giúp ích cho tôi nếu ai đó có thể giải thích lý do tại sao điều này xảy ra. Tôi có thể mong đợi điều này trở lại theo thứ tự khác nhau mỗi khi truy vấn được chạy, cho rằng thứ tự có điều kiện là giống hệt nhau trên mỗi hàng (do đó để lại thứ tự đến cơ hội thuần túy).

Rất cám ơn trước.

Trả lời

10

Trật tự không phải là xuống "cơ hội thuần túy" - trừ khi bạn sửa đổi các truy vấn để:

SELECT 
    Date, 
    Amount 
FROM MyTable 
WHERE Date = '26-OCT-2010' 
ORDER BY Date, DBMS_RANDOM.VALUE; 

Trật tự là "tùy ý". Thay vì "ném xúc xắc" để quyết định thứ tự tùy ý (mà sẽ phải trả một số chi phí không cần thiết), Oracle chỉ trả về dữ liệu theo thứ tự nó gặp phải - có khả năng giống với chạy trong thời gian ngắn. (Về lâu dài, một cái gì đó có thể thay đổi trong môi trường để làm cho thứ tự khác nhau - nhưng vẫn tùy ý).

+0

Cảm ơn bạn đã giải thích! Tôi nghĩ rằng nó chỉ có thể 'hoàn nguyên' theo thứ tự gặp phải, như SQL Server, nhưng không chắc lắm. Cảm ơn một lần nữa! –

-1

Âm thanh như Oracle sử dụng thuật toán phân loại stable để thực hiện sắp xếp.

+0

Cảm ơn bạn đã liên kết! –

+2

Trích dẫn cần thiết. Tài liệu Oracle không nói rằng các kết quả được xác định khi phân loại hai giá trị giống hệt nhau. http://download.oracle.com/docs/cd/E11882_01/server.112/e17118/statements_10002.htm # SQLRF01702 –

+1

Jeffrey là chính xác: thứ tự có thể xuất hiện ổn định, nhưng trong thực tế nó là hoàn toàn có thể cho thứ tự để thay đổi - ví dụ nếu một chỉ số được thêm vào bảng. –

2

Trong khi tôi không biết gì về việc triển khai Oracle, nếu tất cả mọi thứ đều bình đẳng, trong priorty, thì chúng sẽ không theo thứ tự ngẫu nhiên: đặt chúng theo thứ tự ngẫu nhiên sẽ yêu cầu ngẫu nhiên có trật tự mỗi lần, (đó là n hoạt động ngẫu nhiên, trong đó n là số mục (sử dụng ký hiệu O lớn, nó sẽ là O (n)), là một điều tốn kém về tính toán, nếu truy vấn trả về kết quả lớn (hàng triệu). Được trả về bởi truy vấn

không cần phải ngẫu nhiên chúng theo cách này,

thay vào đó nó chỉ trả lại cho họ (những gì tôi đoán là) thứ tự chúng được lưu trữ trên đĩa

2

Đọc this nice piece từ blog của Tom Kyte về đặt hàng.

Khi bạn nói các hàng trở lại theo thứ tự "1,3,2" thì bạn nên đặt hàng theo (các) cột cho bạn biết rằng nó nằm trong 1,3,2 đơn hàng để sửa chữa.

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