PostgreSQL 支持hstore 来存放KEY->VALUE这类数据, 事实上也相似于ARRAY或者JSON类型。  要高效的使用这类数据,当然离不开高效的索引。我们今天就来看看两类不同的索引对于同一种检索请求的性能问题。

假如我们有这样一个原始表。基于str1字段有一个BTREE索引。

t_girl=# \d status_check;
Table "ytt.status_check"
Column | Type | Modifiers
--------+-----------------------+-----------
is_yes | boolean | not null
str1 | character varying(20) | not null
str2 | character varying(20) | not null
Indexes:
"index_status_check_str1" btree (str1)

里面有10W条记录。 数据大概例如以下。

t_girl=# select * from status_check limit 2;
is_yes | str1 | str2
--------+------+----------------------
f | 0 | cfcd208495d565ef66e7
t | 1 | c4ca4238a0b923820dcc
(2 rows) Time: 0.617 ms
t_girl=#

存放hstore类型的status_check_hstore 表结构,基于str1_str2字段有一个GIST索引。

 Table "ytt.status_check_hstore"
Column | Type | Modifiers
-----------+---------+-----------
is_yes | boolean |
str1_str2 | hstore |
Indexes:
"idx_str_str2_gist" gist (str1_str2)

t_girl=# select * from status_check_hstore limit 2;
is_yes | str1_str2
--------+-----------------------------
f | "0"=>"cfcd208495d565ef66e7"
t | "1"=>"c4ca4238a0b923820dcc"
(2 rows) Time: 39.874 ms

接下来我们要得到跟查询原始表一样的结果,当然原始表的查询很高效。 表语句以及结果例如以下,

t_girl=# select * from status_check where str1 in ('10','23','33');
is_yes | str1 | str2
--------+------+----------------------
t | 10 | d3d9446802a44259755d
t | 23 | 37693cfc748049e45d87
f | 33 | 182be0c5cdcd5072bb18
(3 rows) Time: 0.690 ms

上面的语句用了不到1毫秒。

接下来我们对hstore表进行查询。

t_girl=# select is_yes,skeys(str1_str2),svals(str1_str2) from status_check_hstore where str1_str2 ?| array['10','23','33'];
is_yes | skeys | svals
--------+-------+----------------------
t | 10 | d3d9446802a44259755d
t | 23 | 37693cfc748049e45d87
f | 33 | 182be0c5cdcd5072bb18
(3 rows) Time: 40.256 ms

我的天。比原始表的查询慢了几十倍。

看下查询计划,把全部行都扫描了一遍。

                                    QUERY PLAN
-----------------------------------------------------------------------------------
Bitmap Heap Scan on status_check_hstore (cost=5.06..790.12 rows=100000 width=38)
Recheck Cond: (str1_str2 ? | '{10,23,33}'::text[])
-> Bitmap Index Scan on idx_str_str2_gist (cost=0.00..5.03 rows=100 width=0)
Index Cond: (str1_str2 ?| '{10,23,33}'::text[])
(4 rows) Time: 0.688 ms

我们想办法来优化这条语句, 假设把这条语句变成跟原始语句一样的话。那么是否就能够用到BTREE索引了?
接下来,建立一个基于BTREE的函数索引,

t_girl=# create index idx_str1_str2_akeys on status_check_hstore using btree (array_to_string(akeys(str1_str2),','));
CREATE INDEX
Time: 394.123 ms

OK,变化语句来运行下相同的检索,

t_girl=# select is_yes,skeys(str1_str2),svals(str1_str2) from status_check_hstore where array_to_string(akeys(str1_str2),',') in ('10','23','33');
is_yes | skeys | svals
--------+-------+----------------------
t | 10 | d3d9446802a44259755d
t | 23 | 37693cfc748049e45d87
f | 33 | 182be0c5cdcd5072bb18
(3 rows) Time: 0.727 ms

这次和原始查询速度一样快了。

PostgreSQL hstore 列性能提升一例的更多相关文章

  1. PostgreSQL学习手册 性能提升技巧

    http://www.cnblogs.com/mchina/archive/2012/08/11/2537393.html 一.使用EXPLAIN:    PostgreSQL为每个查询都生成一个查询 ...

  2. oracle 11g亿级复杂SQL优化一例(数量级性能提升)

    自从16年之后,因为工作原因,项目中就没有再使用oracle了,最近最近支持一个项目,又要开始负责这块事情了.最近在跑性能测试,配置全部调好之后,不少sql还存在性能低下的问题,主要涉及执行计划的不合 ...

  3. Postgresql HStore 插件试用小结

    一,     安装 环境介绍:官方说postgresql 9.3 版本之后支持HStore 插件,目前最新版本10.3 本次测试版本:10.1 或 9.6.2 进入psql 运行环境,使用管理员(高级 ...

  4. [转帖]PostgreSQL 参数调整(性能优化)

    PostgreSQL 参数调整(性能优化) https://www.cnblogs.com/VicLiu/p/11854730.html 知道一个 shared_pool 文章写的挺好的 还没仔细看 ...

  5. PostgreSQL 参数调整(性能优化)

    昨天分别在外网和无外网环境下安装PostgreSQL,有外网环境下安装的相当顺利.但是在无外网环境下就是两个不同的概念了,可谓十有八折.感兴趣的同学可以搭建一下. PostgreSQL安装完成后第一件 ...

  6. 查询性能提升3倍!Apache Hudi 查询优化了解下?

    从 Hudi 0.10.0版本开始,我们很高兴推出在数据库领域中称为 Z-Order 和 Hilbert 空间填充曲线的高级数据布局优化技术的支持. 1. 背景 Amazon EMR 团队最近发表了一 ...

  7. SQL Server 2014里的性能提升

    在这篇文章里我想小结下SQL Server 2014引入各种惊艳性能提升!! 缓存池扩展(Buffer Pool Extensions) 缓存池扩展的想法非常简单:把页文件存储在非常快的存储上,例如S ...

  8. YbSoftwareFactory 代码生成插件【二十一】:Web Api及MVC性能提升的几个小技巧

    最近在进行 YbSoftwareFactory 的流程功能升级,目前已经基本完成,现将用到的一些关于 Web Api 及 MVC 性能提升的一些小技巧进行了总结,这些技巧在使用.配置上也相当的简单,但 ...

  9. C# 程序性能提升篇-1、装箱和拆箱,枚举的ToString浅析

    前景提要: 编写程序时,也许你不经意间,就不知不觉的使程序代码,发生了装箱和拆箱,从而降低了效率,不要说就发生那么一次两次,如果说是程序中发生了循环.网络程序(不断请求处理的)等这些时候,减少装箱和拆 ...

随机推荐

  1. 多校第二场 1004 hdu 5303 Delicious Apples(背包+贪心)

    题目链接: 点击打开链接 题目大意: 在一个周长为L的环上.给出n棵苹果树.苹果树的位置是xi,苹果树是ai,苹果商店在0位置,人的篮子最大容量为k,问最少做多远的距离可以把苹果都运到店里 题目分析: ...

  2. NAT配置

    静态NAT Router(config)#ip nat inside source static tcp 192.168.100.2 61.159.62.131   指定地址转换映射 Router(c ...

  3. oracle经常使用函数(2)

    1.TRIM([ { { LEADING | TRAILING | BOTH }[ trim_character ]| trim_character} FROM ]trim_source) 函数 參数 ...

  4. Elasticsearch部署异常Permission denied

    异常描述 在Linux上部署ElasticSearch时抛出了一个异常如下: log4j:ERROR setFile(null,true) call failed. java.io.FileNotFo ...

  5. How to include custom library into maven local repository?--转

    原文地址:https://www.mkyong.com/maven/how-to-include-library-manully-into-maven-local-repository/ There ...

  6. jQuery在多个div中,删除指定项

    之前工作中有一个需求,就是在一堆图片列表中,点击具体的图片,并从界面移除:点击具体的图片,下载:这是一个思路 <style type="text/css" media=&qu ...

  7. How an Event Enters a Cocoa Application

    How an Event Enters a Cocoa Application An event is a low-level record of a user action that is usua ...

  8. ABBYY FineReader 双十二特惠活动正在进行中...

    转眼间11月已悄然飘过,有些童鞋还没缓过双十一的劲,势必将剁手进行到底.只为当时没有鼓足勇气.狠下心来而悔恨其中.别担心,双十二你准备好了么,ABBYY FineReader 系列产品低价让你继续嗨到 ...

  9. 从url获取参数有中文时会出现乱码的问题

    http://192.168.1.133/v2?groupId=58&opFlag=1&result=C,B,B,B,D&Name=本人很帅 我们js获取的url中的Name其 ...

  10. day19-1 迭代器,三元表达式,列表推导式,字典生成式,

    目录 迭代器 可迭代对象 迭代器对象 总结 三元表达式(三目表达式) 列表推导式 字典生成式 迭代器 可迭代对象 拥有iter方法的对象就是可迭代对象 # 以下都是可迭代的对象 st = '123'. ...