PostgreSQL 11 新特性解读 : Indexs With Include Columns

本文涉及的产品
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
简介: PostgreSQL 11 版本索引方面一个显著的新特性是创建索引时支持 INCLUDE COLUMNS ,语法如下 CREATE INDEX idx_name ON table_name USING BTREE (column_a) INCLUDE (column_b); 一、Release 中.

PostgreSQL 11 版本索引方面一个显著的新特性是创建索引时支持 INCLUDE COLUMNS ,语法如下

CREATE INDEX idx_name ON table_name USING BTREE (column_a) INCLUDE (column_b);

一、Release 中的说明

Allow indexes to INCLUDE columns that are not part of the unique constraint but are available for index-only scans (Anastasia Lubennikova, Alexander Korotkov, Teodor Sigaev)

This is also useful for including columns that dont have btree support

此特性主要用途和使用场景:

  • 如果字段不支持btree索引,可以使用INCLUDE方式索引。
  • 使表上的更多SQL能走 Index-Only Scans。

以上描述颇为费力,以下通过实例演示。

二、验证: 不支持Btree索引的字段,使用Include方式索引

首先验证第一点:不支持Btree索引的字段支持使用INCLUDE方式索引,创建测试表。

francs=> CREATE TABLE t_json1(a serial, user_info json);
CREATE TABLE

在(a,user_info) 字段上创建 btree 索引,如下:

francs=>  CREATE INDEX t_json1_idx1 ON t_json1 USING BTREE(a,user_info);
ERROR:  data type json has no default operator class for access method "btree"
HINT:  You must specify an operator class for the index or define a default operator class for the data type.

以上创建索引报错,是由于 json 不支持 btree 索引。

使用 INCLUDE 方式创建索引成功,如下:

francs=> CREATE INDEX t_json1_idx_include ON t_json1 USING btree(a) INCLUDE(user_info);
CREATE INDEX

三、验证: Include Columns 支持 Index-Only Scans

创建测试表并插入300万数据,如下:

francs=> CREATE TABLE t_include(a int4, name text);
CREATE TABLE

francs=> INSERT INTO t_include(a,name) SELECT n,n || '_INCLUDE TEST' FROM generate_series(1,3000000) n;
INSERT 0 3000000

在字段a上创建索引,如下:

francs=> CREATE INDEX idx_t_include_a ON t_include USING BTREE (a);
CREATE INDEX

where条件中只包含a,查询a字段,以下SQL走了 Index Only Scan。

francs=>  EXPLAIN ANALYZE SELECT a FROM t_include WHERE a<5;
                                                           QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------
 Index Only Scan using idx_t_include_a on t_include  (cost=0.43..8.50 rows=4 width=4) (actual time=0.017..0.018 rows=4 loops=1)
   Index Cond: (a < 5)
   Heap Fetches: 4
 Planning Time: 0.272 ms
 Execution Time: 0.038 ms
(5 rows)

加入 name 字段后,不走 Index Only Scan,如下。

francs=>  EXPLAIN ANALYZE SELECT a,name FROM t_include WHERE a<5;
                                                         QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------
 Index Scan using idx_t_include_a on t_include  (cost=0.43..8.50 rows=4 width=24) (actual time=0.005..0.007 rows=4 loops=1)
   Index Cond: (a < 5)
 Planning Time: 0.125 ms
 Execution Time: 0.025 ms
(4 rows)

加入 name 后走了 Index Scan using ,根据索引回表查询name字段。

创建索引时使用 INCLUDE(name),如下

francs=> CREATE INDEX idx_t_include ON t_include USING BTREE (a) INCLUDE (name);
CREATE INDEX

再次执行查询,走了 Index Only Scan

francs=> VACUUM ANALYZE t_include;
VACUUM

francs=> EXPLAIN ANALYZE SELECT a,name FROM t_include WHERE a<5;
                                                          QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------
 Index Only Scan using idx_t_include on t_include  (cost=0.43..4.50 rows=4 width=24) (actual time=0.017..0.018 rows=4 loops=1)
   Index Cond: (a < 5)
   Heap Fetches: 0
 Planning Time: 0.175 ms
 Execution Time: 0.038 ms
(5 rows)

只查询name字段,也走了 Index Only Scan,如下

francs=> EXPLAIN ANALYZE SELECT name FROM t_include WHERE a<5;
                                                          QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------
 Index Only Scan using idx_t_include on t_include  (cost=0.43..4.50 rows=4 width=20) (actual time=0.012..0.014 rows=4 loops=1)
   Index Cond: (a < 5)
   Heap Fetches: 0
 Planning Time: 0.163 ms
 Execution Time: 0.038 ms
(5 rows)

