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就是通用的)。所以解决方案见仁见智,还是要根据需求场景来决定。

 

 


本文只是个引子,在数据仓库的需求越来越大的市场下,这种优化是需要被人重视的。

转载于:https://www.cnblogs.com/lhfcws/p/6611830.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/469059.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python删除指定行_关于csv:删除python中的特定行和对应文件

我想删除90%的"转向"值等于0的行。这三个图像都有一个对应的图像文件&#xff0c;中间&#xff0c;左边和右边。我也要删除它们。csv文件如下&#xff1a;我编写了以下代码&#xff0c;以至少获取转向值为0的文件。我所需要的就是随机获取90%的文件并删除它们的代码。…

I2C总线传输协议

简介 I2C&#xff08;Inter-integrated Circuit&#xff09;总线支持设备之间的短距离通信&#xff0c;用于处理器和一些外围设备之间的接口&#xff0c;它只需要两根信号线来完成信息交换。I2C最早是飞利浦在1982年开发设计并用于自己的芯片上&#xff0c;一开始只允许100kHz…

基于Springboot外卖系统06: 新增员工功能+全局异常处理器

2. 新增员工 2.1 需求分析 后台系统中可以管理员工信息&#xff0c;通过新增员工来添加后台系统用户。点击[添加员工]按钮跳转到新增页面&#xff0c;如下 当填写完表单信息, 点击"保存"按钮后, 会提交该表单的数据到服务端, 在服务端中需要接受数据, 然后将数据保…

Linq 实现sql中的not in和in条件查询

T-SQL的IN&#xff1a; Select ProductID, ProductName, CategoryID From dbo.Products Where CategoryID in (1, 2)T-SQL的NOT IN&#xff1a; Select ProductID, ProductName, CategoryID From dbo.Products Where CategoryID not in (1, 2)Or Select ProductID, ProductName…

spring aop实现原理_Spring 异步实现原理与实战分享

最近因为全链路压测项目需要对用户自定义线程池 Bean 进行适配工作&#xff0c;我们知道全链路压测的核心思想是对流量压测进行标记&#xff0c;因此我们需要给压测的流量请求进行打标&#xff0c;并在链路中进行传递&#xff0c;那么问题来了&#xff0c;如果项目中使用了多线…

基于Springboot外卖系统07:员工分页查询+ 分页插件配置+分页代码实现

1. 员工分页查询 1.1 需求分析 在分页查询页面中, 以分页的方式来展示列表数据&#xff0c;以及查询条件 "员工姓名"。 请求参数 搜索条件&#xff1a; 员工姓名(模糊查询) 分页条件&#xff1a; 每页展示条数 &#xff0c; 页码 响应数据 总记录数 结果列表 1…

1045-Access denied for user 'root'@'localhost'(using password:YES)

解决&#xff1a; 1. 开始 --> cmd --> net stop mysql (停用MySQL服务 没启动的可以省略) 2. 找到安装路径 MySQL Server 5.1下的my.ini 3. 打开 my.ini 找到 [mysqld] 然后在下面加上 这句&#xff1a; skip_grant_tables &#xff08;意思好像是 启动MySQL服务…

arial字体可以商用吗_【工作总结】莫让字体版权引火上身

前段一条微软雅黑字体引发的巨额罚款新闻&#xff0c;引起国内多个TW大群小地震&#xff0c;人人自危。我也赶紧检查自家文档、商用出版物、网站的字体&#xff0c;以免给公司带来法务后患。把这两天收集的信息&#xff0c;采取的行动记录一下。哪些中文字体免费&#xff1f;事…

基于Springboot外卖系统08:员工账号状态管理功能+对象转换器+扩展Spring mvc的消息转换器

1. 员工账号状态管理 1.1 需求分析 在员工管理列表页面&#xff0c;可以对某个员工账号进行启用或者禁用操作。账号禁用的员工不能登录系统&#xff0c;启用后的员工可以正常登录。如果某个员工账号状态为正常&#xff0c;则按钮显示为 "禁用"&#xff0c;如果员工…

Android init.rc 服务启动不成功

