为什么需要ANALYZE

  首先介绍下RBO和CBO,这是数据库引擎在执行SQL语句时的2种不同的优化策略。

  RBO(Rule-Based Optimizer)

  基于规则的优化器,就是优化器在优化查询计划的时候,是根据预先设置好的规则进行的,这些规则无法灵活改变。举个例子,索引优先于扫描,这是一个规则,优化器在遇到所有可以利用索引的地方,都不会选择扫描。这在多数情况下是正确的,但也不完全如此:

  比如一张个人信息表中性别栏目加上索引,由于性别是只有2个值的枚举类,也就是常说的基数非常低的列,在这种列上使用索引往往效果还不如扫描。

  因此RBO的优化方式是死板的,粗放的,目前已逐渐被CBO方式取代。

  CBO(Cost Based Optimizer)

  基于代价的优化器,就是优化器在优化查询计划的时候,是根据动态计算出来的Cost(代价)来判断如何进行选择。那如何计算代价呢?这里一般是基于代价模型和统计信息,代价模型是否合理,统计信息是否准确都会影响优化的效果。

  还是拿上面员工性别统计为例,在CBO的优化方式下,物理计划就不会选择走索引。当然上面的例子比较简单,在Greenplum运行的复杂SQL中,优化器最核心的还是在scan和join的各种实现方式中做出选择,这才是能大幅提升性能的关键点。

  前面提到CBO需要一个代价模型和统计信息,代价模型和规则一样,需要预先设置好,那统计信息是如何收集的?多数基于CBO优化的计算引擎,包括Greenplum,Oracle,Hive,Spark等都类似,除了可以按一定规则自动收集统计信息外,还都支持手动输入命令进行收集,通常这个命令都叫ANALYZE。

  结论:由于CBO优化的需求,因此我们需要使用ANALYZE命令去收集统计信息。

  ANALYZE怎么使用

  说明

  ANALYZE是Greenplum提供的收集统计信息的命令。

  ANALYZE支持三种粒度,列,表,库,如下:

-- 创建表
CREATE TABLE open.t_ttt(f_id bigint,f_name character varying(128)
) WITH (appendonly=true) DISTRIBUTED BY (f_id);
-- 只搜集f_name列的统计信息
ANALYZE open.t_ttt(f_name);
-- 搜集open.t_ttt表的统计信息
ANALYZE open.t_ttt;
-- 搜集当前库所有表的统计信息,需要有权限才行
ANALYZE;

  限制

  ANALYZE会给目标表加SHARE UPDATE EXCLUSIVE锁,也就是与UPDATE,DELETE,还有DDL语句冲突。

  速度

  ANALYZE是一种采样统计算法,通常不会扫描表中所有的数据,但是对于大表,也仍会消耗一定的时间和计算资源。

  采样统计会有精度的问题,因此Greenplum也提供了一个参数default_statistics_target,调整采样的比例。简单说来,这个值设置得越大,采样的数量就越多,准确性就越高,但是消耗的时间和资源也越多。

  直接修改服务器的参数会影响整个集群,通常不建议这样操作。如果确实有需要,可以尝试只修改某列的对应参数,如下:

  ALTER TABLE {table_name} ALTER COLUMN {col_name} SET STATISTICS {-1|0-1000};

  时机

  根据上文所述,ANALYZE会加锁并且也会消耗系统资源,因此运行命令需要选择合适的时机尽可能少的运行。根据Greenplum官网建议,以下3种情况发生后建议运行ANALYZE

  批量加载数据后,比如COPY

  创建索引之后

  INSERT,UPDATE,DELETE大量数据之后

  自动化

  除了手动运行,ANALYZE也可以自动化。实际上默认情况下,我们对空表写入数据后,Greenplum也会自动帮我们收集统计信息,不过之后在写入数据,就需要手动操作了。

  有2个参数可以用来调整自动化收集的时机,gp_autostats_mode和gp_autostats_on_change_threshold。gp_autostats_mode默认是on_no_stats,也就是如果表还没有统计信息,这时候写入数据会导致自动收集,这之后,无论表数据变化多大,都只能手动收集了。如果将gp_autostats_mode修改为on_change,就是在数据变化量达到gp_autostats_on_change_threshold参数配置的量之后,系统就会自动收集统计信息。

  分区表

  Greenplum官网对于分区表的ANALYZE专门进行了讲解,其实只要保持默认值,不去修改系统参数optimizer_analyze_root_partition,那么对于分区表的操作并没有什么不同,直接在root表上进行ANALYZE即可,系统会自动把所有叶子节点的分区表的统计信息都收集起来。

  如果分区表的数目很多,那在root表上进行ANALYZE可能会非常耗时,通常的分区表都是带有时间维度的,历史的分区表并不会修改,因此单独ANALYZE数据发生变化的分区,是更好的实践。

  命令:analyze[talbe[(column,..)]]

  收集表内容的统计信息,以优化执行计划。如创建索引后,执行此命令,对于随即查询将会利用索引。

  自动统计信息收集

  在postgresql.conf中有控制自动收集的参数gp_autostats_mode设置,gp_autostats_mode三个值:none、no_change、on_no_stats(默认)

  none:禁止收集统计信息

  on change:当一条DML执行后影响的行数超过gp_autostats_on_change_threshold参数指定的值时,会执行完这条DML后再自动执行一个analyze的操作来收集表的统计信息。

  no_no_stats:当使用create talbe as select、insert、copy时,如果在目标表中没有收集过统计信息,那么会自动执行analyze来收集这张表的信息。gp默认使用on_no_stats,对数据库的消耗比较小,但是对于不断变更的表,数据库在第一次收集统计信息之后就不会再收集了。需要人为定时执行analyze。

  如果有大量的运行时间在1分钟以下的SQL,你会发现大量的时间消耗在收集统计信息上。为了降低这一部分的消耗,可以指定对某些列不收集统计信息,如下所示:1.create table test(id int,name text,note text);上面是已知道表列note不需出现在join列上,也不会出现在where语句的过滤条件下,因为可以把这个列设置为不收集统计信息:1.alter table test alter note SET STATISTICS 0;

