Filter被push down

The filter can be pushed down directly to the base table or index, in this case, to the clustered index scan operator.It means that the filter was pushed down to the storage engine. The storage engine tests the corresponding row in database file. If the row matches the filter, the storage engine passes it along to the query processor. If the row does not match the filter, the storage engine discards it.

代码来源于《Excessive sort memory grant

CREATE TABLE dbo.Test
(
    TID integer IDENTITY NOT NULL,
    FilterMe integer NOT NULL,
    SortMe integer NOT NULL,
    Unused nvarchar(max) NULL,

    CONSTRAINT PK_dbo_Test_TID
    PRIMARY KEY CLUSTERED (TID)
);
GO
-- 100,000 example rows
INSERT dbo.Test WITH (TABLOCKX)
    (FilterMe, SortMe)
SELECT TOP (100 * 1000)
    CHECKSUM(NEWID()) % 1000,
    CHECKSUM(NEWID())
FROM sys.all_columns AS AC1
CROSS JOIN sys.all_columns AS AC2;
GO
-- Query
SELECT
    T.TID,
    T.FilterMe,
    T.SortMe,
    T.Unused
FROM dbo.Test AS T
WHERE
    T.FilterMe = 567
ORDER BY
    T.SortMe ;

Why is this simple query granted so much memory? For an estimated 50 rows, the optimizer reserves almost 500 MB for the sort:

1,我在localhost 上执行,查看执行计划,Memory Grant 是 499440KB,查看Select Operator的属性 MemoryGrantInfo,其子属性是什么意思?

参考《Memory Grant Execution Plan Statistics

“Provide memory grant estimate as well as actual runtime memory grant information. Serial required/desired memory attributes are estimated during query compile time for serial execution. The rest of attributes provide estimates and counters for query execution time considering actual degree of parallelism.”

DesiredMemory是在编译执行计划时优化器期望得到的内存

RequestedMemory 是执行计划在运行时,向SQL Server请求授予的内存

RequeiredMemory是查询语句在开始执行时必须授予的最小内存

GrantedMemory是Query Plan在执行时被授予的用于执行Sort 和 HashJoin 操作的内存

2,Paul White 的解释,赞一个

Filter 被Push-Down 到 Scan operator,使SQL Server storage engine从File读取数据时,将不满足Filter的数据行都过滤掉。

Scan Operator的Predicate是: [FilterMe]=(567),表明Filter 被push down

Sort的Input Data Path属性 Actual Number of Rows=38,表明传递到Sort Operator的数据流只有38 rows;

The filtering condition is pushed down into the scan operator as a residual predicate, but the memory granted for the sort is erroneously calculated based on the pre-filter cardinality estimate.

To illustrate the issue, we can use (undocumented and unsupported) trace flag 9130 to prevent the Filter from being pushed down into the scan operator. The memory granted to the sort is now correctly based on the estimated cardinality of the Filter output, not the scan:

SELECT
    T.TID,
    T.FilterMe,
    T.SortMe,
    T.Unused
FROM dbo.Test AS T
WHERE
    T.FilterMe = 567
ORDER BY
    T.SortMe
OPTION (QUERYTRACEON 9130); -- Not for production systems

比较执行计划,发现多了一个Filter Operator,用于执行Query的 Where Clause, Select Operator的Memory Grant是10240KB=10M,还算合理。

参考文档:

Excessive sort memory grant

时间: 2024-10-17 11:03:43

Filter被push down的相关文章

js array filter pop push shift unshift方法