Android init.rc 服务启动不成功 问题 在开发过程中发现一个问题&#xff0c;我们需要在开机的时候判断硬件版本号去启动服务&#xff0c; 服务的名字是ledservice和ledservice4,但是发现每次烧录完固件后&#xff0c;服务启动不 成功&#xff0c;需要再复位重启一次&#xff0…

python爬虫什么网站都能爬吗_python如何爬取动态网站

python有许多库可以让我们很方便地编写网络爬虫&#xff0c;爬取某些页面&#xff0c;获得有价值的信息&#xff01;但许多时候&#xff0c;爬虫取到的页面仅仅是一个静态的页面&#xff0c;即网页 的源代码&#xff0c;就像在浏览器上的“查看网页源代码”一样。一些动态的东西…

hdu4027Can you answer these queries?

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid4027 区间&#xff08;单点&#xff09;更新&#xff0c;区间求和。 1 #include<cstdio>2 #include<algorithm>3 #include<cmath>4 #define lson l,m,rt<<15 #define rson m1,r,rt<…

基于Springboot外卖系统09:员工信息编辑+员工信息保存

1 编辑员工信息功能 1.1 需求分析 在员工管理列表页面点击 "编辑" 按钮&#xff0c;跳转到编辑页面&#xff0c;在编辑页面回显员工信息并进行修改&#xff0c;最后点击 "保存" 按钮完成编辑操作。 那么从上述的分析中&#xff0c;当前实现的编辑功能需…

共享资料

共享资料 请关注公众号 嵌入式Linux 索取posted on 2018-09-22 00:27 公众号&#xff1b;嵌入式Linux 阅读(...) 评论(...) 编辑 收藏

selenium-05-常见问题

一&#xff1a;日期控件 selenium不能直接对日期控件操作&#xff0c;可以通过js对日期控件做赋值操作 WebElement inputTimeBoxdriver.findElement(by.name("###")); //定位日期控件 Stringtime "2015/10/10"; ((JavascriptExecutor)driver).executeScri…

bcp 不能调用where 子句_MySQL中IS NULL、IS NOT NULL、!=不能用索引?胡扯!

不知道从什么时候开始&#xff0c;网上流传着这么一个说法&#xff1a;MySQL的WHERE子句中包含 IS NULL、IS NOT NULL、! 这些条件时便不能使用索引查询&#xff0c;只能使用全表扫描。这种说法愈演愈烈&#xff0c;甚至被很多同学奉为真理。咱啥话也不说&#xff0c;举个例子。…

基于Springboot外卖系统10:公共字段填充功能+ThreadLocal模块改进

1. 公共字段自动填充 1.1 问题分析 在新增员工时需要设置创建时间、创建人、修改时间、修改人等字段&#xff0c;在编辑员工时需要设置修改时间、修改人等字段。这些字段属于公共字段&#xff0c;也就是也就是在系统中很多表中都会有这些字段&#xff0c;如下&#xff1a; 而…

## __VA_ARGS__ ... 宏和可变参数

在GNU C中&#xff0c;宏可以接受可变数目的参数&#xff0c;就象函数一样&#xff0c;例如: 1 2 #define pr_debug(fmt,arg...) \ printk(KERN_DEBUG fmt, ##arg) 用可变参数宏(variadic macros)传递可变参数表 你可能很熟悉在函数中使用可变参数表&#xff0c;如: 1 vo…

腾讯云挂在和格式化数据盘

新购买了数据盘时&#xff0c;需要格式化才可使用。未购买数据盘的用户可以跳过此步骤。也可以根据需要进行多分区操作。 这里以Windows 2012R2为例进行格式化说明。 1) 通过步骤四介绍的方法登录Windows云服务器。 2) 点击【开始】&#xff08;Start&#xff09;-【服务器管理…

基于Springboot外卖系统11:菜品新增类别+类别信息分页查询

1. 新增分类 1.1 需求分析 后台系统中可以管理分类信息&#xff0c;分类包括两种类型&#xff0c;分别是 菜品分类 和 套餐分类 。当我们在后台系统中添加菜品时需要选择一个菜品分类&#xff0c;在后台系统中添加一个套餐时需要选择一个套餐分类&#xff0c;在移动端也会按照…