日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

CREATE INDEX

CREATE INDEX在指定關系的指定列上構建一個索引。

簡介

CREATE INDEX在指定關系的指定列上構建一個索引,該關系可以是一個表或者一個物化視圖。索引主要被用來提升數據庫性能(不過不當的使用會導致性能變差)。

索引的鍵域被指定為列名或者寫在圓括號中的表達式。如果索引方法支持多列索引,可以指定多個域。

一個索引域可以是一個從表行的一列或者更多列值進行計算的表達式。 這種特性可以被用來獲得對基于基本數據某種變換的數據的快速訪問。 例如,一個在upper(col)上計算的索引可以允許子句 WHERE upper(col) = 'JIM'使用索引。

PolarDB提供了索引方法 B-樹、哈希、GiST、SP-GiST、GIN 以及 BRIN。用戶也可以定義自己的索引方法,但是相對較復雜。

WHERE子句存在時,會創建一個 部分索引。部分索引只包含表中一部分行的項, 通常索引這一部分會比表的其他部分更有用。例如,如果有一個表包含了已付和未付訂單,其中未付訂單占了整個表的一小部分并且是經常被使用的部分,可以通過只在這一部分上創建一個索引來改進性能。另一種可能的應用是使用帶有UNIQUEWHERE在表的一個子集上強制唯一性。

WHERE子句中使用的表達式只能引用底層表的列,但它可以引用所有列而不僅僅是被索引的列。當前, WHERE中也禁止使用子查詢和聚集表達式。同樣的限制也適用于表達式索引中的表達式域。

所有在索引定義中使用的函數和操作符必須是“不可變的”, 就是說它們的結果必須僅依賴于它們的參數而不受外在因素(例如,另一個表的內容和當前的時間)的影響。這種限制確保了索引的行為是良定的。要在一個索引表達式或者WHERE子句中使用用戶定義的函數,記住在創建函數時把它標記為不可變。

語法

    CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [ IF NOT EXISTS ] name ] ON [ ONLY ] table_name [ USING method ]
        ( { column_name | ( expression ) } [ COLLATE collation ] [ opclass [ ( opclass_parameter = value [, ... ] ) ] ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] )
        [ INCLUDE ( column_name [, ...] ) ]
        [ WITH ( storage_parameter [= value] [, ... ] ) ]
        [ TABLESPACE tablespace_name ]
        [ WHERE predicate ]

參數

UNIQUE導致系統在索引被創建時(如果數據已經存在)或者加入數據時檢查重復值。會導致重復項的數據插入或者更新嘗試將會產生一個錯誤。

當唯一索引被應用在分區邊上時會有額外的限制,請參考 CREATE TABLE。

CONCURRENTLY當使用了這個選項時,PolarDB在構建索引時不會取得任何會阻止該表上并發插入、更新或者刪除的鎖。而標準的索引構建將會把表鎖住以阻止對表的寫(但不阻塞讀),這種鎖定會持續到索引創建完畢。在使用這個選項時有多個需要注意的地方 — 請參考并發構建索引。

對于臨時表,CREATE INDEX始終是非并發的,因為沒有其他會話可以訪問它們,并且創建非并發索引的成本更低。

IF NOT EXISTS如果一個同名關系已經存在則不要拋出錯誤。這種情況下會發出一個提示。 這并不保證現有的索引與將要創建的索引有任何相似。當 IF NOT EXISTS被指定時,需要指定索引名。

INCLUDE可選的INCLUDE子句指定一個列的列表,其中的列將被包括在索引中作為非鍵列。非鍵列不能作為索引掃描的條件,并且該索引所強制的任何唯一性或者排除約束都不會考慮它們。不過,只用索引的掃描可以返回非鍵列的內容而無需訪問該索引的基表,因為在索引項中就能直接拿到它們。因此,非鍵列的增加允許查詢使用只用索引的掃描,否則就無法使用。

保守地向索引中增加非鍵列是明智的,特別是很寬的列。如果一個索引元組超過索引類型允許的最大尺寸,數據插入將會失敗。在任何情況下,非鍵列都會重復來自索引基表的數據并且讓索引的尺寸膨脹,因此可能會拖慢搜索。此外,B 樹重復數據刪除永遠不會與具有非關鍵列的索引一起使用。

INCLUDE子句中列出的列不需要合適的操作符類,甚至數據類型沒有為給定的訪問方法定義操作符類的列都可以包括在這個子句中。

不支持把表達式作為被包括列,因為它們不能被用在只用索引的掃描中。

當前,有 B-樹和 GiST 索引訪問方法支持這一特性。在 B-樹和 GiST 索引中,INCLUDE子句中列出的列的值被包括在對應于堆元組的葉子元組中,但是不包括在用于樹導航的上層索引項中。

