日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

要驗(yàn)證索引是否有效,不一定要馬上創(chuàng)建索引哦

來源: 責(zé)編: 時(shí)間:2024-03-28 09:24:17 172觀看
導(dǎo)讀 本文轉(zhuǎn)載自微信公眾號(hào)「 紅石PG」,作者紅石PG。介紹如果要檢查某些索引是否有助于一個(gè)或多個(gè)查詢,則 HypoPG 非常有用。因此,您應(yīng)該已經(jīng)知道需要優(yōu)化哪些查詢,以及要嘗試哪些索引。此外,HypoPG 將要?jiǎng)?chuàng)建的假設(shè)索引不會(huì)存
 本文轉(zhuǎn)載自微信公眾號(hào)「 紅石PG」,作者紅石PG。

介紹

如果要檢查某些索引是否有助于一個(gè)或多個(gè)查詢,則 HypoPG 非常有用。因此,您應(yīng)該已經(jīng)知道需要優(yōu)化哪些查詢,以及要嘗試哪些索引。loe28資訊網(wǎng)——每日最新資訊28at.com

此外,HypoPG 將要?jiǎng)?chuàng)建的假設(shè)索引不會(huì)存儲(chǔ)在任何系統(tǒng)表中,而是存儲(chǔ)在您連接的私有內(nèi)存中。因此,它不會(huì)使任何表出現(xiàn)膨脹,也不會(huì)影響任何并發(fā)連接。loe28資訊網(wǎng)——每日最新資訊28at.com

此外,由于假設(shè)索引實(shí)際上并不存在,因此 HypoPG 僅能確保在使用簡單的 EXPLAIN 語句(不帶 ANALYZE 選項(xiàng))時(shí)會(huì)使用它們。loe28資訊網(wǎng)——每日最新資訊28at.com

安裝擴(kuò)展

跟任何其他擴(kuò)展一樣,您必須將其安裝在希望能夠使用它的所有數(shù)據(jù)庫上。只需用一個(gè)有足夠權(quán)限的用戶,連接到要安裝 HypoPG 的數(shù)據(jù)庫上,執(zhí)行以下查詢即可完成:loe28資訊網(wǎng)——每日最新資訊28at.com

CREATE EXTENSION hypopg;

現(xiàn)在就可以使用 HypoPG 了。您可以使用 psql 輕松地檢查擴(kuò)展是否存在:loe28資訊網(wǎng)——每日最新資訊28at.com

/dx                     List of installed extensions  Name   | Version |   Schema   |             Description---------+---------+------------+------------------------------------- hypopg  | 1.1.0   | public     | Hypothetical indexes for PostgreSQL plpgsql | 1.0     | pg_catalog | PL/pgSQL procedural language(2 rows)

如您所見,已安裝了 hypopg 版本 1.1.0。如果需要使用純 SQL 進(jìn)行檢查,請(qǐng)參考 pg_extension 表文檔。loe28資訊網(wǎng)——每日最新資訊28at.com

配置

以下是可用的配置參數(shù)(GUC),并且可以交互式更改:loe28資訊網(wǎng)——每日最新資訊28at.com

? hypopg.enabled:默認(rèn)為on。使用此參數(shù)可全局啟用或禁用 HypoPG。禁用 HypoPG 后,任何假設(shè)索引都不會(huì)被使用,但不會(huì)刪除定義的假設(shè)索引。loe28資訊網(wǎng)——每日最新資訊28at.com

? hypopg.use_real_oids:默認(rèn)為off。默認(rèn)情況下,HypoPG 不會(huì)使用 “真實(shí)的” 對(duì)象標(biāo)識(shí)符,而是從 ~ 14000 / 16384(分別是低于 FirstNormalObjectId 的最低未使用的 oid 和 FirstNormalObjectId)范圍內(nèi)借用標(biāo)識(shí)符,這些標(biāo)識(shí)符由 PostgreSQL 保留,以備將來在未來的版本中使用。這不會(huì)造成任何問題,因?yàn)榭捎梅秶窃谶B接首次使用 HypoPG 時(shí)動(dòng)態(tài)計(jì)算的,并且還有可以應(yīng)用在備用服務(wù)器上的優(yōu)勢(shì)。但缺點(diǎn)是,您不能同時(shí)擁有大約 2500 個(gè)假設(shè)索引,并且一旦已經(jīng)創(chuàng)建了超出最多數(shù)目的對(duì)象,創(chuàng)建新的假設(shè)索引會(huì)變得非常慢,一直到hypopg_reset()被調(diào)用。如果這些缺點(diǎn)有問題,您可以啟用此參數(shù)。然后,HypoPG 將要求提供真實(shí)的對(duì)象標(biāo)識(shí)符,這將需要獲取更多鎖,并且不會(huì)在備用服務(wù)器工作,但允許使用所有可用的對(duì)象標(biāo)識(shí)符。請(qǐng)注意,切換此參數(shù)不需要重置已經(jīng)定義的假設(shè)索引,兩者可以同時(shí)共存。loe28資訊網(wǎng)——每日最新資訊28at.com

