Vertica数据查询优化
vertica是惠普公司推出的列式分布式数据库,在OLAP领域有其独到的地方,目前社区版免费,但是只能存放1T的数据。我在工作中维护的bi系统后端就是使用的vertica数据库,平时也经常需要对于数据库的查询进行一些优化。所以写下这篇博客记录一下。
- 定位问题
所谓的数据库调优、程序优化之类的工作,实际上是一个解决问题的过程,而解决问题,第一部就是需要定位问题。找到问题的手段多种多样,可以通过分析程序、监控生产上服务器的性能、定期生成数据库的负载报告等手段,而最不应该的就是通过生产上用户的反馈来反映问题了,因为到了那个时候,一切都已经晚了。具体到vertica来说,通过QUERY_PROFILES这个数据库本身提供的视图,可以找到耗时和执行的多的sql语句。以下三条sql语句,分别统计出执行次数top10,单次执行耗时top10,执行总耗时top10的sql语句。SELECT
query,
count(*) as times
FROM
QUERY_PROFILES
WHERE
query_type = 'QUERY'
and query_start>='2015-02-13'
group by query
ORDER BY
times DESC limit 10;
SELECT
query,
avg(query_duration_us) as avg_cost
FROM
QUERY_PROFILES
WHERE
query_type = 'QUERY'
and query_start>='2015-02-13'
group by query
ORDER BY
avg_cost DESC limit 10;
SELECT
query,
sum(query_duration_us) as total_cost
FROM
QUERY_PROFILES
WHERE
query_type = 'QUERY'
and query_start>='2015-02-13'
group by query
ORDER BY
total_cost desc limit 10; - 分析问题
数据库调优,其实非常依赖于数据库本身提供的各种性能分析工具,例如执行计划解释器,跟着profile工具。在vertica中,可以通过profile,分析一条具体的sql语句。我们分析一条第一步中获取到的sql语句:
获取到这个语句的transcation_id和 statement_id 以后,可以通过查询系统表 query_plan_profiles获得语句实际的执行计划和各个阶段的执行时间,这个不同于执行计划,这是真实的执行过程。如图:

sql的执行是从下往上的,在这个表里面列出了PATH ID,我们可以从PATH ID从大到小一步一步分析,每一步的执行耗时。注意PATH ID:4这一步,查询了一张事实表,cost是2K,处理了4M的数据。这一步就是我们分析的重点,因为它排在执行步骤的较前面并且处理了较多的数据。
- 解决问题
通过运行analyze_wordload,可以得到对某个表具体的优化建议。我们对,PATH ID:4的这个步骤查询的事实表,进行分析,可以得到如下优化建议:
其中第一条指的是,运行vertica提供的database designer工具,对这个事实表建立映射,此方法代价比较大,而且只能对特定的查询优化,这里进行第二条操作,对于此事实表进行分析,得到它的统计信息。

这条命令,只会访问此表10%的数据,返回0表示成功。进行了统计信息之后,重新执行第1步和第2步,得到新的计划如下:

可以观察到,执行步骤被调整了,原来PATH ID:4的步骤比较耗时,现在被提前到PATH ID:5了,而且执行的成本和消耗资源也不一样,以下是详细对比:优化之前:
| | | +-- Outer -> STORAGE ACCESS for T330143 [Cost: 2K, Rows: 4M (NO STATISTICS)] (PATH ID: 4)
优化之后:
| | | +-- Outer -> STORAGE ACCESS for T330143 [Cost: 94, Rows: 18K] (PATH ID: 5)。
可见,对于事实表的dt自动进行分析以后,通过dt字段获取数据,扫描行数从4M减少到了18k,cost从2k减少了94,整个sql的执行时间也从0.34秒降低到了0.17秒。至此,此次优化得到了目的(执行时间减少了50%)。
- 分析背后的机制
为什么Vertica数据库获取了统计信息以后,就可以优化查询?因为这张事实表是按照dt字段进行分区,但是在没有统计信息的时候,即使查询条件带上了分区字段,仍然没有利用分区信息,通过查询v_monitor.query_events视图可以看到sql执行过程中发生的事件。优化之前:

优化之后:

