PostgreSQL 虚拟|虚假 索引(hypothetical index) - HypoPG

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
云原生数据库 PolarDB 分布式版,标准版 2核8GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介:

标签

PostgreSQL , 虚拟索引 , 虚假索引 , HypoPG , hypothetical index


背景

DBA实际上是一种比较稀缺的资源,很多企业甚至没有DBA,或者SA、开发人员兼职DBA,对于一般的使用者,对数据库了解程度有限,特别是在SQL优化方面的知识更加有限。

最常用也是奏效较快的SQL优化手段,通常是加索引,这也是我从很多开发者交流后得知的,很多人的概念是,SQL慢,加索引嘛。

但是加索引有没有效果要针对“SQL、针对数据分布、针对输入条件、针对列的唯一值比例” 来判断:加索引后的降低了多少CPU的FILTER计算开销,降低了多少IO的扫描。同时,加索引带来的副作用是写入IO放大,占用更多空间,写入性能下降。

并且,在加索引时,会堵塞DML(不过还好,PG支持并发加索引,不堵塞DML。 CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [ IF NOT EXISTS ] name ] ON table_name [ USING method ])。

那么对于一般的使用者,如何更好的判断加索引是否有效呢?

虚拟索引是一个很有用的东西,没有副作用,只是虚拟的索引,建立虚拟索引后,可以通过EXPLAIN来查看加索引后的成本估算,判断是否加索引COST会降低。

hypopg 虚拟索引插件

1、安装插件

https://github.com/dalibo/hypopg/

2、建立插件

CREATE EXTENSION hypopg;  

3、建测试表

rjuju=# CREATE TABLE hypo AS SELECT id, 'line ' || id AS val FROM generate_series(1,10000) id;  

4、查看没有索引时,全表扫描的成本

rjuju=# 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)  

5、建立虚拟索引

rjuju=# SELECT * FROM hypopg_create_index('CREATE INDEX ON hypo (id)');  

6、查看已建立了哪些虚拟索引

rjuju=# SELECT * FROM hypopg_list_indexes();  
 indexrelid |                 indexname                 | nspname | relname | amname  
 -----------+-------------------------------------------+---------+---------+--------  
     205101 | <41072>btree_hypo_id                      | public  | hypo    | btree  

7、查看建立虚拟索引后的执行计划

rjuju=# EXPLAIN SELECT * FROM hypo WHERE id = 1;  
                                     QUERY PLAN  
------------------------------------------------------------------------------------  
 Index Scan using <41072>hypo_btree_hypo_id on hypo  (cost=0.29..8.30 rows=1 width=13)  
   Index Cond: (id = 1)  
(2 rows)  

8、查看真实的执行计划

rjuju=# EXPLAIN ANALYZE SELECT * FROM hypo WHERE id = 1;  
                                           QUERY PLAN  
-------------------------------------------------------------------------------------------------  
 Seq Scan on hypo  (cost=0.00..180.00 rows=1 width=13) (actual time=0.036..6.072 rows=1 loops=1)  
   Filter: (id = 1)  
   Rows Removed by Filter: 9999  
 Planning time: 0.109 ms  
 Execution time: 6.113 ms  
(5 rows)  

9、清除虚拟索引

调用hypopg_drop_index(indexrelid) 清除单个虚拟索引,调用hypopg_reset() 清除所有虚拟索引。

To remove your backend's hypothetical indexes,   
  
you can use the function hypopg_drop_index(indexrelid) with the OID that hypopg_list_indexes() function returns,   
  
call hypopg_reset() to remove all at once or just close your current connection.  

参考

https://github.com/dalibo/hypopg/

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
4月前
|
监控 关系型数据库 数据库
PostgreSQL的索引优化策略?
【8月更文挑战第26天】PostgreSQL的索引优化策略?
102 1
|
4月前
|
SQL 关系型数据库 MySQL
SQL Server、MySQL、PostgreSQL:主流数据库SQL语法异同比较——深入探讨数据类型、分页查询、表创建与数据插入、函数和索引等关键语法差异,为跨数据库开发提供实用指导
【8月更文挑战第31天】SQL Server、MySQL和PostgreSQL是当今最流行的关系型数据库管理系统,均使用SQL作为查询语言,但在语法和功能实现上存在差异。本文将比较它们在数据类型、分页查询、创建和插入数据以及函数和索引等方面的异同,帮助开发者更好地理解和使用这些数据库。尽管它们共用SQL语言,但每个系统都有独特的语法规则,了解这些差异有助于提升开发效率和项目成功率。
429 0
|
4月前
|
关系型数据库 数据库 PostgreSQL
PostgreSQL索引维护看完这篇就够了
PostgreSQL索引维护看完这篇就够了
311 0
|
存储 关系型数据库 数据库
PostgreSQL技术大讲堂 - 第28讲:索引内部结构
从零开始学PostgreSQL技术大讲堂 - 第28讲:索引内部结构
760 2
|
关系型数据库 Go 数据库
《提高查询速度:PostgreSQL索引实用指南》
《提高查询速度:PostgreSQL索引实用指南》
592 0
|
关系型数据库 分布式数据库 数据库
PolarDB for PostgreSQL 14:全局索引
PolarDB for PostgreSQL 14 相较于 PostgreSQL 14,提供了更多企业级数据库的特性。本实验将体验其中的全局索引功能。
|
弹性计算 关系型数据库 OLAP
AnalyticDB PostgreSQL版向量索引查询
本案例对比了传统查询和使用向量索引执行查询的执行时间,助您体验使用向量索引查询带来的高效和快捷。
|
存储 SQL 关系型数据库
PostgreSQL插件HypoPG:支持虚拟索引
PostgreSQL插件HypoPG:支持虚拟索引
400 0
|
存储 缓存 关系型数据库
PostgreSQL 14新特性--减少索引膨胀
PostgreSQL 14新特性--减少索引膨胀
482 0
|
7月前
|
SQL 关系型数据库 数据库
RDS PostgreSQL索引推荐原理及最佳实践
前言很多开发人员都知道索引对于数据库的查询性能至关重要,一个好的索引能使数据库的性能提升成千上万倍。但给数据库加索引是一项相对专业的工作,需要对数据库的运行原理有一定了解。同时,加了索引有没有性能提升、性能提升了多少,这些都是加索引前就想知道的。这项繁杂的工作有没有更好的方案呢?有!就是今天重磅推出...
120 1
RDS PostgreSQL索引推荐原理及最佳实践

相关产品

  • 云原生数据库 PolarDB
  • 云数据库 RDS PostgreSQL 版