PostgreSQL 10.1 手册_部分 II. SQL 语言_第 11 章 索引_11.5. 组合多个索引
11.5.?組合多個索引
只有查詢子句中在索引列上使用了索引操作符類中的操作符并且通過AND連接時才能使用單一索引。例如,給定一個(a, b)?上的索引,查詢條件WHERE a = 5 AND b = 6可以使用該索引,而查詢WHERE a = 5 OR b = 6不能直接使用該索引。
幸運的是,PostgreSQL具有組合多個索引(包括多次使用同一個索引)的能力來處理那些不 能用單個索引掃描實現(xiàn)的情況。系統(tǒng)能在多個索引掃描之間安排AND和OR條件。例如,?WHERE x = 42 OR x = 47 OR x = 53 OR x = 99這樣一個查詢可以被分解成為四個獨立的在x上索引掃描,每一個掃描使用其中一個條件。這些查詢的結(jié)果將被“或”起來形成最后的結(jié)果。另一個例子是如果我們在x和y上都有獨立的索引,WHERE x = 5 AND y = 6這樣的查詢的一種可能的實現(xiàn)方式就是分別使用兩個索引配合相應(yīng)的條件,然后將結(jié)果“與”起來得到最后的結(jié)果行。
為了組合多個索引,系統(tǒng)掃描每一個所需的索引并在內(nèi)存中準(zhǔn)備一個位圖用于指示表中符合索引條件的行的位置。然后這些位圖會被根據(jù)查詢的需要“與”和“或”起來。最后,實際的表行將被訪問并返回。表行將被以物理順序訪問,因為位圖就是以這種順序布局的。這意味著原始索引中的任何排序都會被丟失,并且如果存在一個ORDER BY子句就需要一個單獨的排序步驟。由于這個原因以及每一個附加的索引都需要額外的時間,即使有額外的索引可用,規(guī)劃器有時也會選擇使用單一索引掃描。
在所有的應(yīng)用(除了最簡單的應(yīng)用)中,可能會有多種有用的索引組合,數(shù)據(jù)庫開發(fā)人員必須做出權(quán)衡以決定提供哪些索引。有時候多列索引最好,但是有時更好的選擇是創(chuàng)建單獨的索引并依賴于索引組合特性。例如,如果我們的查詢中有時只涉及到列x,有時候只涉及到列Y,還有時候會同時涉及到兩列,我們可以選擇在x和y上創(chuàng)建兩個獨立索引然后依賴索引組合來處理同時涉及到兩列的查詢。我們當(dāng)然也可以創(chuàng)建一個(x, y)上的多列索引。當(dāng)查詢同時涉及到兩列時,該索引會比組合索引效率更高,但是正如第?11.3?節(jié)中討論的,它在只涉及到y(tǒng)的查詢中幾乎完全無用,因此它不能是唯一的一個索引。一個多列索引和一個y上的獨立索引的組合將會工作得很好。多列索引可以用于那些只涉及到x的查詢,盡管它比x上的獨立索引更大且更慢。最后一種選擇是創(chuàng)建所有三個索引,但是這種選擇最適合表經(jīng)常被執(zhí)行所有三種查詢但是很少被更新的情況。如果其中一種查詢要明顯少于其他類型的查詢,我們可能需要只為常見類型的查詢創(chuàng)建兩個索引。
本文轉(zhuǎn)自PostgreSQL中文社區(qū),原文鏈接:11.5.?組合多個索引
總結(jié)
以上是生活随笔為你收集整理的PostgreSQL 10.1 手册_部分 II. SQL 语言_第 11 章 索引_11.5. 组合多个索引的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PostgreSQL 10.1 手册_部
- 下一篇: 综合学生信息管理系统(JSP+JDBC)