【发布时间】:2013-01-09 14:56:48
【问题描述】:
我使用存储过程:
在我的 WHERE 子句中,我使用短路 (OR) 来加速执行,因为查询优化器知道我的大部分输入都默认为 Null。这让我的查询变得灵活而快速。
我在 WHERE 子句中添加了一个表值参数。报告的执行时间从 150 毫秒上升到 450 毫秒,从 70,000 到 200,000。
...
WHERE
--Integer value parameters
AND ((@hID is Null) OR (h.ID = @hID))
AND ((@dID is Null) OR (d.ID = @dID))
AND ((@mID is NULL) OR (m.ID = @mID))
--New table value parameter
--Execute, Processing time and read's increased.
--No additional JOIN added.
AND (NOT EXISTS (SELECT Null FROM @rIDs) OR r.ID IN (SELECT r FROM @rIDs))
我怎样才能短路不存在或加快这个查询?在执行查询之前,我尝试添加一个 BIT 值并检查行是否在表值参数中。我发现的唯一方法是有两个查询并在另一个上执行一个。如果我必须修改一大堆查询或将多个表值参数添加到组合中,那就不好了。
提前致谢。
编辑:
表值参数比较:
AND (NOT EXISTS (SELECT Null FROM @rIDs) OR r.ID IN (SELECT r FROM @rIDs))
和整数参数:
AND ((@rID) OR (r.ID = @rID))
使用 TVP 在 0 行和 Integer 参数 null 编译后显示类似的执行速度。我假设查询优化器在正确的庄园中短路,而我之前的比较是不正确的。执行计划将上述成本分为 55% 和 45%,这是可以接受的。尽管当 TVP 中有更多行时拆分不会改变,但生成报告的时间会增加,因为必须从磁盘读取更多页面。很有趣。
【问题讨论】:
-
你试过
option ( recompile )在不缓存执行计划的情况下检查性能吗? -
我尝试了 OPTION (RECOMPILE),查询时间增加了两倍。谢谢
标签: sql-server tsql query-optimization where-clause table-valued-parameters