假設我們有兩個表:
user:
id,name
1,bob
2,alice
user_group:
id,user_id,group
1,1,g1
2,1,g2
3,2,g2
4,2,g3
我們不保證每次執行SELECT * FROM user沒有ORDER BY結果集時都會有相同的順序。但是連接中的相關行呢?
例如,
SELECT user.name, user_group.group FROM user INNER JOIN user_group ON (user.id = user_group.user_id);。相關(連接)行在結果集中是否相鄰(以 PostgreSQL 為例)?我的意思是:
bob,g1
bob,g2
alice,g2
alice,g3
或者
alice,g3
alice,g2
bob,g2
bob,g1
而不是這個:
bob,g1
alice,g2
bob,g2
alice,g3
s 的順序user無關緊要,group每個中 s的順序user也是如此
uj5u.com熱心網友回復:
SQL 中的一條基本規則是,除非您添加一個ORDER BY. 如果沒有ORDER BY,則結果集的順序可以取決于
PostgreSQL 讀取單個表的順序——它可以是索引順序或順序,即使使用順序掃描,您也不總是得到相同的順序(除非您禁用
synchronize_seqscans)選擇的連接策略(嵌套回圈、散列連接或合并連接)
查詢回傳的行數(如果使用游標,PostgreSQL 會優化查詢以便快速回傳第一行)
也就是說,對于您的特定示例和 PostgreSQL 作為資料庫,我認為所有連接策略都不會按照您描述為不受歡迎的順序回傳結果集。但我不會依賴它:優化器通常會找到一種令人驚訝的方式來處理查詢。
拯救自己的愿望ORDER BY通常來自優化處理速度的愿望。但是正確性比速度更重要,PostgreSQL 經常可以找到一種方法以所需的順序回傳結果,而無需顯式排序。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/519440.html
下一篇:如何選擇最小日期而不是最大日期
