基于PostgreSQL,总结几条常用的查询操作的优化建议,部分也适用于Oracle等数据库。

推荐工具书《greenplum企业应用实战》国内首本Greenplum方面的著作。

1.选择合适的分布键

分布键选择不当会导致重分布、数据分布不均等,而数据分布不均会使SQL集中在一个segment节点的执行,限制了gp整体的速度。查看某表是否分布不均:

select gp_segment_id,count(*) from table_name group by gp_segment_id ;

例子如图:

2.使用分区表

按照某字段进行分区,不影响数据在数据节点上的分布,但是,仅在单个数据节点上,对数据进行分区存储。可以加快分区字段的查询速度。

3.压缩表

对于大AO表和分区表使用压缩,以节省存储空间并提高系统I/O,也可以在字段级别配置压缩。应用场景:

  • 不需要对表进行更新和删除操作
  • 访问表的时候基本上是全表扫描,不需要建立索引
  • 不能经常对表添加字段或者修改字段类型

4.分组扩展

Greenplum数据库的GROUP BY扩展可以执行某些常用的计算,且比应用程序或者存储过程效率高。

  • ROLLUP 对分组字段(或者表达式)从最详细级别到最顶级别计算聚合计数。ROLLUP的参数是一个有序分组字段列表,它计算从右向左各个级别的聚合。
  • CUBE 为分组字段的所有组合计算聚合。
  • GROUPING SETS 指定对那些字段计算聚合,它可以比ROLLUP和CUBE更精确地控制分区条件。

例子如下:

5.窗口函数

窗口函数可以实现在结果集的分组子集上的聚合或者排名函数,例如 sum(population) over (partition by city)。窗口函数功能强大,性能优异。因为它在数据库内部进行计算,避免了数据传输。

  • 窗口函数row_number()计算一行在分组子集中的行号,例如 row_number() over (partition by city order by id)。
  • 如果查询计划显示某个表被扫描多次,那么通过窗口函数可能可以降低扫描次数。
  • 窗口函数通常可以避免使用自关联。

6.列存储和行存储

列存储亦即同一列的数据都连续保存在一个物理文件中,有更高的压缩率,适合在款表中对部分字段进行筛选的场景。

需要注意的是:若集群中节点较多,而且表的列也较多,每个节点的每一列将会至少产生一个文件,那么总体上将会产生比较多的文件,对表的DDL操作就会比较慢。在和分区表使用时,将会产生更多文件,甚至可能超过Linux的文件句柄限制,要尤其注意。

  • 行存储:如果记录需要update/delete,那么只能选择非压缩的行存方式。对于查询,如果选择的列的数量经常超过30个以上的列,那么也应该选择行存方式。
  • 列存储:如果选择列的数量非常有限,并且希望通过较高的压缩比换取海量数据查询时的较好的IO性能,那么就应该选择列存模式。其中,列存分区表,每个分区的每个列都会有一个对应的物理文件,所以要注意避免文件过多,导致可能超越linux上允许同时打开文件数量的上限以及DDL命令的效率很差。

7.函数和存储过程

虽然支持游标,但是尽量不要使用游标方式处理数据,而是应该把数据作为一个整体进行操作。

8.索引使用

  • 如果是从超大结果集合中返回非常小的结果集(不超过5%),建议使用BTREE索引(非典型数据仓库操作)
  • 表记录的存储顺序最好与索引一致,可以进一步减少IO(好的index cluster索引簇)
  • where条件中的列用or的方式进行join,可以考虑使用索引
  • 键值大量重复时,比较适合使用bitmap索引

9.改写NOT IN

在gp4.3中已经进行了优化,采用hash left anti semi join进行连接。

以下只针对gp4.1及之前

  • 有not in的SQL,都会采用笛卡尔积来执行,采用nested join,效率极差
  • not in改用left join去重后的表关联来实现

例子如下:

select * from test1 where col1 not in (select col2 from test1)

改为:select * from test1 a left join (select col2 from test1 group bycol2) b on a.col1=b.col2 where b.col2 is null

10.其它优化技巧

  • 用group by对distinct改写,因为DISTINCT要进行排序操作,Greenplum4.3版本中distinct跟group by都采用HashAggregate这种形式,性能区别不大
  • 用UNION ALL加GROUP BY的方式对UNION改写

上一篇:【gp数据库】工作中常用DDL和DCL语句干货

下一篇:【gp数据库】后台周期执行函数实例(shell+crontab)

