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

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要进行排序操作
  • 用UNION ALL加GROUP BY的方式对UNION改写

上一篇:【 PostgreSQL】工作中常用SQL语句干货

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

【 PostgreSQL】十条实用数据库SQL优化建议的更多相关文章

  1. OCM_第十四天课程:Section6 —》数据库性能调优_各类索引 /调优工具使用/SQL 优化建议

    注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...

  2. 数据库sql优化总结之5--数据库SQL优化大总结

    数据库SQL优化大总结 小编最近几天一直未出新技术点,是因为小编在忙着总结整理数据库的一些优化方案,特此奉上,优化总结较多,建议分段去消化,一口吃不成pang(胖)纸 一.百万级数据库优化方案 1.对 ...

  3. SQL优化:一些简单的又实用的SQL优化方案【转】

    面试过程中,面试官有极高的频率会问道数据库的优化,SQL语句的优化,网上关于SQL优化的教程很多,但是鱼目混杂,显得有些杂乱不堪.近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请 ...

  4. 我的mysql数据库sql优化原则

    原文 我的mysql数据库sql优化原则 一.前提 这里的原则 只是针对mysql数据库,其他的数据库 某些是殊途同归,某些还是存在差异.我总结的也是mysql普遍的规则,对于某些特殊情况得特殊对待. ...

  5. 数据库sql优化方案

    声明:这个不是我自己写的,是我们老师给我,我拿出来分享一下! 为什么要优化:     随着实际项目的启动,数据库经过一段时间的运行,最初的数据库设置,会与实际数据库运行性能会有一些差异,这时我们    ...

  6. SQL优化- 数据库SQL优化——使用EXIST代替IN

    数据库SQL优化——使用EXIST代替IN 1,查询进行优化,应尽量避免全表扫描 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引 . 尝试下面的 ...

  7. 数据库SQL优化大总结之 百万级数据库优化方案(转载)

    网上关于SQL优化的教程很多,但是比较杂乱.近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充. 这篇文章我花费了大量的时间查找资料.修改.排版,希望大家阅读之后,感觉 ...

  8. 关于数据库SQL优化

    1.数据库访问优化   要正确的优化SQL,我们需要快速定位能性的瓶颈点,也就是说快速找到我们SQL主要的开销在哪里?而大多数情况性能最慢的设备会是瓶颈点,如下载时网络速度可能会是瓶颈点,本地复制文件 ...

  9. sql优化建议

    背景:        在北京工作期间,我们做应用开发的和后台数据库的联系非常大,我们经常在一起讨论存储过程或者是sql性能优化的事情来降低应用运行时的时间,提高性能,经过和数据库方面的工程师的一些讨论 ...

随机推荐

  1. Linux网络编程服务器模型选择之循环服务器

    在网络程序里面,通常都是一个服务器处理多个客户机,为了出个多个客户机的请求,服务器端的程序有不同的处理方式.本节开始介绍Linux下套接字编程的服务器模型选择,主要包括循环服务器模型.并发服务器模型. ...

  2. Javascript之in操作符的用法

    in操作符是js里面常用的一个操作符,下面是其几个常用的功能: 1.配合for语句循环遍历/迭代数组中的元素 2.配合for语句循环遍历/迭代集合中的属性 3.判断对象是否是数组的元素 4.判断对象是 ...

  3. Idea查看代码相关技巧

    (1)查看类中的属性与方法快捷键  Alt+7 (2)查看方法被调用 在方法上右键find usages (3)查看方法说明  Ctrl+Q

  4. Redis(2):常用命令详解

    redis命令不区分大小写 通用命令:1. 获得符合规则的键名列表: keys pattern   其中pattern符合glob风格  ? (一个字符) * (任意个字符) [] (匹配其中的任意一 ...

  5. angular2自学笔记(二)---路由、服务等八大主要构造块

    angular的思想:总是把数据访问工作委托给一个支持性服务类. Angular 应用的:用 Angular 扩展语法编写 HTML 模板, 用组件类管理这些模板,用服务添加应用逻辑, 用模块打包发布 ...

  6. java并发编程(7)构建自定义同步工具及条件队列

    构建自定义同步工具 一.通过轮询与休眠的方式实现简单的有界缓存 public void put(V v) throws InterruptedException { while (true) { // ...

  7. Redis 【string】 一句话说明

    APPEND----------------------------------------------在字符串后面追加 BITCOUNT------------------------------- ...

  8. 十二:video 视频

    属性名 类型 默认值 说明 src String   要播放视频的资源地址 controls Boolean true 是否显示默认播放控件(播放/暂停按钮.播放进度.时间) danmu-list O ...

  9. <深入理解JavaScript>学习笔记(2)_揭秘命名函数表达式

    写在前面的话 注:本文是拜读了 深入理解JavaScript 之后深有感悟,故做次笔记方便之后查看. 感觉这章的内容有点深奥....略难懂啊. 先坐下笔记,加深一下印象吧. 我主要记一下自己感觉有用的 ...

  10. c# MVC模式学习笔记_数据验证

    改变显示字段名称 设计字段规范 1.引用 using System.ComponentModel; using System.ComponentModel.DataAnnotations; 2.Dis ...