Greenplum性能优化analyze相关推荐

  1. 游戏开发性能优化经验总结

    优化概论 说起游戏的优化,在游戏开发中经常分为这几步: 首先要确定游戏中经常会出现哪些问题 – Profile 然后确定在哪些方向进行性能优化 – Analyze 最后再尽可能将问题逐个解决 – So ...

  2. 网易视频云:游戏开发性能优化经验总结

    网易视频云是网易倾力打造的一款基于云计算的分布式多媒体处理集群和专业音视频技术,为客户提供稳定流畅.低时延.高并发的视频直播.录制.存储.转码及点播等音视频的PaaS服务.在线教育.远程医疗.娱乐秀场 ...

  3. 带你重走 TiDB TPS 提升 1000 倍的性能优化之旅

    今天我们来聊一下数据库的性能优化,第一部分简单介绍一下性能优化的通用的方法,第二部分我们讲一个实际案例. 性能优化这个事情核心只有一句话,用户响应时间去哪儿了?性能优化很困难的原因在于,为了定位用户响 ...

  4. Oracle数据库管理----性能优化

    https://blog.csdn.net/yzllz001/article/details/54848513 数据库访问优化法则 要正确的优化SQL,我们需要快速定位能性的瓶颈点,也就是说快速找到我 ...

  5. MySQL性能优化速记

    MySQL性能优化速记http://www.bieryun.com/3064.html 总结自<MySQL 5.7从入门到精通(视频教学版)>刘增杰编著. 优化简介 MySQL数据库优化是 ...

  6. 高级SQL优化(二) ——《12年资深DBA教你Oracle开发与优化——性能优化部分》

    目录: Oracle数据完整性和锁机制  索引及优化之表分析  表分析.约束及表间关系  Oracle体系结构1 Oracle体系结构2  海量数据库及分区1  海量数据库及分区2  海量数据库及分区 ...

  7. Android性能优化 - 消除卡顿

    性能优化系列阅读 Android性能优化 性能优化 - 消除卡顿 性能优化 - 内存优化 性能分析工具 - TraceView Android性能分析工具 消除卡顿 什么是卡顿及卡顿的衡量标准 产生卡 ...

  8. mysql同时满足升序和降序_MySQL性能优化(三):索引

    点击上方蓝色"码农架构",选择"设为星标" 专注于高可用.高性能.高并发类技术分享! 索引原理 如果一本新华字典假如没有目录,想要查找某个字,就不得不从第一页开 ...

  9. [官方] mysql 性能优化文档(中英文自译)

    大家好,我是烤鸭: 根据官方文档翻译并精简部分内容.建议有时间的朋友下载原版查看,全文106页pdf,快的话1-2天就能看完.自己翻译的有些地方可能不完整,欢迎指正. 官方pdf下载,需登录: htt ...

  10. 事务对性能影响_MySQL数据库性能优化史诗级大总结

    点击上方蓝色字体,选择"设为星标" 回复"资源"获取更多资源 大数据技术与架构点击右侧关注,大数据开发领域最强公众号! 大数据真好玩点击右侧关注,大数据真好玩! ...

最新文章

  1. 测试如何开始像用户那样思考(译)
  2. Silver Cow Party POJ - 3268(dijkstra+反向交换)
  3. mysql查当前用户的的命令_mysql命令大全用户管理相关命令
  4. 全连接的多层神经网络结构(MultiLayerNet)
  5. HDU2050 折线分割平面【切割平面】
  6. Git——撤销和删除操作【git restore / git rm 】
  7. placeHolder 兼容所有浏览器
  8. 《推荐系统实践》(一)好的推荐系统
  9. python图书管理实训报告总结_图书管理系统设计实训报告
  10. 广东开放大学形考任务保险学原理(本,2022春)形考三答案
  11. 如何提高数学分析水平(转载)
  12. 常州华翎六月风钢管舞惊人的优势
  13. [原创]分析某app直播地址的过程
  14. block标签、inline标签、inline-block标签的特点
  15. 肯德基创始人,在1009次失败后...
  16. CreateCompatibleDC 和 CreateCompatibleBitmap
  17. 让ie6,ie7,ie8支持 css3 的部分属性实现全兼容
  18. LVS NAT模式搭建
  19. 叶成-人员管理-机构管理
  20. LINUX 学习方法 (兄弟连)

热门文章

  1. 【MATLAB】MATLAB 仿真 — 模拟调制系统 之 AM 调制过程
  2. 2.jQuery常见API
  3. 此Apple ID尚未在iTunes Store Apple Id登录苹果商店(App Store)身份验证提示需要官网技术支持
  4. 嵌入式系统设计师教程 软考指定教材 高清PDF版
  5. 秒懂,Java 注解 (Annotation)你可以这样学
  6. python爬虫之使用urllib模块实现有道翻译功能
  7. php7.2 eregi,php – 函数eregi()已弃用
  8. 四线电阻式触摸屏原理
  9. 谈谈EMC Unity名字侵权官司,送竞争分析点评
  10. 采用计算机对酒店客房进行管理,酒店客房管理系统—计算机毕业设计论文.doc...