name要創建的索引名稱。這里不能包括模式名,因為索引總是被創建在其基表所在的模式中。如果索引名稱被省略,PolarDB將基于基表名稱和被索引列名稱選擇一個合適的名稱。

ONLY如果該表是分區表,指示不要在分區上遞歸創建索引。默認會遞歸創建索引。

table_name要被索引的表的名稱(可以被模式限定)。

method要使用的索引方法的名稱。可以選擇 btreehashgistspgistgin以及brin。 默認方法是btree

column_name一個表列的名稱。

expression一個基于一個或者更多個表列的表達式。如語法中所示,表達式通常必須被寫在圓括號中。不過,如果該表達式是一個函數調用的形式,圓括號可以被省略。

collation要用于該索引的排序規則的名稱。默認情況下,該索引使用被索引列的排序規則或者被索引表達式的結果排序規則。當查詢涉及到使用非默認排序規則的表達式時,使用非默認排序規則的索引就能派上用場。

opclass一個操作符類的名稱。詳見下文。

opclass_parameter運算符類參數的名稱。詳情請見下文。

ASC指定上升排序(默認)。

DESC指定下降排序。

NULLS FIRST指定把空值排序在非空值前面。在指定DESC時, 這是默認行為。

NULLS LAST指定把空值排序在非空值后面。在沒有指定DESC時, 這是默認行為。

storage_parameter索引方法相關的存儲參數的名稱。詳見索引存儲參數。

tablespace_name在其中創建索引的表空間。如果沒有指定,將會使用 default_tablespac。或者對臨時表上的索引使用 temp_tablespaces。

predicate部分索引的約束表達式。

索引存儲參數

可選的WITH子句為索引指定存儲參數。每一種索引方法都有自己的存儲參數集合。B-樹、哈希、GiST 以及 SP-GiST 索引方法都接受這個參數:

fillfactor (integer) 索引的填充因子是一個百分數,它決定索引方法將嘗試填充索引頁面的充滿程度。對于 B-樹,在初始的索引構建過程中,葉子頁面會被填充至該百分數,當在索引右端擴展索引(增加新的最大鍵值)時也會這樣處理。如果頁面后來被完全填滿,它們就會被分裂,導致索引的效率逐漸退化。B-樹使用了默認的填充因子 90,但是也可以選擇為 10 到 100 的任何整數值。如果表是靜態的,那么填充因子 100 是最好的,因為它可以讓索引的物理尺寸最小化。但是對于更新負荷很重的表,較小的填充因子有利于最小化對頁面分裂的需求。其他索引方法以不同但是大致類似的方式使用填充因子,不同方法的默認填充因子也不相同。

B-樹索引還接受這些參數:

deduplicate_items (boolean) 控制 B 樹重復數據刪除技術的使用,設置為 ONOFF以啟用或禁用優化。 默認值為ON.

說明

通過ALTER INDEX關閉deduplicate_items 可以防止將來的插入觸發重復數據刪除,但本身不會使現有的發布列表元組使用標準的元組表示。

vacuum_cleanup_index_scale_factor (floating point) vacuum_cleanup_index_scale_factor 針對每個索引的值。

GiST 還額外接受這個參數:

buffering (enum) 決定是否用緩沖構建技術來構建索引。OFF會禁用它,ON則啟用該特性,如果設置為AUTO則初始會禁用它,但是一旦索引尺寸到達 effective_cache_size 就會隨時打開。默認值是AUTO

GIN 索引接受不同的參數:

fastupdate (boolean) 這個設置控制快速更新技術的使用,它是一個布爾參數:ON啟用快速更新, OFF禁用。默認是 ON

通過ALTER INDEX關閉fastupdate 會阻止未來的更新進入到待處理索引項列表中,但它不會自己處理之前的待處理項。可以使用VACUUM或者調用 gin_clean_pending_list確保處理完待處理列表的項。

gin_pending_list_limit (integer) 自定義 gin_pending_list_limit 參數。這個值要以千字節來指定。

BRIN 索引接受不同的參數:

pages_per_range (integer) 定義用于每一個 BRIN 索引項的塊范圍由多少個表塊組成。默認是128

autosummarize (boolean) 定義是否只要在下一個頁面上檢測到插入就為前面的頁面范圍運行概要操作。

并發構建索引

創建索引可能會干擾數據庫的常規操作。通常 PolarDB會鎖住要被索引的表,讓它不能被寫入, 并且用該表上的一次掃描來執行整個索引的構建。其他事務仍然可以讀取表 , 但是如果它們嘗試在該表上進行插入、更新或者刪除,它們會被阻塞直到索引構建完成。如果系統是一個生產數據庫,這可能會導致嚴重的后果。索引非常大的表可能會需要很多個小時,而且即使是較小的表,在構建索引過程中阻塞寫入這一段時間在生產系統中也是不能接受的。

