1、創(chuàng)建索引
CREATE INDEX emp_ename_index ON emp(ename)? TABLESPACE users_space;
2浓领、創(chuàng)建唯一索引
索引可以是唯一的玉凯,也可以是非唯一的。唯一索引保證表中沒有兩行在鍵列中有重復(fù)的值联贩。非惟一索引則不會對列值施加此限制漫仆。使用CREATE UNIQUE INDEX語句創(chuàng)建一個唯一索引。下面的例子會為dept表的ename列創(chuàng)建唯一索引dept_unique_index:
CREATE UNIQUE INDEX dept_unique_index ON dept (dname)? ? ? TABLESPACE users_space;
當(dāng)一個索引被聲明為唯一時泪幌,索引中不允許多個表行具有相同的索引值盲厌。空值被視為不相同(除非創(chuàng)建索引時指定了NULLS NOT DISTINCT 子句)祸泪。一個多列唯一索引將會拒絕在所有索引列上具有相同組合值的表行吗浩。
KingbaseES會自動為定義了一個唯一約束或主鍵的表創(chuàng)建一個唯一索引。該索引包含組成主鍵或唯一約束的所有列(可能是一個多列索引)没隘,它也是用于強制這些約束的機制懂扼。
說明:當(dāng)前,只有B-tree能夠被聲明為唯一右蒲。
3阀湿、創(chuàng)建指定順序的B樹索引??
一個索引可能還需要將它們以指定的順序傳遞。這使得查詢中的ORDER BY不需要獨立的排序步驟瑰妄。默認(rèn)情況下陷嘴,CREATE INDEX命令創(chuàng)建適合于大部分情況的B-tree索引。如下列命令可以用來在表test上的id列上創(chuàng)建一個索引:
CREATE INDEX test_id_index ON test (id);
索引的名字test_id_index可以自由選擇翰撑,但最好選擇一個有相關(guān)性罩旋、能讓用戶想起該索引用途的名字。 在KingbaseES當(dāng)前支持的索引類型中眶诈,只有B-tree可以產(chǎn)生排序后的輸出涨醋,其他索引類型會把行以一種沒有指定的且與實現(xiàn)相關(guān)的順序返回。 B-tree索引默認(rèn)將表項以升序方式存儲逝撬,并將空值放在最后 (在其他相等的項之間浴骂,表TID被視為平分符列)。我們可以在創(chuàng)建B-tree索引時通過下列選項來改變索引的排序
ASC宪潮,指定上升排序(默認(rèn))溯警。
DESC,指定下降排序狡相。
NULLS FIRST梯轻,指定把空值排序在非空值前面。在指定DESC時尽棕, 這是默認(rèn)行為喳挑。
NULLS LAST,指定把空值排序在非空值后面滔悉。在沒有指定DESC時伊诵, 這是默認(rèn)行為。
那么典型的示例就是:
CREATE INDEX test2_info_nulls_low ON test2 (info NULLS FIRST);CREATE INDEX test3_desc_index ON test3 (id DESC NULLS LAST);
4回官、創(chuàng)建hash索引
Hash索引只能處理簡單等值比較曹宴。不論何時當(dāng)一個索引列涉及到一個使用了=操作符的比較時,查詢規(guī)劃器將考慮使用一個Hash索引歉提。下面的命令將創(chuàng)建一個Hash索引:
CREATE INDEX name ON table USING HASH (column);
5笛坦、創(chuàng)建函數(shù)索引
基于函數(shù)的索引時將索引建立在某個函數(shù)或者表達(dá)式的基礎(chǔ)上。一個索引列并不一定是底層表的一個列唯袄,也可以是從表的一列或多列計算而來的一個函數(shù)或者標(biāo)量表達(dá)式弯屈。這種特性對于根據(jù)計算結(jié)果快速獲取表中內(nèi)容是有用的。
有一些查詢恋拷,需要對表的列進(jìn)行計算资厉,此時就適合創(chuàng)建基于函數(shù)的索引。例如蔬顾,一種進(jìn)行大小寫不敏感比較的常用方法是使用lower函數(shù):
SELECT * FROM test1 WHERE lower(col1) = 'value';
由于col1沒有索引宴偿,在執(zhí)行語句時就需要先把列的值修改為小寫,再和value進(jìn)行匹配诀豁。為了加快速度窄刘,可以再col1列上創(chuàng)建索引,先對該列的值進(jìn)行小寫轉(zhuǎn)換舷胜,然后再把索引存儲在索引中娩践,這樣執(zhí)行查詢時就不再需要轉(zhuǎn)換。函數(shù)結(jié)果之上的索引:
CREATE INDEX test1_lower_col1_idx ON test1 (lower(col1));
如果我們將該索引聲明為UNIQUE,它將阻止創(chuàng)建在col1值上只有大小寫不同的行
6翻伺、創(chuàng)建多列索引
一個索引可以定義在表的多個列上材泄。
例如,我們有這樣一個表:
CREATE TABLE test2(? major int,? minor int,? name varchar);
如果我們經(jīng)常根據(jù)多列的相交(通常為多個and操作)或者聯(lián)合(通常為多個or操作)操作做查詢時吨岭,例如從表test2中查詢major和minor均為常量constant的name信息:
SELECT name FROM test2 WHERE major = constant AND minor = constant;
那么我們可以在major和minor上定義一個多列索引:
CREATE INDEX test2_mm_idx ON test2 (major, minor);
相比于在每個列上創(chuàng)建索引拉宗,多列索引占用的磁盤相對更少,索引數(shù)據(jù)更新時也將更快辣辫。目前旦事,只有 B-tree、Bitmap急灭、GiST姐浮、GIN 和 BRIN 索引類型支持多列索引,最多可以指定512個列葬馋。
6单料、修改或重建索引
通過ALTER INDEX或者REINDEX語句,可以實現(xiàn)修改索引的定義或者重建索引点楼。
可以實現(xiàn)如下功能:
更改索引的名稱
更改該索引的表空間為其他指定的表空間
把該索引標(biāo)記為依賴于擴展
把和主表有相同表結(jié)構(gòu)的主表變成該主表的一個分區(qū)
更改一個或者多個索引相關(guān)的存儲參數(shù)
重置存儲參數(shù)為默認(rèn)值
為索引設(shè)置統(tǒng)計信息收集目標(biāo)
重建索引
注意
不能更改索引列結(jié)構(gòu)扫尖。
具體的修改索引典型示例如下:
重命名一個現(xiàn)有索引:
ALTER INDEX distributors RENAME TO new_distributors;
把一個索引移動到一個不同的表空間:
ALTER INDEX distributors SET TABLESPACE fasttablespace;
更改一個索引的填充因子(假設(shè)該索引方法支持填充因子):
ALTER INDEX distributors SET (fillfactor = 75);REINDEX INDEX distributors;
為一個表達(dá)式索引設(shè)置統(tǒng)計信息收集目標(biāo):
CREATE INDEX coord_idx ON measured (x, y, (z + t));
ALTER INDEX coord_idx ALTER COLUMN 3 SET STATISTICS 1000;
重建單個索引:
REINDEX INDEX my_index;
重建表my_table上的所有索引:
REINDEX TABLE my_table;
KingbaseES將重新構(gòu)建索引,而不采取任何鎖來防止表上的并發(fā)插入掠廓、更新或刪除:
REINDEX TABLE CONCURRENTLY my_broken_table;
7换怖、刪除索引
可以使用DROP INDEX語句刪除索引。要執(zhí)行這個命令你必須是該索引的擁有者蟀瞧。
刪除索引的一些原因包括:
不再需要該索引沉颂;
該索引未能實現(xiàn)預(yù)期的性能改進(jìn)。例如悦污,表可能非常兄搿;
應(yīng)用程序不使用索引來查詢數(shù)據(jù)切端;
索引已無效彻坛,必須在重新生成之前刪除該索引;
當(dāng)您刪除一個索引時踏枣,該索引的在表空間上的所有索引段將得到釋放昌屉。刪除索引主要有兩大類情況,如果使用CREATE INDEX語句顯式創(chuàng)建索引茵瀑,則可以用DROP INDEX語句刪除該索引间驮。 如下面的語句刪除emp_ename索引:
DROP INDEX emp_ename;
如果是通過在表上定義鍵約束隱式的創(chuàng)建索引。則不能直接刪除與已啟用的UNIQUE KEY鍵或PRIMARY KEY鍵約束相關(guān)的索引马昨。此情況竞帽,必須停用或刪除該約束本身扛施。 如下面的語句刪除主鍵約束pk_emp_name,同時刪除其對應(yīng)的索引:
ALTER TABLE emp DROP CONSTRAINT pk_emp_name;
當(dāng)然屹篓,刪除表也能實現(xiàn)刪除索引煮嫌,將自動刪除了所有與該表相關(guān)的索引。