四、Include 索引的限制

  • 目前只有 Btree 索引支持 INCLUDE COLUMNS(INCLUDE中的字段物理上位于btree索引叶子节点)。
  • INCLUDE COLUMNS 中的字段不支持函数索引。
  • INCLUDE COLUMNS 中的字段数据类型可以不支持 btree 索引,例如 JSON 等数据类型。

五、两种索引方式差异

或许有朋友问以下两种索引方式有啥区别? 这个问题欢迎大家留言讨论。

CREATE INDEX idx_t_not_include ON t_include USING BTREE (a,name);
CREATE INDEX idx_t_include ON t_include USING BTREE (a) INCLUDE (name);

六、参考

新书推荐

最后推荐和张文升共同编写的《PostgreSQL实战》,本书基于PostgreSQL 10 编写,共18章,重点介绍SQL高级特性、并行查询、分区表、物理复制、逻辑复制、备份恢复、高可用、性能优化、PostGIS等,涵盖大量实战用例!

链接:https://item.jd.com/12405774.html

_5_PostgreSQL_

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
存储 关系型数据库 数据库
深入了解 PostgreSQL:功能、特性和部署
PostgreSQL,通常简称为Postgres,是一款强大且开源的关系型数据库管理系统(RDBMS),它在数据存储和处理方面提供了广泛的功能和灵活性。本文将详细介绍 PostgreSQL 的功能、特性以及如何部署和使用它。
675 1
深入了解 PostgreSQL:功能、特性和部署
|
关系型数据库 大数据 PostgreSQL
PostgreSQL16-新特性-并行聚合
PostgreSQL16-新特性-并行聚合
142 0
|
存储 关系型数据库 数据库
探索PostgreSQL 14新特性--SEARCH和CYCLE
探索PostgreSQL 14新特性--SEARCH和CYCLE
88 0
|
缓存 监控 关系型数据库
[译]PostgreSQL16-新特性-新增IO统计视图:pg_stat_io
[译]PostgreSQL16-新特性-新增IO统计视图:pg_stat_io
231 0
|
存储 缓存 关系型数据库
PostgreSQL 14新特性--减少索引膨胀
PostgreSQL 14新特性--减少索引膨胀
474 0
|
存储 SQL Oracle
AnalyticDB PostgreSQL 7.0 支持存储过程(CREATE PROCEDURE)特性
AnalyticDB PostgreSQL 7.0 新增了存储过程功能的支持,让用户在使用ADB PG时能够更方便高效地开发业务,并能够更好地兼容Oracle等传统数仓的业务。
493 1
AnalyticDB PostgreSQL 7.0 支持存储过程(CREATE PROCEDURE)特性
|
存储 SQL JSON
大分区表高并发性能提升100倍?阿里云 RDS PostgreSQL 12 特性解读
世界上几乎最强大的开源数据库系统 PostgreSQL,于 2019 年 10 月 3 日发布了 12 版本,该版本已经在阿里云正式发布。PostgreSQL 12 在功能和性能上都有很大提升,如大分区表高并发性能提升百倍,B-tree 索引空间和性能优化,实现 SQL 2016 标准的 JSON 特性,支持多列 MCV(Most-Common-Value)统计,内联 CTE(Common table expressions)以及可插拔的表存储访问接口等。本文对部分特性进行解读。
2897 0
大分区表高并发性能提升100倍?阿里云 RDS PostgreSQL 12 特性解读
|
SQL 关系型数据库 Linux
知识分享之PostgreSQL——OIDS的特性与新版本去除SQL
之前一直使用的PostgreSQL 9.6系列版本,由于官方不再维护了,就准备换成最新稳定版本的,查看了一下官方版本说明,发现13系列版本是目前稳定性较好的版本,于是兴冲冲的更换了过来,但随之而来的就是一些新特性,其中就比如表中的OID字段,这个字段是对象标识符,之前能用于行标记,现在发现只有表才具有这个隐藏字段,行数据没有这个支持了,于是就需要将老版本的表进行关闭掉这个字段。下面我们就开始关闭之旅。
163 0
知识分享之PostgreSQL——OIDS的特性与新版本去除SQL
|
SQL 存储 JSON
PostgreSQL 14 版本特性浅析
## 性能增强 ### 大量连接高并发优化 - 场景: SaaS场景,微服务架构下的中心库场景 - 业务特点:客户端多,在线用户多,数据库并发连接非常多 - 价值: 比连接池网络少1跳, 性能更好, 支持绑定变量等连接池会话模式不支持的全部功能 ### 索引增强 1. 缓解高频更新负载下的btree索引膨胀 - 场景: 数据频繁更新,如游戏、交易、共享出行、IoT等行业 - 价值: 减少膨胀
|
SQL 存储 缓存
从研发角度深入了解RDS AliSQL内核2020新特性
内容简要: 一、关于内核 二、内核特性详解 一、 关于内核 (一)回归内核
从研发角度深入了解RDS AliSQL内核2020新特性