阿里面试题亿级表合并引发的思考之 SQL Bloom Filter(二)


布隆过滤器在日常开发中常见,但在 SQL 使用中大家肯定会很陌生。详情见我上一篇文章:



阿里面试题亿级表合并引发的思考之 SQL Bloom Filter(一)



首先,我们直接上图,一目了然来看下 Bloom Filter 在 SQL Server 中的表现:



640?wx_fmt=jpeg



根据上篇讲的原理,Bloom Filter 中间有道 hash 做预处理,而在 Join 运算中,只有 Hash Join 才有可能会出现 Bitmap 运算,也即 Bloom Filter 运算。



640?wx_fmt=jpeg


Bloom Filter 的简单原理如上,每个元素都分配到了一个位置,那个位置标为1。如果某个位置上只有初始化的0值,那么该位置就没有任何元素存在。通过 hash 算出来的位置索引,假如存储的值正好是0,那么该元素肯定就不在这个集合中。反之,则有可能存在。


思考,这里为什么说有可能存在?


接着,我们来解密如何调出 bitmap?



SELECT Sales.*, Prod.* 	
FROM Sales.SalesOrderDetail  Sales 	
  INNER JOIN Production.Product  Prod 	
    on Sales.ProductID = Prod.ProductID 	
WHERE ProductLine in('S','T') and Prod.Weight>=445 	
OPTION(QUERYTRACEON 8649)



看到么,我们在这里使用 hint (QueryTraceON 8649) 来矫正执行计划,就看到如上的并行执行。



那么,如果不适用hint, 执行计划会是什么呢?


640?wx_fmt=jpeg



总结:使用 bitmap 的优点:


1)并行执行,某些场合可以显著提高效率;

2)同样是 Hash, Bitmap 的 CPU 开销更低,时间成本为O(1)

3)在特定场合下,需要对比执行效率才能最终决定优劣。



本文中说到了并行执行,有的朋友就会问了,如何让每个查询都进行并行执行呢,实际上是有办法控制的。那就是降低并行执行成本阈值(cost threshold for parallelism


sp_configure 'show advanced options',1	
reconfigure	
sp_configure



640?wx_fmt=jpeg


默认情况下,当成本阈值高于5时才开启并行执行,我们可以手工降低这个值,使得更多的查询可以并行执行。但也要谨记,并行执行会带来大量CPU开销,也要适可而止。


640


猜你喜欢:


为程序员讨回失去的午觉,我被投诉了,差点吃官司

本号精华合集




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dbLenis

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值