其中PARTITIONS_ELIMINATED的描述Some storage containers will not be processed because they contain no relevant data说明分区信息起作用了。
- 总结
简单的vertica优化,一步的步骤如下:- 收集sql统计信息,找出执行次数很多或者执行时间久的sql语句。
- 对要优化是sql进行profile,拿到此次执行profile的transaction_id和statement_id
- 利用vertica本身提供的工具和系统表,例如Datab Designer、Workload Analyzer、query_plan_profiles、v_monitor.query_events得到sql的执行计划和具体的优化建议。
对于查询的优化,从简单到复杂依次为:更新统计信息,运行database designer自动在表上建立projection(类似于物理视图)、手工建立projection 。
- 可以研究的地方
同样是分区表, 为什么在oracle中如果查询条件带上了分区健,就能正确的利用分区信息进行优化,而且vertica确不行呢?我猜可能有以下几点可能- 建表方式不对,所谓的分区并没有起到作用。(类似于vertica中的主键约束)
- vertica本身不支持,需要利用额外的统计信息去做优化。
- 因为应用是OLAP场景,每天导入的数据量过大,所以统计信息很快失效。
Vertica数据查询优化的更多相关文章
- SQL优化----百万数据查询优化
百万数据查询优化 1.合理使用索引 索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率.现在大多数的数据库产品都采用IBM最先提出的ISAM索引结构.索引的使用要恰到好处,其使用原则如下: ...
- 通过sqoop来传输mysql/oracle/vertica数据至HBASE
首先要注意将连接用的jar包,放到sqoop目录下,我的是/var/lib/sqoop 如果没有主键,则要加上-m 1 export正确的jdk目录 当做key的列必须唯一存在,不然报错 --mysq ...
- SQL大数据查询优化
常写的SQL可能主要以实现查询出结果为主,但如果数据量一大,就会突出SQL查询语句优化的性能独特之处.一般的数据库设计都会建索引查询,这样较全盘扫描查询的确快了不少.下面总结下SQL查询语句的几个优化 ...
- mysql大数据查询优化
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- 【MySQL】海量量数据查询优化
参考资料: mysql处理海量数据时的一些优化查询速度方法:http://www.cnblogs.com/lingiu/p/3414134.html mysql千万级大数据SQL查询优化:http:/ ...
- Oracle 大数据查询优化方法
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- 移动混合应用HTML5数据查询优化
项目介绍 pheongap混合应用,跨平台,做应用加工厂提供应用模板编辑器~ 本地应用,完全是模拟IOS,安卓原生应用的实现,所以支持14种手势,所有PPT动画,视觉差效果,等等功能组合... 这是I ...
- EF获取多个数据集以及MySQL分页数据查询优化
背景:MySQL分页查询语句为 ,10; 一般页面还会获取总条数,这时候还需要一条查询总条数语句 , 这样数据库需要执行两次查询操作.MySQL提供了SQL_CALC_FOUND_ROWS追踪总条数的 ...
- [转载] erp开发-数据查询优化方法
系统运行环境:MSSQL 2008随着公司业务快速发展,各种业务数据如火箭般的高速增长,出现一个又一个千万行数据的表,往往大表之间的关联,耗费系统大量的磁盘io,并且会影响正常的实时业务的操作,所以我 ...
随机推荐
- 简单C语言文法
<程序>→<外部声明>|<程序><外部声明> <外部声明>→<函数定义>|<声明> <函数定义>→< ...
- linux命令行下的ftp 多文件下载和目录下载
安装:yum install ftp 使用:ftp + ip (未进入ftp状态下运行) ----------------------------------------- 目标ftp服务器是一个非标 ...
- Redis基础(转)
ServiceStack.Redis实践 Redis的C#客户端我选择的是ServiceStack.Redis,相比Booksleeve redis-sharp等方案,它提供了一整套从 Redi ...
- Git学习(一)——Git介绍与安装
一.Git诞生 Linus在1991年创建了Linux,从此,Linux系统不断发展,成为最大的服务器系统软件. 2005年,Linus用C编写了一个分布式版本控制工具--Git. 二.集中式vs分布 ...
- 2 Add Two Numbers
// Java public ListNode addTwoNumbers(ListNode l1, ListNode l2) { return add(l1, l2, false); } priva ...
- Appium移动自动化测试之问题总结
1.运行该测试用例,报如下错误 java.lang.NoSuchMethodError: org.openqa.selenium.remote.ErrorHandler.<init>(Lo ...
- BestCoder Round #90 //div all 大混战 一题滚粗 阶梯博弈,树状数组,高斯消元
BestCoder Round #90 本次至少暴露出三个知识点爆炸.... A. zz题 按题意copy Init函数 然后统计就ok B. 博弈 题 不懂 推了半天的SG..... 结果这 ...
- python——面向对象篇之异常和反射
内置函数isinstance和issubclass 1.1 isinstance用法: isinstance(string,str) 判断第一个参数是否是第二个参数的子集,例如: print isin ...
- WCF通过SVCUtil.exe生成客户端代理类和配置文件(转)
WCF服务调用通过两种常用的方式: 1:一种是借助代码生成工具SvcUtil.exe或者添加服务引用的方式. 2:一种是通过ChannelFactory直接创建服务代理对象进行服务调用. 本文只针对通 ...
- ajax跨域往php程序post数据时,php程序总是执行两次的解决方法
php程序是部署在IIS7上面,ajax提交数据时,遇到了两个问题,一个就是跨域,一个php程序总会被执行两次. 第一个问题的解决方法,是百度出来的,添加下面几行代码就可以了: header('Acc ...