vertica是惠普公司推出的列式分布式数据库,在OLAP领域有其独到的地方,目前社区版免费,但是只能存放1T的数据。我在工作中维护的bi系统后端就是使用的vertica数据库,平时也经常需要对于数据库的查询进行一些优化。所以写下这篇博客记录一下。

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

      

  2. 分析问题
    数据库调优,其实非常依赖于数据库本身提供的各种性能分析工具,例如执行计划解释器,跟着profile工具。在vertica中,可以通过profile,分析一条具体的sql语句。我们分析一条第一步中获取到的sql语句:

    获取到这个语句的transcation_idstatement_id 以后,可以通过查询系统表 query_plan_profiles获得语句实际的执行计划和各个阶段的执行时间,这个不同于执行计划,这是真实的执行过程。如图:

    sql的执行是从下往上的,在这个表里面列出了PATH ID,我们可以从PATH ID从大到小一步一步分析,每一步的执行耗时。注意PATH ID:4这一步,查询了一张事实表,cost是2K,处理了4M的数据。这一步就是我们分析的重点,因为它排在执行步骤的较前面并且处理了较多的数据。

  3. 解决问题
    通过运行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%)。

  4. 分析背后的机制

    为什么Vertica数据库获取了统计信息以后,就可以优化查询?因为这张事实表是按照dt字段进行分区,但是在没有统计信息的时候,即使查询条件带上了分区字段,仍然没有利用分区信息,通过查询v_monitor.query_events视图可以看到sql执行过程中发生的事件。优化之前:

    优化之后:

    其中PARTITIONS_ELIMINATED的描述Some storage containers will not be processed because they contain no relevant data说明分区信息起作用了。

  5. 总结
    简单的vertica优化,一步的步骤如下:
    1. 收集sql统计信息,找出执行次数很多或者执行时间久的sql语句。
    2. 对要优化是sql进行profile,拿到此次执行profile的transaction_id和statement_id
    3. 利用vertica本身提供的工具和系统表,例如Datab Designer、Workload Analyzer、query_plan_profiles、v_monitor.query_events得到sql的执行计划和具体的优化建议。

    对于查询的优化,从简单到复杂依次为:更新统计信息,运行database designer自动在表上建立projection(类似于物理视图)、手工建立projection 。

  6. 可以研究的地方
    同样是分区表, 为什么在oracle中如果查询条件带上了分区健,就能正确的利用分区信息进行优化,而且vertica确不行呢?我猜可能有以下几点可能
    1. 建表方式不对,所谓的分区并没有起到作用。(类似于vertica中的主键约束)
    2. vertica本身不支持,需要利用额外的统计信息去做优化。
    3. 因为应用是OLAP场景,每天导入的数据量过大,所以统计信息很快失效。

Vertica数据查询优化的更多相关文章

  1. SQL优化----百万数据查询优化

    百万数据查询优化 1.合理使用索引 索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率.现在大多数的数据库产品都采用IBM最先提出的ISAM索引结构.索引的使用要恰到好处,其使用原则如下: ...

  2. 通过sqoop来传输mysql/oracle/vertica数据至HBASE

    首先要注意将连接用的jar包,放到sqoop目录下,我的是/var/lib/sqoop 如果没有主键,则要加上-m 1 export正确的jdk目录 当做key的列必须唯一存在,不然报错 --mysq ...

  3. SQL大数据查询优化

    常写的SQL可能主要以实现查询出结果为主,但如果数据量一大,就会突出SQL查询语句优化的性能独特之处.一般的数据库设计都会建索引查询,这样较全盘扫描查询的确快了不少.下面总结下SQL查询语句的几个优化 ...

  4. mysql大数据查询优化

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

  5. 【MySQL】海量量数据查询优化

    参考资料: mysql处理海量数据时的一些优化查询速度方法:http://www.cnblogs.com/lingiu/p/3414134.html mysql千万级大数据SQL查询优化:http:/ ...

  6. Oracle 大数据查询优化方法

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

  7. 移动混合应用HTML5数据查询优化

    项目介绍 pheongap混合应用,跨平台,做应用加工厂提供应用模板编辑器~ 本地应用,完全是模拟IOS,安卓原生应用的实现,所以支持14种手势,所有PPT动画,视觉差效果,等等功能组合... 这是I ...

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

    背景:MySQL分页查询语句为 ,10; 一般页面还会获取总条数,这时候还需要一条查询总条数语句 , 这样数据库需要执行两次查询操作.MySQL提供了SQL_CALC_FOUND_ROWS追踪总条数的 ...

  9. [转载] erp开发-数据查询优化方法

    系统运行环境:MSSQL 2008随着公司业务快速发展,各种业务数据如火箭般的高速增长,出现一个又一个千万行数据的表,往往大表之间的关联,耗费系统大量的磁盘io,并且会影响正常的实时业务的操作,所以我 ...

随机推荐

  1. C# 获取excel架构并的导入sqlserver的方法

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  2. OAuth 2.0 Threat Model and Security Considerations (rfc6819)

    Authorization server The following data elements are stored or accessible on the authorization serve ...

  3. Winfrom实现圆角设计

    主要代码 public partial class Form1 : Form    {        public Form1()        {            InitializeComp ...

  4. 启动Tomcat时报 Expected stackmap frame at this location.(JDK1.7编译)

    从svn上下的项目,部署到tomcat 7.0.19 上, 并且配置的是jdk7.  启动时出现以下问题. Location: com/genlot/loms/service/SysPermissio ...

  5. sql server数据库操作

    --插入整行数据 , '1983-08-29', 'A', 'A', 'A') --插入部分列数据 , '1983-08-29') --删除行记录 delete from person where n ...

  6. eclipse中的代码提示功能

    Eclipse 的代码提示功能,具体配置 1. 打开Eclipse ,然后"window"→"Preferences" 2. 选择"java" ...

  7. jquery 清空 iframe 的内容,,iframe自适应高度

    $(iframe).contents().find("body").html(""); iframe自适应高度 $("#AllDescription& ...

  8. iOS.DistributionApp.1-mobile-provision-file[draft]

    .mobileprovision file 0. .mobileprovision file的作用 .mobileprovision file作用以及扮演的角色 1. 如何删除旧的.mobilepro ...

  9. NC 单据保存时间过长,判断数据库锁表解决办法

    SELECT s.sid, s.serial# FROM gv$locked_object l, dba_objects o, gv$session s WHERE l.object_id = o.o ...

  10. linux服务器apache 一个IP,一个端口,建立多个网站的方法。

    找到apache-tomcat-6.0.14\conf\server.xml ,再services 后面添加此段代码: Xml代码 <!-- 此处  新增的项目配置-->  <Ser ...