欧美成人精品手机在线观看_69视频国产_动漫精品第一页_日韩中文字幕网 - 日本欧美一区二区

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

PostgreSQL:復(fù)合索引和多個(gè)索引哪個(gè)好?

admin
2025年1月16日 9:55 本文熱度 103

在 PostgreSQL 中創(chuàng)建索引時(shí),為每個(gè)列創(chuàng)建一個(gè)索引更好,還是為 WHERE 子句的所有列創(chuàng)建一個(gè)復(fù)合索引更好?

復(fù)合索引和多個(gè)索引

關(guān)于索引的使用,有一個(gè)最常見問題:是為每個(gè)列創(chuàng)建一個(gè)索引更好,還是為WHERE子句的所有列創(chuàng)建一個(gè)索引更好?在大多數(shù)情況下,答案非常簡單:一個(gè)包含多個(gè)列的索引會(huì)更好,即多列索引或復(fù)合索引。多列索引 的文檔中有詳細(xì)的解釋。

然而,無論您如何定義索引,都存在單個(gè)索引無法完美完成的查詢;例如,帶有兩個(gè)或多個(gè)獨(dú)立范圍條件的查詢,如下例所示:

SELECT first_name, last_name, date_of_birth
  FROM employees
 WHERE UPPER(last_name) < ?
   AND date_of_birth    < ?

在沒有過濾謂詞的情況下,不可能定義出支持此查詢的 B 樹索引。為了解釋,你只需要記住一個(gè)索引就是一個(gè)鏈表。

如果將索引定義為UPPER(LAST_NAME), DATE_OF_BIRTH(按此順序),則鏈表以 A 開頭,以 Z 結(jié)尾。僅當(dāng)有兩名員工同名時(shí),才會(huì)考慮出生日期。如果以DATE_OF_BIRTH, UPPER(LAST_NAME)的方式定義索引,它將從最年長的員工開始,以最年輕的員工結(jié)束。在這種情況下,名稱對(duì)排序順序的影響很小。

無論您如何扭轉(zhuǎn)和調(diào)整索引的定義,條目始終沿一條鏈排列。小的條目在一端,大的條目在另一端。因此,一個(gè)索引只能支持一個(gè)范圍條件作為訪問謂詞。支持兩個(gè)獨(dú)立的范圍條件需要第二個(gè)軸線,比如像一個(gè)棋盤。然后,上面的查詢將匹配來自棋盤一角的所有條目,但索引不像一個(gè)棋盤 — 它就像一條鏈。沒有角落。

當(dāng)然,您可以接受過濾謂詞,并使用多列索引。不管怎樣,在許多情況下,這是最好的解決方案。然后,索引的定義應(yīng)該首先提及選擇率更高的列,以便它可以同訪問謂詞一起使用。每次創(chuàng)建一個(gè)復(fù)合索引時(shí),都必須明智地選擇列的順序。但是,有一種誤解是,您應(yīng)該始終將選擇率最高的列放在第一個(gè)位置;那是錯(cuò)誤的。

重要:在定義一個(gè)復(fù)合索引時(shí),最重要的考慮點(diǎn)是如何選擇列的順序,以便可以盡可能頻繁地使用它。

另一種選擇是使用兩個(gè)單獨(dú)的索引,每個(gè)列一個(gè)。然后,數(shù)據(jù)庫必須首先掃描這兩個(gè)索引,然后合并結(jié)果。只是重復(fù)的索引查找,就已經(jīng)涉及更多的工作了,因?yàn)閿?shù)據(jù)庫必須遍歷兩個(gè)索引樹。此外,數(shù)據(jù)庫需要大量內(nèi)存和 CPU 時(shí)間,來組合中間結(jié)果。

注意:一個(gè)索引的掃描比兩個(gè)索引的掃描要快。

組合多個(gè)索引

PostgreSQL 能夠組合多個(gè)索引,來處理單個(gè)索引掃描無法實(shí)現(xiàn)的情況。組合多個(gè)索引 的文檔中詳細(xì)解釋了相關(guān)的算法。

在一個(gè)數(shù)據(jù)倉庫的世界中,會(huì)有許多不可預(yù)測(cè)的臨時(shí)查詢。只需單擊幾下,即可將任意條件組合到您選擇的查詢中。無法預(yù)測(cè)出WHERE子句中可能出現(xiàn)的列的組合,這使得索引的使用幾乎不可能。

多個(gè)索引的優(yōu)點(diǎn)是,它們可以很容易地組合。這意味著在單獨(dú)地索引每個(gè)列時(shí),您可以獲得不錯(cuò)的性能。相反,如果您提前知道查詢,以便您可以創(chuàng)建定制的多列 B 樹索引,則它仍然會(huì)比組合多個(gè)索引更快。

在沒有更好的訪問路徑的情況下,PostgreSQL 會(huì)將多個(gè) B 樹索引掃描的結(jié)果轉(zhuǎn)換為內(nèi)存中的位圖結(jié)構(gòu)。這些結(jié)果可以高效地組合起來。位圖結(jié)構(gòu)不是持久化存儲(chǔ)的,而會(huì)在語句執(zhí)行后被丟棄,從而避免了寫數(shù)據(jù)時(shí)擴(kuò)展性差的問題。缺點(diǎn)是它需要大量的內(nèi)存和 CPU 時(shí)間。畢竟,這種方法也算是優(yōu)化器最后的一種選擇了。


該文章在 2025/1/16 9:57:46 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲(chǔ)管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved