PostgreSQL hstore 列性能提升一例
假如我们有这样一个原始表。基于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 列性能提升一例的更多相关文章
- PostgreSQL学习手册 性能提升技巧
http://www.cnblogs.com/mchina/archive/2012/08/11/2537393.html 一.使用EXPLAIN: PostgreSQL为每个查询都生成一个查询 ...
- oracle 11g亿级复杂SQL优化一例(数量级性能提升)
自从16年之后,因为工作原因,项目中就没有再使用oracle了,最近最近支持一个项目,又要开始负责这块事情了.最近在跑性能测试,配置全部调好之后,不少sql还存在性能低下的问题,主要涉及执行计划的不合 ...
- Postgresql HStore 插件试用小结
一, 安装 环境介绍:官方说postgresql 9.3 版本之后支持HStore 插件,目前最新版本10.3 本次测试版本:10.1 或 9.6.2 进入psql 运行环境,使用管理员(高级 ...
- [转帖]PostgreSQL 参数调整(性能优化)
PostgreSQL 参数调整(性能优化) https://www.cnblogs.com/VicLiu/p/11854730.html 知道一个 shared_pool 文章写的挺好的 还没仔细看 ...
- PostgreSQL 参数调整(性能优化)
昨天分别在外网和无外网环境下安装PostgreSQL,有外网环境下安装的相当顺利.但是在无外网环境下就是两个不同的概念了,可谓十有八折.感兴趣的同学可以搭建一下. PostgreSQL安装完成后第一件 ...
- 查询性能提升3倍!Apache Hudi 查询优化了解下?
从 Hudi 0.10.0版本开始,我们很高兴推出在数据库领域中称为 Z-Order 和 Hilbert 空间填充曲线的高级数据布局优化技术的支持. 1. 背景 Amazon EMR 团队最近发表了一 ...
- SQL Server 2014里的性能提升
在这篇文章里我想小结下SQL Server 2014引入各种惊艳性能提升!! 缓存池扩展(Buffer Pool Extensions) 缓存池扩展的想法非常简单:把页文件存储在非常快的存储上,例如S ...
- YbSoftwareFactory 代码生成插件【二十一】:Web Api及MVC性能提升的几个小技巧
最近在进行 YbSoftwareFactory 的流程功能升级,目前已经基本完成,现将用到的一些关于 Web Api 及 MVC 性能提升的一些小技巧进行了总结,这些技巧在使用.配置上也相当的简单,但 ...
- C# 程序性能提升篇-1、装箱和拆箱,枚举的ToString浅析
前景提要: 编写程序时,也许你不经意间,就不知不觉的使程序代码,发生了装箱和拆箱,从而降低了效率,不要说就发生那么一次两次,如果说是程序中发生了循环.网络程序(不断请求处理的)等这些时候,减少装箱和拆 ...
随机推荐
- 用户体验之如何优化你的APP
用户体验,速度为王,来几个优化APP“速度”的建议. 1.后台执行 毋庸多言,已是通常做法. 一般在执行下载任务时让其在后台运营,让用户有精力去做别的事情. 后端加载 2.提前显示 客户端与WEB的数 ...
- myeclipse集成svn
svn安装 这个我在博客中的代码管理里面有些,也是一直next.svn代码管理版本号管理器安装好之后. myeclipse的svn插件 方法一: 然后配置MyEclipse的SVN插件,将插件下载下来 ...
- 怎样避免使用Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK之后的黑屏问题
在自己的项目中.我须要使用Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK来開始新的activity同一时候移除之前全部的 ...
- 痛苦的人生——JRuby on Rails的开发与部署小记
最近单位领导部署了一项开发用户自助服务系统的任务,该任务有且仅有我一人独立完成——哈哈,十分美妙的工作呢. 恰巧楼主最近被Ruby的美妙特性所迷惑,于是义无反顾地投入到Ruby on Rails的怀抱 ...
- bzoj1503: [NOI2004]郁闷的出纳员(伸展树)
1503: [NOI2004]郁闷的出纳员 题目:传送门 题解: 修改操作一共不超过100 直接暴力在伸展树上修改 代码: #include<cstdio> #include<cst ...
- 基于macOS+VMware的GNS3内VM上公网
笔者经常需要做网络实验,GNS3就是笔者最喜欢用的模拟器,为了便于实验,需要能从macos上直接ssh登陆模拟出来的vm,并且vm需要上公网.经过研究,已解决此问题,并以此分享出来 tag: maco ...
- Core篇——初探Core的Http请求管道&&Middleware
目录: 1.Core 处理HTTP请求流程 2.中间件(Middleware)&&处理流程 3.创建自定义中间件&&模拟Core的请求管道 Core 处理HTTP请求流 ...
- 移除HTML5 input在type="search"时的清除按钮
input[type="search"]::-webkit-search-cancel-button { display: none; }
- mac下生成ssh key
ssh -v usage: ssh [-1246AaCfGgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec] [-D [bind_address: ...
- Hihocoder1458-Parentheses Matching(stack,vector)
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Given a string of balanced parentheses output all the matchin ...