PolarDB支持構建索引時不阻塞寫入。這種方法通過指定CREATE INDEXCONCURRENTLY選項實現。當使用這個選項時,PolarDB必須執行該表的兩次掃描,此外它必須等待所有現有可能會修改或者使用該索引的事務終止。因此這種方法比起標準索引構建過程來說要做更多工作并且需要更多時間。不過,由于它允許在構建索引時繼續普通操作,這種方式對于在生產環境中增加新索引很有用。 當然,由索引創建帶來的額外 CPU 和 I/O 開銷可能會拖慢其他操作。

在并發索引構建中,索引實際上在一個事務中被錄入到系統目錄,然后在兩個事務中發生兩次表掃描。在每一次表掃描之前,索引構建必須等待已經修改了表的現有事務終止。在第二次掃描之后,索引構建必須等待任何持有早于第二次掃描的快照的事務終止。然后該索引最終能被標記為準備好使用,并且CREATE INDEX命令終止。 不過即便那樣,該索引也不是立刻可以用于查詢:在最壞的情況下,只要早于索引構建開始時存在的事務存在,該索引就無法使用。

如果在掃描表示出現問題,例如死鎖或者唯一索引中的唯一性被違背, CREATE INDEX將會失敗,但留下一個“不可用” 的索引。這個索引會被查詢所忽略,因為它可能不完整。不過它仍將消耗更新開銷。psql的\d命令將把這類索引報告為 INVALID

    postgres=# \d tab
           Table "public.tab"
     Column |  Type   | Collation | Nullable | Default
    --------+---------+-----------+----------+---------
     col    | integer |           |          |
    Indexes:
        "idx" btree (col) INVALID

這種情況下推薦的恢復方法是刪除該索引并且嘗試再次執行CREATE INDEX CONCURRENTLY。 (另一種可能性是用REINDEX INDEX CONCURRENTLY重建該索引)。

并發構建一個唯一索引時需要注意的另一點是,當第二次表掃描開始時,唯一約束已經被強制在其他事務上。這意味著在該索引變得可用之前,其他查詢中可能就會報告該約束被違背,或者甚至在索引構建最終失敗的情況中也是這樣。還有,如果在第二次掃描時發生失敗,“無效的”索引也會繼續強制它的唯一性約束。

表達式索引和部分索引的并發構建也被支持。在這些表達式計算過程中發生的錯誤可能導致和上述唯一約束違背類似的行為。

常規索引構建允許在同一個表上同時構建其他常規索引,但是在一個表上同時只能有一個并發索引構建發生。在兩種情況下,在索引被構建時不允許表的模式修改。另一個不同是,一個常規CREATE INDEX 命令可以在一個事務塊中執行,但是 CREATE INDEX CONCURRENTLY不行。

當前不支持在分區表上并發生成索引。 然而,你可以在每個分區上單獨的并發構建索引,然后最終以非并發的方式創建分區索引,以減少對分區表的寫入被鎖定的時間。 在這種情況下,生成分區索引僅是元數據操作。

說明

當前,只有 B-樹、GiST、GIN 和 BRIN 索引方法支持多列索引。默認最多可以索引 32 個域(可以在構建 PolarDB中修改這種限制)。當前只有 B-樹支持唯一索引。

為索引的每一列可以指定一個帶可選參數的操作符類。該操作符類標識要被該索引用于該列的操作符。例如,一個四字節整數上的 B-樹索引會使用int4_ops類。這個操作符類包括了用于四字節整數的比較函數。實際上,通常列數據類型的默認操作符類就足夠了。對某些數據類型指定操作符類的主要原因是,可能會有多于一種有意義的順序。例如, 我們可能想用絕對值或者實數部分對復數類型排序。我們可以通過為該數據類型定義兩個操作符類來做到,并且在創建索引時選擇其中合適的類。

當在一個分區表上調用CREATE INDEX時,默認的行為是遞歸到所有的分區上以確保它們都具有匹配的索引。每一個分區首先會被檢查是否有一個等效的索引存在,如果有則該索引將被掛接為被創建索引的一個分區索引,而被創建的索引將成為其父索引。如果不存在匹配的索引,則會創建一個新的索引并且自動進行掛接。如果命令中沒有指定索引名稱,每個分區中的新索引的名稱將被自動決定。如果指定了ONLY選項,則不會進行遞歸,并且該索引會被標記為無效(一旦所有的分區都得到該索引,ALTER INDEX ... ATTACH PARTITION可以把該索引標記為有效)。不過,要注意不管是否指定這一選項,未來使用CREATE TABLE ... PARTITION OF創建的任何分區將自動有一個匹配的索引,不管有沒有指定ONLY

