关键词: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) 简介的更多相关文章

  1. Hive优化之谓词下推

    Hive优化之谓词下推 解释 Hive谓词下推(Predicate pushdown) 关系型数据库借鉴而来,关系型数据中谓词下推到外部数据库用以减少数据传输 基本思想:尽可能早的处理表达式 属于逻辑 ...

  2. 大数据SQL中的Join谓词下推,真的那么难懂?

    听到谓词下推这个词,是不是觉得很高大上,找点资料看了半天才能搞懂概念和思想,借这个机会好好学习一下吧. 引用范欣欣大佬的博客中写道,以前经常满大街听到谓词下推,然而对谓词下推却总感觉懵懵懂懂,并不明白 ...

  3. 2017 ES GZ Meetup分享:Data Warehouse with ElasticSearch in Datastory

    以下是我在2017 ES 广州 meetup的分享 ppt:https://elasticsearch.cn/slides/11#page=22 摘要 ES最多使用的场景是搜索和日志分析,然而ES强大 ...

  4. Spark SQL 笔记

    Spark SQL 简介 SparkSQL 的前身是 Shark, SparkSQL 产生的根本原因是其完全脱离了 Hive 的限制.(Shark 底层依赖于 Hive 的解析器, 查询优化器) Sp ...

  5. HBase笔记--filter的使用

    HBASE过滤器介绍: 所有的过滤器都在服务端生效,叫做谓语下推(predicate push down),这样可以保证被过滤掉的数据不会被传送到客户端. 注意:        基于字符串的比较器,如 ...

  6. 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 ...

  7. 大数据:Parquet文件存储格式

    一.Parquet的组成 Parquet仅仅是一种存储格式,它是语言.平台无关的,并且不需要和任何一种数据处理框架绑定,目前能够和Parquet适配的组件包括下面这些,可以看出基本上通常使用的查询引擎 ...

  8. 大数据:Parquet文件存储格式【转】

    一.Parquet的组成 Parquet仅仅是一种存储格式,它是语言.平台无关的,并且不需要和任何一种数据处理框架绑定,目前能够和Parquet适配的组件包括下面这些,可以看出基本上通常使用的查询引擎 ...

  9. Parquet 格式文件

    Apache Parquet是Hadoop生态圈中一种新型列式存储格式,它可以兼容Hadoop生态圈中大多数计算框架(Hadoop.Spark等),被多种查询引擎支持(Hive.Impala.Dril ...

随机推荐

  1. element-ui MessageBox的bug

    通过 use引用messageBox有bug Vue.use(MessageBox) 页面一开始会有一个弹窗,内容空白 Vue.component(MessageBox.name, MessageBo ...

  2. window下php5.5安装redis扩展

    redis是现在比较流行的noSQL,主流大型网站都用的比较多,很多同学不知道怎么安装,这里介绍在windows下面安装以及扩展,提供学习使用,实际使用环境多在Linux下. 1.phpinfo(), ...

  3. Codeforces 986C AND Graph dfs

    原文链接https://www.cnblogs.com/zhouzhendong/p/9161514.html 题目传送门 - Codeforces 986C 题意 给定 $n,m (0\leq n\ ...

  4. Java中byte、short、char、int、long运算时自动类型转化问题

    -------------------------------------------------------------------------------------------------- ★ ...

  5. Python 2.7 cython cythonize py 编译成 pyd 谈谈那些坑

    Python 2.7 cython cythonize py 编译成 pyd 谈谈那些坑 前言 基于 python27 的 pyc 很容易被反编译,于是想到了pyd,加速运行,安全保护 必要准备 安装 ...

  6. Supervisor进程管理&开机自启

    这几天在用supervisor管理爬虫和Flask, 每次都记不住命令,花点时间记录下. supervisor是一个进程管理工具,用来启动.停止.重启和监测进程.我用这个东西主要用来监测爬虫和Flas ...

  7. Sumdiv POJ - 1845 (逆元/分治)

    Consider two natural numbers A and B. Let S be the sum of all natural divisors of A^B. Determine S m ...

  8. input模拟输入下拉框

       功能点: 输入.下拉选择.根据输入内容模糊检索.键盘上下键选择 实现思路: 显示隐藏: input获取焦点显示,失去焦点隐藏 下拉选择: 以父元素为基准,通过绝对定位定位至input输入下方 模 ...

  9. JavaScript中值类型与引用类型

    JavaScript中的变量类型有哪些? 值类型:字符串(string).数值(number).布尔值(boolean).null.undefined 引用类型:对象(Object).数组(Array ...

  10. 牛客练习赛35-函数的魔法-floyd

    函数的魔法 思路 :如果 可以从A到B最终 都会是233范围内的数字进行转换,注意 这里 建图 为单向图  这个运算未必符合交换关系. #include<bits/stdc++.h> us ...