布隆过滤器在日常开发中常见,但在 SQL 使用中大家肯定会很陌生。详情见我上一篇文章:
阿里面试题亿级表合并引发的思考之 SQL Bloom Filter(一)
首先,我们直接上图,一目了然来看下 Bloom Filter 在 SQL Server 中的表现:
根据上篇讲的原理,Bloom Filter 中间有道 hash 做预处理,而在 Join 运算中,只有 Hash Join 才有可能会出现 Bitmap 运算,也即 Bloom Filter 运算。
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, 执行计划会是什么呢?
总结:使用 bitmap 的优点:
1)并行执行,某些场合可以显著提高效率;
2)同样是 Hash, Bitmap 的 CPU 开销更低,时间成本为O(1)
3)在特定场合下,需要对比执行效率才能最终决定优劣。
本文中说到了并行执行,有的朋友就会问了,如何让每个查询都进行并行执行呢,实际上是有办法控制的。那就是降低并行执行成本阈值(cost threshold for parallelism )
sp_configure 'show advanced options',1
reconfigure
sp_configure
默认情况下,当成本阈值高于5时才开启并行执行,我们可以手工降低这个值,使得更多的查询可以并行执行。但也要谨记,并行执行会带来大量CPU开销,也要适可而止。
猜你喜欢: