当前位置:首页 > 科技  > 软件

要验证索引是否有效,不一定要马上创建索引哦

来源: 责编: 时间:2024-03-28 09:24:17 249观看
导读 本文转载自微信公众号「 红石PG」,作者红石PG。介绍如果要检查某些索引是否有助于一个或多个查询,则 HypoPG 非常有用。因此,您应该已经知道需要优化哪些查询,以及要尝试哪些索引。此外,HypoPG 将要创建的假设索引不会存
 本文转载自微信公众号「 红石PG」,作者红石PG

介绍

如果要检查某些索引是否有助于一个或多个查询,则 HypoPG 非常有用。因此,您应该已经知道需要优化哪些查询,以及要尝试哪些索引。78Y28资讯网——每日最新资讯28at.com

此外,HypoPG 将要创建的假设索引不会存储在任何系统表中,而是存储在您连接的私有内存中。因此,它不会使任何表出现膨胀,也不会影响任何并发连接。78Y28资讯网——每日最新资讯28at.com

此外,由于假设索引实际上并不存在,因此 HypoPG 仅能确保在使用简单的 EXPLAIN 语句(不带 ANALYZE 选项)时会使用它们。78Y28资讯网——每日最新资讯28at.com

安装扩展

跟任何其他扩展一样,您必须将其安装在希望能够使用它的所有数据库上。只需用一个有足够权限的用户,连接到要安装 HypoPG 的数据库上,执行以下查询即可完成:78Y28资讯网——每日最新资讯28at.com

CREATE EXTENSION hypopg;

现在就可以使用 HypoPG 了。您可以使用 psql 轻松地检查扩展是否存在:78Y28资讯网——每日最新资讯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 进行检查,请参考 pg_extension 表文档。78Y28资讯网——每日最新资讯28at.com

配置

以下是可用的配置参数(GUC),并且可以交互式更改:78Y28资讯网——每日最新资讯28at.com

• hypopg.enabled:默认为on。使用此参数可全局启用或禁用 HypoPG。禁用 HypoPG 后,任何假设索引都不会被使用,但不会删除定义的假设索引。78Y28资讯网——每日最新资讯28at.com

• hypopg.use_real_oids:默认为off。默认情况下,HypoPG 不会使用 “真实的” 对象标识符,而是从 ~ 14000 / 16384(分别是低于 FirstNormalObjectId 的最低未使用的 oid 和 FirstNormalObjectId)范围内借用标识符,这些标识符由 PostgreSQL 保留,以备将来在未来的版本中使用。这不会造成任何问题,因为可用范围是在连接首次使用 HypoPG 时动态计算的,并且还有可以应用在备用服务器上的优势。但缺点是,您不能同时拥有大约 2500 个假设索引,并且一旦已经创建了超出最多数目的对象,创建新的假设索引会变得非常慢,一直到hypopg_reset()被调用。如果这些缺点有问题,您可以启用此参数。然后,HypoPG 将要求提供真实的对象标识符,这将需要获取更多锁,并且不会在备用服务器工作,但允许使用所有可用的对象标识符。请注意,切换此参数不需要重置已经定义的假设索引,两者可以同时共存。78Y28资讯网——每日最新资讯28at.com

支持的访问方式

支持以下访问方式:78Y28资讯网——每日最新资讯28at.com

• btree78Y28资讯网——每日最新资讯28at.com

• brin78Y28资讯网——每日最新资讯28at.com

• hash(需要 PostgreSQL 10 或更高版本)78Y28资讯网——每日最新资讯28at.com

• bloom(需要安装 bloom 扩展)78Y28资讯网——每日最新资讯28at.com

创建假设索引

注意:使用 HypoPG 需要对 EXPLAIN 命令有一定的了解。如果您需要有关此命令的更多信息,可以查看官方文档。另外也还有很多非常好的资源。78Y28资讯网——每日最新资讯28at.com

为了清楚起见,让我们使用一个非常简单的测试用例,看看它是如何工作的:78Y28资讯网——每日最新资讯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;

此表没有任何索引。假设我们要检查索引是否有助于简单的查询。首先,让我们看看它的表现:78Y28资讯网——每日最新资讯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 列上创建一个简单 btree 索引,应该有助于此查询。让我们来看看 HypoPG。函数 hypopg_create_index() 可接受任何标准的 CREATE INDEX 语句(传递给此函数的任何其他语句都会被忽略),并为每个语句创建一个假设索引:78Y28资讯网——每日最新资讯28at.com

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

该函数返回两列:78Y28资讯网——每日最新资讯28at.com

• 假设索引的对象标识符78Y28资讯网——每日最新资讯28at.com

• 生成的假设索引名称78Y28资讯网——每日最新资讯28at.com

我们可以再次运行 EXPLAIN,来查看 PostgreSQL 是否会使用这个索引:78Y28资讯网——每日最新资讯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 会使用这样的索引。为了确定,让我们检查下实际运行查询的时候,假设索引不会被用到:78Y28资讯网——每日最新资讯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)

这就是创建假设索引并查看 PostgreSQL 是否会使用此类索引的全部内容。78Y28资讯网——每日最新资讯28at.com

操作假设索引

还有一些其他的很方便的函数和视图:78Y28资讯网——每日最新资讯28at.com

• hypopg_list_indexes:列出已创建的所有假设索引的视图78Y28资讯网——每日最新资讯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 相同的格式,列出所有已创建的假设索引的函数78Y28资讯网——每日最新资讯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 语句的函数,该语句可用于重新创建存储的假设索引78Y28资讯网——每日最新资讯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)**:用于估计一个假设索引的大小的函数:78Y28资讯网——每日最新资讯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)**:用于删除指定假设索引的函数78Y28资讯网——每日最新资讯28at.com

• **hypopg_reset()**:用于删除所有假设索引的函数78Y28资讯网——每日最新资讯28at.com

假设性隐藏现有索引

您可以假设性隐藏现有索引和假设索引。如果要按照文档中的说明对其进行测试,则应首先使用 hypopg_reset() 清除任何其他假设索引的影响。78Y28资讯网——每日最新资讯28at.com

举个简单的例子,让我们考虑两个索引:78Y28资讯网——每日最新资讯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)

查询计划现在正使用 hypo_id_val_idx 索引。78Y28资讯网——每日最新资讯28at.com

• **hypopg_hide_index(oid)**:允许您使用 EXPLAIN 输出中的索引 OID 来隐藏索引的函数。如果索引已成功隐藏,则返回 true,否则返回 false。78Y28资讯网——每日最新资讯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)

例如,假设查询计划当前正在使用 hypo_id_val_idx 索引。若要继续测试,请使用 hypopg_hide_index(oid) 函数隐藏另一个索引。78Y28资讯网——每日最新资讯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 输出中以前隐藏的索引的函数。如果索引已成功还原,则返回 true,否则返回 false。78Y28资讯网——每日最新资讯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()**:恢复所有隐藏的索引,并返回 void 的函数。78Y28资讯网——每日最新资讯28at.com

• **hypopg_hidden_indexes()**:返回所有隐藏的索引的 OID 列表的函数。78Y28资讯网——每日最新资讯28at.com

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

• hypopg_hidden_indexes:返回所有隐藏的索引的格式化列表的视图。78Y28资讯网——每日最新资讯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)

注意:假设索引也是可以隐藏的。78Y28资讯网——每日最新资讯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)

现在该假设索引正在被使用,我们可以尝试隐藏它,以查看更改:78Y28资讯网——每日最新资讯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)

注意:如果假设索引已被隐藏,则在使用 hypopg_drop_index(oid) 或 hypopg_reset() 删除该索引时,它将自动取消隐藏。78Y28资讯网——每日最新资讯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)

78Y28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-79978-0.html要验证索引是否有效,不一定要马上创建索引哦

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 遭遇粉丝投诉后,BBC 放弃用 AI 生成内容宣传《神秘博士》计划

下一篇: 详解CSS3中的Transition:平滑过渡与动画效果

标签:
  • 热门焦点
  • Rust中的高吞吐量流处理

    作者 | Noz编译 | 王瑞平本篇文章主要介绍了Rust中流处理的概念、方法和优化。作者不仅介绍了流处理的基本概念以及Rust中常用的流处理库,还使用这些库实现了一个流处理程序
  • 分布式系统中的CAP理论,面试必问,你理解了嘛?

    对于刚刚接触分布式系统的小伙伴们来说,一提起分布式系统,就感觉高大上,深不可测。而且看了很多书和视频还是一脸懵逼。这篇文章主要使用大白话的方式,带你理解一下分布式系统
  • 得物效率前端微应用推进过程与思考

    一、背景效率工程随着业务的发展,组织规模的扩大,越来越多的企业开始意识到协作效率对于企业团队的重要性,甚至是决定其在某个行业竞争中突围的关键,是企业长久生存的根本。得物
  • Flowable工作流引擎的科普与实践

    一.引言当我们在日常工作和业务中需要进行各种审批流程时,可能会面临一系列技术和业务上的挑战。手动处理这些审批流程可能会导致开发成本的增加以及业务复杂度的上升。在这
  • 三分钟白话RocketMQ系列—— 如何发送消息

    我们知道RocketMQ主要分为消息 生产、存储(消息堆积)、消费 三大块领域。那接下来,我们白话一下,RocketMQ是如何发送消息的,揭秘消息生产全过程。注意,如果白话中不小心提到相关代
  • 10天营收超1亿美元,《星铁》比《原神》差在哪?

    来源:伯虎财经作者:陈平安即便你没玩过《原神》,你一定听说过的它的大名。恨它的人把《原神》开服那天称作是中国游戏史上最黑暗的一天,有粉丝因为索尼在PS平台上线《原神》,怒而
  • Windows 11发布,微软一改往常对老机型开放的态度

    距离 Windows 11 发布已经过去一周,在过去一周里,很多数码爱好者围绕其对 Android 应用的支持、对老机型的升级问题展开了激烈讨论。与以往不同的是,在这次大
  • 2021中国国际消费电子博览会与青岛国际软件融合创新博览会新闻发布会隆重举行

    9月18日,2021中国国际消费电子博览会与青岛国际软件融合创新博览会新闻发布会在青岛国际新闻中心隆重举行。发布会上青岛市政府领导联袂出席,对本次双展会情
  • “买真退假” 这种“羊毛”不能薅

    □ 法治日报 记者 王春   □ 本报通讯员 胡佳丽  2020年初,还在上大学的小东加入了一个大学生兼职QQ群。群主&ldquo;七王&rdquo;在群里介绍一些刷单赚
Top