支持的訪問方式

支持以下訪問方式:loe28資訊網(wǎng)——每日最新資訊28at.com

? btreeloe28資訊網(wǎng)——每日最新資訊28at.com

? brinloe28資訊網(wǎng)——每日最新資訊28at.com

? hash(需要 PostgreSQL 10 或更高版本)loe28資訊網(wǎng)——每日最新資訊28at.com

? bloom(需要安裝 bloom 擴(kuò)展)loe28資訊網(wǎng)——每日最新資訊28at.com

創(chuàng)建假設(shè)索引

注意:使用 HypoPG 需要對(duì) EXPLAIN 命令有一定的了解。如果您需要有關(guān)此命令的更多信息,可以查看官方文檔。另外也還有很多非常好的資源。loe28資訊網(wǎng)——每日最新資訊28at.com

為了清楚起見,讓我們使用一個(gè)非常簡單的測(cè)試用例,看看它是如何工作的:loe28資訊網(wǎng)——每日最新資訊28at.com

CREATE TABLE hypo (id integer, val text);INSERT INTO hypo SELECT i, 'line ' || i FROM generate_series(1, 100000) i;VACUUM ANALYZE hypo;

此表沒有任何索引。假設(shè)我們要檢查索引是否有助于簡單的查詢。首先,讓我們看看它的表現(xiàn):loe28資訊網(wǎng)——每日最新資訊28at.com

EXPLAIN SELECT val FROM hypo WHERE id = 1;                       QUERY PLAN-------------------------------------------------------- Seq Scan on hypo  (cost=0.00..1791.00 rows=1 width=14)   Filter: (id = 1)(2 rows)

由于表上不存在索引,因此使用了普通的順序掃描。在 id 列上創(chuàng)建一個(gè)簡單 btree 索引,應(yīng)該有助于此查詢。讓我們來看看 HypoPG。函數(shù) hypopg_create_index() 可接受任何標(biāo)準(zhǔn)的 CREATE INDEX 語句(傳遞給此函數(shù)的任何其他語句都會(huì)被忽略),并為每個(gè)語句創(chuàng)建一個(gè)假設(shè)索引:loe28資訊網(wǎng)——每日最新資訊28at.com

SELECT * FROM hypopg_create_index('CREATE INDEX ON hypo (id)'); indexrelid |      indexname------------+----------------------      18284 | <18284>btree_hypo_id(1 row)

該函數(shù)返回兩列:loe28資訊網(wǎng)——每日最新資訊28at.com

? 假設(shè)索引的對(duì)象標(biāo)識(shí)符loe28資訊網(wǎng)——每日最新資訊28at.com

? 生成的假設(shè)索引名稱loe28資訊網(wǎng)——每日最新資訊28at.com

我們可以再次運(yùn)行 EXPLAIN,來查看 PostgreSQL 是否會(huì)使用這個(gè)索引:loe28資訊網(wǎng)——每日最新資訊28at.com

EXPLAIN SELECT val FROM hypo WHERE id = 1;                                    QUERY PLAN---------------------------------------------------------------------------------- Index Scan using <18284>btree_hypo_id on hypo  (cost=0.04..8.06 rows=1 width=10)   Index Cond: (id = 1)(2 rows)

是的,PostgreSQL 會(huì)使用這樣的索引。為了確定,讓我們檢查下實(shí)際運(yùn)行查詢的時(shí)候,假設(shè)索引不會(huì)被用到:loe28資訊網(wǎng)——每日最新資訊28at.com

EXPLAIN ANALYZE SELECT val FROM hypo WHERE id = 1;                                            QUERY PLAN--------------------------------------------------------------------------------------------------- Seq Scan on hypo  (cost=0.00..1791.00 rows=1 width=10) (actual time=0.046..46.390 rows=1 loops=1)   Filter: (id = 1)   Rows Removed by Filter: 99999 Planning time: 0.160 ms Execution time: 46.460 ms(5 rows)

這就是創(chuàng)建假設(shè)索引并查看 PostgreSQL 是否會(huì)使用此類索引的全部內(nèi)容。loe28資訊網(wǎng)——每日最新資訊28at.com

操作假設(shè)索引

還有一些其他的很方便的函數(shù)和視圖:loe28資訊網(wǎng)——每日最新資訊28at.com