JavaScript Array filter() 方法  JavaScript Array 对象 实例 返回数组 ages 中所有元素都大于 18 的元素: var ages = [32, 33, 16, 40]; function checkAdult(age) {    return age >= 18;} function myFunction() {    document.getElementById("demo").innerHTML = ages.filter(c

You Don't Need jQuery

前端发展很快,现代浏览器原生 API 已经足够好用.我们并不需要为了操作 DOM.Event 等再学习一下 jQuery 的 API.同时由于 React.Angular.Vue 等框架的流行,直接操作 DOM 不再是好的模式,jQuery 使用场景大大减少.本项目总结了大部分 jQuery API 替代的方法,暂时只支持 IE10+ 以上浏览器. 目录 Translations Query Selector CSS & Style DOM Manipulation Ajax Events Ut

KendoUi中KendoDropDownList控件的使用——三级级联模块的实现

1. 应用需求 在权限系统开发中除了以上数据表关系的设计之外.比較麻烦的地方是级联模块在页面的展示,因为设计中最多是控制到三级,因此三级级联模块的展示.编辑等页面操作是须要解决的问题,这里採用KendoUi中的KendoDropDownList来实现,它能够轻松的实现我们想要实现的效果.基本效果图例如以下: 如上图的关系为:通用支撑子系统(一级)包括:系统管理.用户管理.日志管理(二级)子系统:系统管理子系统中又包括管理模块(三级模块). 每一级别的变动,其下属级别模块均会对应变化. 2. 代码

PE打补丁技术大全

Downloads PE Viewer PE Maker - Step 1 - Add new Section. PE Maker - Step 2 - Travel towards OEP. PE Maker - Step 3 - Support Import Table. PE Maker - Step 4 - Support DLL and OCX. PE Maker - Step 5 - Final work. CALC.EXE - test file Contents 0. Prefa

多条件筛选的实现

<?php $conditions = array('price','color','metal'); //要进行筛选的字段放在这里 $price = $color = $metal=''; //先给需要筛选的字段赋空值,这些值将输出到页面的hidden fileds中 //以下循环给已经进行的筛选赋值,以便能够在下一次筛选中保留 foreach($conditions as $value){ if(isset($_POST[$value])){ $$value = $_POST[$value]

DirectShow中写push模式的source filter流程 + 源码(内附具体凝视)

尽管网上已有非常多关于DirectShow写source filter的资料.只是非常多刚開始学的朋友总说讲的不是非常清楚(可能当中作者省略了很多他觉得简 单的过程).读者总希望看到象第一步怎么做,第二步怎么做....这种demo.事实上写你的第一个filter是有一定难度的,仅仅要过了这关以后 就easy多了. 因为近期须要自己写一个push推模式的source filter,加上刚激活了Blog,不好意思Blog上没有一篇文章,所以将写这个filter的过程写下来 ,为了照应刚開始学的朋友,

DirectShow中写push模式的source filter流程 + 源代码(内附详细注释)

虽然网上已有很多关于DirectShow写source filter的资料,不过很多刚开始学的朋友总说讲的不是很清楚(可能其中作者省略了许多他认为简 单的过程),读者总希望看到象第一步怎么做,第二步怎么做....这样的demo.其实写你的第一个filter是有一定难度的,只要过了这关以后 就容易多了.由于最近需要自己写一个push推模式的source filter,加上刚激活了Blog,不好意思Blog上没有一篇文章,所以将写这个filter的过程写下来 ,为了照顾刚开始学的朋友,我采用第一步第

push splice filter用法

checkedData.push(record); 直接在record 这个数组后面添加; var index =jQuery.inArray(record,checkedData);// 获取index 的位置 checkedData.splice(index,1); // 从index位置删除1个 $("#specificationid input[type='checkbox']").filter(":checked").size();// 过滤 input[

JS中some()和every()和join()和concat()和pop(),push(),shift(),unshfit()和map()和filter()

一.Array 1.some()和every() some()是对数组中每一项运行指定函数,如果该函数对任一项返回true,则返回true. every()是对数组中的每一项运行给定函数,如果该函数对每一项返回true,则返回true. var array = [1,3,5,7,9,11,13,15,17] undefined array.some(function(item,index){ return item>9 }) //true 返回 true var array = [1,3,5,7