對于支持有序掃描的索引方法(當前只有 B-樹),可以指定可選子句ASCDESCNULLS FIRST以及NULLS LAST 來修改索引的排序順序。由于一個有序索引能前向或者反向掃描,通常創建一個單列DESC索引沒什么用處 — 一個常規索引已經提供了排序順序。這些選項的價值是可以創建多列索引,讓它的排序順序匹配有混合排序要求的查詢,例如SELECT ... ORDER BY x ASC, y DESC。如果你想要在依靠索引避免排序步驟的查詢中支持 “空值排序低”這種行為,NULLS選項就能派上用場,默認的行為是“空值排序高”。

對于大多數索引方法,索引的創建速度取決于 maintenance_work_mem 的設置。較大的值將會減少索引創建所需的時間,當然不要把它設置得超過實際可用的內存量(那會迫使機器進行交換)。

PolarDB可以在構建索引時利用多個 CPU 以更快地處理表行。這種特性被稱為并行索引構建。對于支持并行構建索引的索引方法(當前只有 B-樹),maintenance_work_mem指定每次索引構建操作整體可用的最大內存量,而不管啟動了多少工作者進程。一般來說,一個代價模型(如果有)自動判斷應該請求多少工作者進程。

增加maintenance_work_mem可以讓并行索引構建受益,而等效的串行索引構建將無法受益或者得到很小的益處。注意maintenance_work_mem可能會影響請求的工作者進程的數量,因為并行工作者必須在總的maintenance_work_mem預算中占有至少32MB的份額。還必須有32MB的份額留給領袖進程。增加 max_parallel_maintenance_workers 可以允許使用更多的工作者,這將降低索引創建所需的時間,只要索引構建不是 I/O 密集型的。當然,還需要有足夠的 CPU 計算能力,否則工作者們會閑置。

通過 ALTER TABLE 為parallel_workers設置一個值直接控制著CREATE INDEX會對表請求多少并行工作者進程。這會完全繞過代價模型,并且防止maintenance_work_mem對請求多少并行工作者產生影響。通過ALTER TABLEparallel_workers設置為 0 將禁用所有情況下的并行索引構建。

在把parallel_workers用于調優一次索引構建之后,你可能想要重置parallel_workers。這可以避免對查詢計劃的無意更改,因為parallel_workers影響所有的并行表掃描。

雖然帶有CONCURRENTLY選項的CREATE INDEX支持并行構建并且沒有特殊的限制,但只有第一次表掃描會實際以并行方式執行。

使用 DROP INDEX 可以移除一個索引。

以前的PolarDB發行也有一種 R-樹索引方法。這種方法已經被移除,因為它比起 GiST 方法來說沒有什么明顯的優勢。如果指定了USING rtreeCREATE INDEX 將會把它解釋為USING gist,以便把舊的數據庫轉換成 GiST。

示例

在表films中的列title上創建一個 B-樹索引:

    CREATE UNIQUE INDEX title_idx ON films (title);

在表films的列title上創建一個唯一的 B-樹索引并且包括列directorrating

    CREATE UNIQUE INDEX title_idx ON films (title) INCLUDE (director, rating);

創建禁用重復數據刪除的 B 樹索引:

    CREATE INDEX title_idx ON films (title) WITH (deduplicate_items = off);

在表達式lower(title)上創建一個索引來允許高效的大小寫無關搜索:

    CREATE INDEX ON films ((lower(title)));
說明

在這個例子中我們選擇省略索引名稱,這樣系統會選擇一個名字, 通常是films_lower_idx

創建一個具有非默認排序規則的索引:

    CREATE INDEX title_idx_german ON films (title COLLATE "de_DE");

創建一個具有非默認空值排序順序的索引:

    CREATE INDEX title_idx_nulls_low ON films (title NULLS FIRST);

創建一個具有非默認填充因子的索引:

    CREATE UNIQUE INDEX title_idx ON films (title) WITH (fillfactor = 70);

創建一個禁用快速更新的 GIN 索引:

    CREATE INDEX gin_idx ON documents_table USING GIN (locations) WITH (fastupdate = off);

在表films中的列code上創建一個索引并且把索引放在表空間indexspace中:

    CREATE INDEX code_idx ON films (code) TABLESPACE indexspace;

在一個點屬性上創建一個 GiST 索引,這樣我們可以在轉換函數的結果上有效地使用 box 操作符:

    CREATE INDEX pointloc
        ON points USING gist (box(location,location));
    SELECT * FROM points
        WHERE box(location,location) && '(0,0),(1,1)'::box;

創建一個表而不排斥對表的寫操作:

    CREATE INDEX CONCURRENTLY sales_quantity_index ON sales_table (quantity);