定位问题

所谓的数据库调优、程序优化之类的工作,实际上是一个解决问题的过程,而解决问题,第一部就是需要定位问题。找到问题的手段多种多样,可以通过分析程序、监控生产上服务器的性能、定期生成数据库的负载报告等手段,而最不应该的就是通过生产上用户的反馈来反映问题了,因为到了那个时候,一切都已经晚了。具体到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 java_Vertica数据查询优化相关推荐

  1. 百万数据查询优化技巧三十则,新增5条

    百万数据查询优化技巧三十则 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判 ...

  2. Vertica数据查询优化

    vertica是惠普公司推出的列式分布式数据库,在OLAP领域有其独到的地方,目前社区版免费,但是只能存放1T的数据.我在工作中维护的bi系统后端就是使用的vertica数据库,平时也经常需要对于数据 ...

  3. [转]百万数据查询优化技巧三四则

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  4. MongoDb 大数据查询优化、 MongoDB 索引、复合索引、唯一索引、 explain 分 析查询速度

    一.索引基础 索引是对数据库表中一列或多列的值进行排序的一种结构,可以让我们查询数据库变得 更快. MongoDB 的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的查询优化技巧. 下面是 ...

  5. 百万数据查询优化技巧三十则

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  6. qq空间代码查询_Mysql千万级大数据查询优化经验,一点课堂(多岸学院)

    提高mysql千万级大数据SQL查询优化30条经验(Mysql索引优化注意) 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避 ...

  7. SQL大数据查询优化

    1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  8. EF获取多个数据集以及MySQL分页数据查询优化

    背景:MySQL分页查询语句为 SELECT * FROM TABLE LIMIT 0,10; 一般页面还会获取总条数,这时候还需要一条查询总条数语句 SELECT COUNT(*) FROM TAB ...

  9. 千万级别数据查询优化_MySQL大数据量分页查询方法及其优化

    MySQL大数据量分页查询方法及其优化 ---方法1: 直接使用数据库提供的SQL语句 ---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N ---适 ...

最新文章

  1. mysql 匹配 findinset
  2. 人人可用的在线抠图,还是AI自动化的那种!北大校友的算法被玩出新高度
  3. web页面实现地图展示,可缩放,标点并点击---使用高德地图
  4. 【数据可视化应用】华夫饼型柱状图(附R语言代码)
  5. 使用阿里云ACM简化你的Spring Cloud微服务环境配置管理 1
  6. POJ - 3417 Network(树上差分)
  7. AD转换中参考电压的作用 .
  8. JDK8之后的 接口的新特性:
  9. cannot register datanode 0.0.0.0:1002,because current license expired time is
  10. 论通过测试与失败测试
  11. 软件工程师 算法工程师_如何像软件工程师一样撰写文章
  12. 【转载】世界上最牛的编辑器: Vim 3 (原创动图演示所有例子!)
  13. python去除停用词_python jieba分词如何去除停用词
  14. oracle临时表怎么删除吗,删除Oracle临时表
  15. 01-12.产品经理入门到精通(一)
  16. 我国出生率跌破1%,有什么影响?
  17. 重启PocketPC移动设备
  18. tween.js 中文使用指南 1
  19. linux硬盘识别过程
  20. 借京东图文识别baseline 来看clip训练过程。 clip是怎样练成的 。

热门文章

  1. 【深入理解C++】头文件防卫式声明
  2. mysql3306端口被占用无法终止_Mysql3306端口被占用无法启动解决办法
  3. ActionScript 3.0 杂乱笔记3
  4. PowerMockito Mock私有方法
  5. 如何使用 FFmpeg 进行视频转码:字幕
  6. 简单C语言的框架结构
  7. 02. Yii 2.0 框架的目录结构
  8. 惊了!这里竟然有你的生日和银行卡密码?
  9. 关于m3u8转MP4的几种情况
  10. ESXI 6.7全面系统教程~esxi安装win10