? hypopg_list_indexes:列出已創(chuàng)建的所有假設(shè)索引的視圖loe28資訊網(wǎng)——每日最新資訊28at.com

SELECT * FROM hypopg_list_indexes; indexrelid |      index_name       | schema_name | table_name | am_name------------+-----------------------+-------------+------------+---------      18284 | <18284>btree_hypo_id  | public      | hypo       | btree(1 row)

? **hypopg()**:采用和 pg_index 相同的格式,列出所有已創(chuàng)建的假設(shè)索引的函數(shù)loe28資訊網(wǎng)——每日最新資訊28at.com

SELECT * FROM hypopg();      indexname       | indexrelid | indrelid | innatts | indisunique | indkey | indcollation | indclass | indoption | indexprs | indpred | amid----------------------+------------+----------+---------+-------------+--------+--------------+----------+-----------+----------+---------+------ <18284>btree_hypo_id |      13543 |    18122 |       1 | f           | 1      | 0            | 1978     | <NULL>    | <NULL>   | <NULL>  |  403(1 row)

? **hypopg_get_indexdef(oid)**:列出 CREATE INDEX 語句的函數(shù),該語句可用于重新創(chuàng)建存儲(chǔ)的假設(shè)索引loe28資訊網(wǎng)——每日最新資訊28at.com

SELECT index_name, hypopg_get_indexdef(indexrelid) FROM hypopg_list_indexes;      index_name       |             hypopg_get_indexdef-----------------------+---------------------------------------------- <18284>btree_hypo_id  | CREATE INDEX ON public.hypo USING btree (id)(1 row)

? **hypopg_relation_size(oid)**:用于估計(jì)一個(gè)假設(shè)索引的大小的函數(shù):loe28資訊網(wǎng)——每日最新資訊28at.com

SELECT index_name, pg_size_pretty(hypopg_relation_size(indexrelid))  FROM hypopg_list_indexes;      index_name       | pg_size_pretty-----------------------+---------------- <18284>btree_hypo_id  | 2544 kB(1 row)

? **hypopg_drop_index(oid)**:用于刪除指定假設(shè)索引的函數(shù)loe28資訊網(wǎng)——每日最新資訊28at.com

? **hypopg_reset()**:用于刪除所有假設(shè)索引的函數(shù)loe28資訊網(wǎng)——每日最新資訊28at.com

假設(shè)性隱藏現(xiàn)有索引

您可以假設(shè)性隱藏現(xiàn)有索引和假設(shè)索引。如果要按照文檔中的說明對(duì)其進(jìn)行測(cè)試,則應(yīng)首先使用 hypopg_reset() 清除任何其他假設(shè)索引的影響。loe28資訊網(wǎng)——每日最新資訊28at.com

舉個(gè)簡單的例子,讓我們考慮兩個(gè)索引:loe28資訊網(wǎng)——每日最新資訊28at.com

SELECT hypopg_reset();CREATE INDEX ON hypo(id);CREATE INDEX ON hypo(id, val);
EXPLAIN SELECT * FROM hypo WHERE id = 1;                                    QUERY PLAN---------------------------------------------------------------------------------- Index Only Scan using hypo_id_val_idx on hypo  (cost=0.29..8.30 rows=1 width=13) Index Cond: (id = 1)(2 rows)

查詢計(jì)劃現(xiàn)在正使用 hypo_id_val_idx 索引。loe28資訊網(wǎng)——每日最新資訊28at.com

? **hypopg_hide_index(oid)**:允許您使用 EXPLAIN 輸出中的索引 OID 來隱藏索引的函數(shù)。如果索引已成功隱藏,則返回 true,否則返回 false。loe28資訊網(wǎng)——每日最新資訊28at.com

SELECT hypopg_hide_index('hypo_id_val_idx'::REGCLASS); hypopg_hide_index------------------- t(1 row)EXPLAIN SELECT * FROM hypo WHERE id = 1;                            QUERY PLAN------------------------------------------------------------------------- Index Scan using hypo_id_idx on hypo  (cost=0.29..8.30 rows=1 width=13) Index Cond: (id = 1)(2 rows)

例如,假設(shè)查詢計(jì)劃當(dāng)前正在使用 hypo_id_val_idx 索引。若要繼續(xù)測(cè)試,請(qǐng)使用 hypopg_hide_index(oid) 函數(shù)隱藏另一個(gè)索引。loe28資訊網(wǎng)——每日最新資訊28at.com

SELECT hypopg_hide_index('hypo_id_idx'::REGCLASS); hypopg_hide_index------------------- t(1 row)EXPLAIN SELECT * FROM hypo WHERE id = 1;                    QUERY PLAN------------------------------------------------------- Seq Scan on hypo  (cost=0.00..180.00 rows=1 width=13) Filter: (id = 1)(2 rows)

