排序是非常耗資源的操作。它需要相當多的 CPU 時間,但主要問題在於資料庫必須暫時緩衝結果:排序操作得讀完完整輸入,才能產出第一筆輸出。

索引本身就是預先排好的#

索引提供被索引資料的有序表示(第 1 章已述),我們也可以說索引以預排序的形式儲存資料——它的排序方式,恰恰就像把索引定義寫進 order by 子句一樣。因此,用索引來免去 order by 所需的排序操作並不令人意外。

諷刺的是,INDEX RANGE SCAN 在大型資料集上同樣會變得沒效率——尤其後面跟著資料表存取時,這可能抵消掉省下排序的收益。此時「全表掃描 + 明確排序」甚至可能更快。評估各種計畫並選出最好的,依然是最佳化工具的職責。

第三威力:管線化的 ORDER BY#

不過索引化的 order by 不只省下排序功夫,它還能在尚未處理完所有輸入資料時就回傳最初的結果——也就是說,order by 是以管線化方式執行的。

第 7 章「部分結果」會說明如何利用管線化執行實作高效的分頁查詢。這讓管線化 order by 如此重要,以至於作者稱它為索引的第三威力

本章說明如何用索引達成管線化的 order by 執行。為此我們要特別留意它與 where 子句的交互作用,以及 ASC / DESC 修飾詞的影響;最後再把同樣的技巧套用到 group by 子句。