?
本文檔使用 php中文網(wǎng)手冊 發(fā)布
每個索引訪問方法都在系統(tǒng)表pg_am里面用 一行來描述(參閱Section 45.3)。一個 pg_proc 行的主要內(nèi)容是引用pg_proc里面的記錄,用來標(biāo)識索引訪問方法提供的索引 訪問函數(shù)。這些函數(shù)的接口(API)在本章后面描述。另外,pg_am的數(shù)據(jù)行生命了幾個索引訪問方法的固定屬性,比如,它是否 支持多字段索引。目前還沒有創(chuàng)建、刪除pg_am 記錄的特殊支持;任何想寫這么一個新的訪問方法的人都需要能夠自己向這個 表里面插入合適的新行。
要想有真正用處,一個索引訪問方法還必須有一個或多個 操作符類,定義在pg_opclass,pg_amop,pg_amproc 里面。這些記錄允許規(guī)劃器判斷哪些查 詢的條件可以適用于用這個索引訪問方法創(chuàng)建的索引。操作符類在Section 35.14里面定義,是讀取本章的前提之一。
一個獨立的索引是由一行pg_class記錄以物理關(guān)系的方式描述的,加上一個 pg_index行,表示該索引的邏輯內(nèi)容 —也就是說,它所擁有的索引字段集,以 及被相關(guān)的操作符類捕獲的這些字段的語義。索引字段(鍵值)可以是下層表的 字段,也可以是該表的數(shù)據(jù)哈工上的表達式。索引訪問方法通常不關(guān)心索引的 鍵值來自何妨(它總是操作預(yù)處理完畢的鍵值),但是它會對 pg_index 里面的操作符類信息很感興趣。所有這些表記錄都可 以當(dāng)作(Relation)數(shù)據(jù)結(jié)構(gòu)的一部分訪問,這個數(shù)據(jù)結(jié)構(gòu)會在 對該索引的所有操作上都傳遞到對應(yīng)的函數(shù)中。
pg_am 中的有些標(biāo)志字段的含義并不那么直觀。 amcanunique 的需求在Section 51.5里討論過, amcanmulticol標(biāo)志斷言該索引訪問方法支持多字段索引, amoptionalkey 斷言它允許對那種在第一個索引 字段上沒有給出可索引限制子句的掃描。如果 amcanmulticol為假,那么 amoptionalkey實際 上說的是該訪問方法是否允許不帶限制子句的全索引掃描。 那些支持多字段索引的訪問訪法必須支持那些在省略了除第一個字段以外的其它 字段的約束的掃描;不過,系統(tǒng)允許這些訪問訪法要求在第一個字段上出現(xiàn)一些 限制,這一點是通過把amoptionalkey設(shè)置為假 來實現(xiàn)的。amindexnulls斷言該索引記錄是為 NULL鍵值創(chuàng)建的。 因為大多數(shù)可以索引的操作符都是嚴(yán)格的,因此不能對NULL輸入返回TRUE, 所以,第一眼看見會覺得不為NULL存儲索引記錄的想法很吸引人:因為他們不 可能被一個索引掃描返回。不過,這個想法在一個給出的索引字段上沒有限制子 句的索引掃描的情況下就不行了;這樣的掃描應(yīng)該包括NULL行。實際上,這意 味著設(shè)置了amoptionalkey為真的索引必須索引 NULL,因為規(guī)劃器可能會決定在根本沒有掃描鍵字的時候使用這樣的索引。這 樣的索引必須可以在完全沒有掃描鍵字的情況下運行。另外一個限制是一個支持 多字段索引的索引訪問方法必須支持第一個字段后面的字段的NULL的索引,因 為規(guī)劃器會認為這個索引可以用于那些沒有限制這些字段的查詢。比如,假設(shè)有 個索引在(a,b)上,而一個查詢的條件是WHERE a = 4。 系統(tǒng)會認為這個索引可以用于掃描 a = 4的數(shù)據(jù)行, 如果索引忽略了 b 為空的數(shù)據(jù)行,那么就是錯誤的。不過,如果第一個索引字段 值是空,那么忽略它是 OK 的。因此,只是在索引訪問方法索引了所有行,包括 任意NULL的組合,之后,amindexnulls才可以 設(shè)置為真值。 指向amindexnulls的一個變址存取方法 也會指向amsearchnulls,這表示它支持設(shè)置 為空和不為空子句為搜索條件。