? **hypopg_unhide_index(oid)**:使用其 OID 還原 EXPLAIN 輸出中以前隱藏的索引的函數(shù)。如果索引已成功還原,則返回 true,否則返回 false。loe28資訊網(wǎng)——每日最新資訊28at.com

SELECT hypopg_unhide_index('hypo_id_idx'::regclass); hypopg_unhide_index------------------- t(1 row)EXPLAIN SELECT * FROM hypo WHERE id = 1;                            QUERY PLAN------------------------------------------------------------------------- Index Scan using hypo_id_idx on hypo  (cost=0.29..8.30 rows=1 width=13) Index Cond: (id = 1)(2 rows)

? **hypopg_unhide_all_index()**:恢復(fù)所有隱藏的索引,并返回 void 的函數(shù)。loe28資訊網(wǎng)——每日最新資訊28at.com

? **hypopg_hidden_indexes()**:返回所有隱藏的索引的 OID 列表的函數(shù)。loe28資訊網(wǎng)——每日最新資訊28at.com

SELECT * FROM hypopg_hidden_indexes(); indexid--------- 526604(1 rows)

? hypopg_hidden_indexes:返回所有隱藏的索引的格式化列表的視圖。loe28資訊網(wǎng)——每日最新資訊28at.com

SELECT * FROM hypopg_hidden_indexes;  indexrelid |      index_name      | schema_name | table_name | am_name | is_hypo-------------+----------------------+-------------+------------+---------+---------      526604 | hypo_id_val_idx      | public      | hypo       | btree   | f(1 rows)

注意:假設(shè)索引也是可以隱藏的。loe28資訊網(wǎng)——每日最新資訊28at.com

SELECT hypopg_create_index('CREATE INDEX ON hypo(id)');    hypopg_create_index------------------------------ (12659,<12659>btree_hypo_id)(1 row)EXPLAIN SELECT * FROM hypo WHERE id = 1;                                    QUERY PLAN------------------------------------------------------------------------------------ Index Scan using "<12659>btree_hypo_id" on hypo  (cost=0.04..8.05 rows=1 width=13) Index Cond: (id = 1)(2 rows)

現(xiàn)在該假設(shè)索引正在被使用,我們可以嘗試隱藏它,以查看更改:loe28資訊網(wǎng)——每日最新資訊28at.com

SELECT hypopg_hide_index(12659); hypopg_hide_index------------------- t(1 row)EXPLAIN SELECT * FROM hypo WHERE id = 1;                            QUERY PLAN------------------------------------------------------------------------- Index Scan using hypo_id_idx on hypo  (cost=0.29..8.30 rows=1 width=13) Index Cond: (id = 1)(2 rows)SELECT * FROM hypopg_hidden_indexes;  indexrelid |      index_name      | schema_name | table_name | am_name | is_hypo-------------+----------------------+-------------+------------+---------+---------       12659 | <12659>btree_hypo_id | public      | hypo       | btree   | t      526604 | hypo_id_val_idx      | public      | hypo       | btree   | f(2 rows)

注意:如果假設(shè)索引已被隱藏,則在使用 hypopg_drop_index(oid) 或 hypopg_reset() 刪除該索引時(shí),它將自動(dòng)取消隱藏。loe28資訊網(wǎng)——每日最新資訊28at.com

SELECT hypopg_drop_index(12659);SELECT * FROM hypopg_hidden_indexes;  indexrelid |      index_name      | schema_name | table_name | am_name | is_hypo-------------+----------------------+-------------+------------+---------+---------      526604 | hypo_id_val_idx      | public      | hypo       | btree   | f(2 rows)

loe28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-79978-0.html要驗(yàn)證索引是否有效,不一定要馬上創(chuàng)建索引哦

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 遭遇粉絲投訴后,BBC 放棄用 AI 生成內(nèi)容宣傳《神秘博士》計(jì)劃

下一篇: 詳解CSS3中的Transition:平滑過渡與動(dòng)畫效果

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 主站蜘蛛池模板: 耿马| 长垣县| 朔州市| 泗阳县| 洞头县| 湘乡市| 农安县| 平凉市| 渭南市| 青神县| 丰台区| 紫云| 鄱阳县| 美姑县| 芮城县| 鹤岗市| 麻城市| 渑池县| 石楼县| 科尔| 灵丘县| 沅陵县| 沐川县| 资阳市| 庆城县| 濮阳县| 盘锦市| 伊通| 玉溪市| 许昌市| 曲沃县| 公安县| 张家港市| 静乐县| 永胜县| 黄骅市| 宜都市| 伊宁市| 句容市| 大关县| 北辰区|