Index

減少查詢的頁面訪問

  • March 29, 2019

假設我們有一個表中屬性的二級索引,並且我們希望對該屬性執行範圍查詢。推荐一種可能的方法來減少此查詢的頁面訪問次數。

這是來自我的高級數據庫課程。

範圍查詢將從包含範圍內數據的每個索引頁面中讀取(加上幾個非葉頁面以查找範圍的開頭),因此要減少所觸及的頁面數量,您需要確保有盡可能多的行盡可能擠進每一頁。這可以通過簡單地讓索引不覆蓋或包含除該列之外的任何內容來實現。

僅當僅觸及該列時,這才是絕對正確的:對於諸如SELECT col1 FROM theTable WHERE col1 BETWEEN 4000 AND 9000or之類的查詢SELECT COUNT(*) FROM theTable WHERE col1 BETWEEN 4000 AND 9000

當考慮任何更複雜的事情時,它就不那麼明確了。在通過索引覆蓋和(或一個覆蓋和ing )SELECT col1, col2 FROM theTable WHERE col1 BETWEEN 4000 AND 9000減少頁面讀取方面可能會更好,因為否則需要讀取額外的頁面才能從.col1``col2``col1``INCLUDE``col2``col2

如果您從表中選擇所有或大部分列,並且您的數據庫引擎支持聚集索引$$ 1 $$或類似的$$ 2 $$,那麼這將是減少此類查詢的頁面訪問的最佳方法。在這種情況下,您將偏離將主鍵作為聚集鍵的預設做法,因為顯而易見的原因,您只能擁有一個聚集索引。如果不支持集群,或者您希望表上的一個集群索引用於其他內容,那麼您需要再次使用覆蓋範圍廣的索引或INCLUDE所有其他列的索引。儘管在後一種情況下要小心,您不會浪費空間並影響寫入性能,因為索引很寬,實際上並不需要。

$$ 1 $$在 SQL Server 中直接稱為聚集索引,Oracle 所說的“索引組織表”與 SQL Server 中具有聚集索引的表相同

$$ 2 $$postgres 允許您使用CLUSTER命令重新組織表索引順序

引用自:https://dba.stackexchange.com/questions/233479