按主鍵對大表進行排序並將其保存回來
所以我有一個帶有自動遞增主鍵列的大表(>5000 萬行),它由在多個核心上執行的腳本填充。現在,當我執行 a 時
SELECT
,條目會“亂序”返回,我猜這是表被多個程序並行填充的結果。我可以做一個
SELECT ... ORDER BY <primary key>
,但這個選擇比簡單的要花費更多的時間SELECT
。有沒有辦法按表的主鍵對錶進行排序並將其保存回來,而不會將所有行都載入到記憶體中?我在這裡找到了一個類似的問題,但我不能在不添加另一列的情況下將其應用到我的案例中,鑑於表格的大小,我不願意這樣做。
我正在執行 Firebird 超級伺服器
任何建議表示讚賞。
除非您使用 ORDER BY 指定排序,否則您永遠無法保證輸出的順序,即使您非常小心放置內容的順序。
我不熟悉 Firebird,但在許多數據庫中,差異可能是因為您的主鍵沒有被聚集,所以當使用 ORDER BY 時,它會按順序掃描索引,然後為每一行查找額外的數據堆,沒有顯式排序的版本只會掃描堆。使用聚集索引,索引和堆是一體的,因此不需要額外的工作。避免額外查找的另一種方法是將您需要的所有其他列包含在數據庫可以使用的索引中。但是,這並不節省空間,尤其是對於寬表。要查看掃描後查找是否是您的性能問題,請查看
SELECT <pk> FROM <table> ORDER BY <pk>
與其他時序測試的比較情況。以上假設您沒有其他過濾子句或連接,並且查詢計劃器不將大表視為主要表,這使事情變得複雜。如果你確實有這些,你應該提供更完整的查詢和表結構細節以獲得更好的幫助。添加 可能會
ORDER BY
強制執行更複雜的查詢,以便在按順序重新讀取之前將數據假離線到臨時表(可能在磁碟上)。索引使用提示可能有助於解決此類問題,但如果沒有查詢和結構的更多詳細資訊,我們無法更具體地說明這一點。