Sargable 与 谓语下推 (predicate pushdown) 简介
关键词:SQL优化 , sargable , pushdown filter , predicate pushdown
Sargable
Sargable = Search ARGument ABLE ,即SQL中可利用数据库自身索引优势对查询条件进行执行性能优化。换句话说,即可以利用存储层的索引优势来优化的查询条件。wikipedia: https://en.wikipedia.org/wiki/Sargable
典型的案例就是SQL中的WHERE条件,一个条件单元一般是一个函数作用于一个列/字段的数据;ORDER BY, GROUP BY, HAVING 等有时候也可Sargable。
- Sargable operators: =, >, <, >=, <=, BETWEEN, LIKE, IS [NOT] NULL
- Sargable operators that rarely improve performance: <>, IN, OR, NOT IN, NOT LIKE
通常一个操作是否可Sargable比较好判断,当你足够了解存储层,你便知道这个操作是否可以转化为基于索引的查询或变成一些谓语下推(pushdown filter) 的方式。
但是多个操作联合的时候就麻烦了,多个操作的逻辑联合主要包括AND和OR,特殊的还有NOT,不考虑自定义函数。
predicate pushdown (谓语下推、谓语前推)
有时英语表示为 pushdown filter (下推过滤),是一个来自关系型数据库的术语,最近也广泛被NoSQL所借用。比较详细一个示例解释见Hive https://cwiki.apache.org/confluence/display/Hive/FilterPushdownDev。
Hive的解释:Predicate pushdown is a term borrowed from relational databases even though for Hive it is predicate pushup. The basic idea is to process expressions as early in the plan as possible.
通俗理解,就是在实际数据读取和SQL实际执行之前预先执行条件语句进行预处理和过滤。
## Why we need to understand Sargable
在很多SQL查询场景中,并不是所有的where都能得到优化,如果你的where语句是不可优化的,很可能你动辄就做了一个扫全表的操作。很多入门学习使用MySQL的人因为玩的量比较小,所以一般都没关注这点,等到量上去几百万千万了,才发现字段需要做索引使其可优化。而另一个更需要关注的场景是Hive这类SQL like数据查询引擎。很多这类查询引擎套了层SQL接口,但底层不一定做了针对性优化。比如Hive虽然可以通过StorageHandler来支持不同的存储层(HDFS/HBase/ES等),但是像HBase和ES,一个不小心就是full scan,全部拿回来做mapreduce,在mr中才进行where的过滤。
对于不同的存储数据库来说,Sargable Operators不完全一样,比如HBase支持按前缀过滤的Scan Filter,而ES默认是不支持的;ES支持OR操作的索引查询,HBase的FilterList是AND的关系。因此想去做针对性优化时,熟悉Hive的Operators和数据库能支持的predicate pushdown或索引查询都是不可或缺的。
另外还有的情况是,对于SQL语义一样的两条不同写法的查询,优化支持可能会不一样;有些查询条件看起来可优化但因为存储层支持的原因变得不可优化了。前者有一定工作经验的人都能理解,不然为什么需要做SQL查询优化和管理;后者一定程度上可以说是个坑,尤其对于使用者。对于后者要么给于更清晰的使用和文档指引,要么帮助做一些SQL查询计划的优化。但这样一来的话优化的也有限,而且不通用了(像hive-ql就是通用的)。所以解决方案见仁见智,还是要根据需求场景来决定。
本文只是个引子,在数据仓库的需求越来越大的市场下,这种优化是需要被人重视的。
Sargable 与 谓语下推 (predicate pushdown) 简介的更多相关文章
- Hive优化之谓词下推
Hive优化之谓词下推 解释 Hive谓词下推(Predicate pushdown) 关系型数据库借鉴而来,关系型数据中谓词下推到外部数据库用以减少数据传输 基本思想:尽可能早的处理表达式 属于逻辑 ...
- 大数据SQL中的Join谓词下推,真的那么难懂?
听到谓词下推这个词,是不是觉得很高大上,找点资料看了半天才能搞懂概念和思想,借这个机会好好学习一下吧. 引用范欣欣大佬的博客中写道,以前经常满大街听到谓词下推,然而对谓词下推却总感觉懵懵懂懂,并不明白 ...
- 2017 ES GZ Meetup分享:Data Warehouse with ElasticSearch in Datastory
以下是我在2017 ES 广州 meetup的分享 ppt:https://elasticsearch.cn/slides/11#page=22 摘要 ES最多使用的场景是搜索和日志分析,然而ES强大 ...
- Spark SQL 笔记
Spark SQL 简介 SparkSQL 的前身是 Shark, SparkSQL 产生的根本原因是其完全脱离了 Hive 的限制.(Shark 底层依赖于 Hive 的解析器, 查询优化器) Sp ...
- HBase笔记--filter的使用
HBASE过滤器介绍: 所有的过滤器都在服务端生效,叫做谓语下推(predicate push down),这样可以保证被过滤掉的数据不会被传送到客户端. 注意: 基于字符串的比较器,如 ...
- What’s new for Spark SQL in Apache Spark 1.3(中英双语)
文章标题 What’s new for Spark SQL in Apache Spark 1.3 作者介绍 Michael Armbrust 文章正文 The Apache Spark 1.3 re ...
- 大数据:Parquet文件存储格式
一.Parquet的组成 Parquet仅仅是一种存储格式,它是语言.平台无关的,并且不需要和任何一种数据处理框架绑定,目前能够和Parquet适配的组件包括下面这些,可以看出基本上通常使用的查询引擎 ...
- 大数据:Parquet文件存储格式【转】
一.Parquet的组成 Parquet仅仅是一种存储格式,它是语言.平台无关的,并且不需要和任何一种数据处理框架绑定,目前能够和Parquet适配的组件包括下面这些,可以看出基本上通常使用的查询引擎 ...
- Parquet 格式文件
Apache Parquet是Hadoop生态圈中一种新型列式存储格式,它可以兼容Hadoop生态圈中大多数计算框架(Hadoop.Spark等),被多种查询引擎支持(Hive.Impala.Dril ...
随机推荐
- [转] Javascript模块化编程(一):模块的写法
随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞大,越来越复杂. 网页越来越像桌面程序,需要一个团队分工协作.进度管理.单元测试等等......开发者 ...
- [转]CR, LF, CR/LF区别与关系
http://weizhifeng.net/talking-about-cr-lf.html 前言 在文本处理中,CR(Carriage Return),LF(Line Feed),CR/LF是不同操 ...
- jQuery中live函数的替代-【jQuery】
在老版本的jQuery中,当需要对页面上某个由ajax加载的某片段的页面内容响应事件时,可以使用live函数来响应其事件,比如: $('a').live('click', function() { b ...
- 【转】Android 模拟器横屏竖屏切换设置
http://blog.csdn.net/zanfeng/article/details/18355305# Android 模拟器横屏竖屏切换设置时间:2012-07-04 来源:设计与开发 ...
- COMException: The data necessary to complete this operation is not yet available.
问题描述: 最近在公司AE项目中遇到了下面的问题: COMException: The data necessary to complete this operation is not yet ava ...
- plt实现动态画图
用pycharm跑的没有出现动态线条的话: 1.点击setting,输入关键字Scien...搜索出Python Scientific, 在右侧去掉对勾(默认是勾选的),然后右下角Apply--OK, ...
- 分布式配置hadoop2.5.0 2.6.x
1. sudo vim /etc/hostname 在master的机器上,改成 master 在slave上写 slave01,02,03...... 配置好后重启. 2. sudo vi ...
- Linux安装Tomcat-Nginx-FastDFS-Redis-Solr-集群——【第七集之SSH远程连接——克隆与更改配置】
一.SSH远程连接 OpenSSH的安装 查看是否安装Openssh:rpm -qa | grep ssh搜索openssh安装包:yum search openssh安装openssh:yum in ...
- 最接近的三数之和(给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数, 使得它们的和与 target 最接近。返回这三个数的和)
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1. 与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2). 思路:首先对数组进行排序 ...
- MATLAB视频读取转换为图片
转换mp4到jpg格式的图片: % convert .mp4 to jpg picture t='C:\Documents and Settings\luokh\桌面\Matlab编程\Matlab编 ...