【gp数据库】十条实用数据库SQL优化建议相关推荐

  1. MySQL · 性能优化· CloudDBA SQL优化建议之统计信息获取

    阿里云CloudDBA具有SQL优化建议功能,包括SQL重写建议和索引建议.SQL索引建议是帮助数据库优化器创造最佳执行路径,需要遵循数据库优化器的一系列规则来实现.CloudDBA需要首先计算表统计 ...

  2. mysql advisor github_GitHub - zyw/sqladvisor-web: 美团SQLAdvisor SQL优化建议工具的Web版,告别命令行...

    sqladvisor-web 美团SQLAdvisor SQL优化建议工具的Web版,告别命令行. 项目中使用的美团SQL分析工具是在CentOS上编译的,所以建议部署到CentOS上. 该项目是使用 ...

  3. mysql 查找数据过程_mysql数据库查询过程探究和优化建议

    查询过程探究 我们先看一下向mysql发送一个查询请求时,mysql做了什么? 如上图所示,查询执行的过程大概可分为6个步骤: 客户端向MySQL服务器发送一条查询请求 服务器首先检查查询缓存,如果命 ...

  4. sql优化建议与技巧

    在sql查询中为了提高查询效率,我们常常会采取一些措施对查询语句进行sql优化,下面总结的一些方法,有需要的可以参考参考. 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 ord ...

  5. SQL优化建议(不定时更新添加)

    1.临时表和非日志表的存储方式建议和基表相同.当基表为行存(列存)表时,临时表和非日志表也推荐创建为行存(列存)表,可以避免行列混合关联带来的高计算代价. 2.索引字段的总长度不超过50字节.否则,索 ...

  6. Oracle的SQL优化建议

    第一.SQL语句尽量用大写的 因为oracle总是先解析SQL语句,把小写的字母转换成大写的再执行 第二.使用表的别名 当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上. ...

  7. sql 查询重复数据大于2条以上的_「干货」关于SQL书写建议 索引优化的总结,你值得拥有...

    前言 平时写sql写的比较多,一直没把优化相关的知识整理记录下来,本文章记录对SQL优化的一些技巧: 我将结合demo(一个百万级数据表),去实践验证这些优化技巧. 测试用例 接下来,我们创建一个测试 ...

  8. 阿里云数据库与传统数据库有何区别?

    阿里云数据库是什么呢?云数据库与传统数据库有哪些区别呢?很多人对两者之间的概念不是很了解,本文将详细介绍阿里云数据库与传统数据库的区别. 有需要购买阿里云数据库或其它任何产品,领取专属优惠代金券! 领 ...

  9. 人工智能自动sql优化工具--SQLTuning for SQL Server

    SQL语句是对数据库进行操作的惟一途径,对数据库系统的性能起着决定性的作用.对于同一条件下的SQL语句写法有很多,其中一些写法往往对性能又有很大影响.但是每个人掌握SQL语言的水平不同,如何才能保证写 ...

  10. 关于SQL优化的几点说明

    1. ORACLE DBA是如何进行SQL优化的 作为一个Oracle数据库管理员(DBA),SQL优化是他们的日常工作之一,主要目标是优化查询性能,减少查询时间,并提高数据库的整体性能. 以下是Or ...

最新文章

  1. include 路由 php,PHP简单路由
  2. winform关闭当前form_C#中WinForm程序退出方法技巧总结
  3. 螺丝孔槽中的螺丝拧花了的物理原理分析
  4. wxpy 0.1.2微信机器人 / 优雅的微信个人号API
  5. WebStorm导入git.exe报错 Empty git --version output:
  6. Python中的特殊方法、属性和迭代器
  7. python中或语句_python判断语句怎么写
  8. 基于区域生长算法的图像分割python_基于区域分割(图像分割)
  9. spss分析方法-对应分析(转载)
  10. Unexpected Exception caught setting 异常解决记录
  11. java基础知识复习(上半)
  12. 统计学习 EM算法 Python实现
  13. 公司内网与外网同时使用
  14. 如何借势世界杯?看这10个运营活动就够了
  15. 微型计算机的硬件结构采用,微型计算机硬件结构内部结构
  16. 西门子plm_宇航联合西门子助力新能源汽车龙头企业比亚迪,打造PLM产品全生命周期的信息化管理...
  17. 泰达机器人董事长_2017深圳机器人年度评选颁奖盛典
  18. 工具推荐:数据分析少不了这些可视化工具
  19. WMI 的奇怪错误 0x80041003
  20. 大陆地区ubuntu使用snap下载速度过慢问题

热门文章

  1. 重装助手教你如何在Windows中正确调整屏幕分辨率设置
  2. SSIS变量如何获取当前的系统时间(字符串格式年月日)
  3. C#_HelloWorld 篇
  4. REVIT插件 | 建模助手这次的版本更新,BIMer都笑了
  5. 阿铭Linux_网站维护学习笔记201903021
  6. 什么是操作系统啊 | 战术后仰
  7. JAVA通过Jemter工具并发测试
  8. ps6人脸识别液化工具在哪_PS上手指南 篇五:玩转人脸识别液化
  9. 对测试开发工程师的理解
  10. Qt学习(一)ui界面的设计