如何使用少量交叉操作加速查询

时间:2016-06-14 06:37:55

标签: database sql-server-2008 tsql

有没有办法加快几个交叉操作的查询?查询看起来像这样:

SELECT TOP(2000) vk_key FROM ( 
SELECT vk_key FROM mat_property_det where [type]='mp' AND (ISNULL(mat_property_det.value_max, ISNULL(mat_property_det.value_min, 9999))  <=  980 OR ISNULL(mat_property_det.value, 9999) <= 980) AND mat_property_det.property_id=6 
INTERSECT
SELECT vk_key FROM search_advance_mat WHERE 1=1 AND (search_advance_mat.group_id = 101 ) 
INTERSECT
SELECT vk_key FROM  V_search_advance_subgroup_en WHERE CONTAINS((Subgroup_desc, Comment, [Application], HeatTreatment), ' "plates*"') ) T

我们事先并不知道我们将拥有多少个十字路口,而且我们无法改变与内连接,因为查询是根据用户的搜索参数从应用程序创建的。 这是一个执行计划: ExecutionPlanImage

任何帮助或建议都将不胜感激!

1 个答案:

答案 0 :(得分:0)

帮助/建议:关注执行计划中的表假脱机(Lazy Spool),因为它消耗了36%的查询工作量。您应该能够将鼠标悬停在计划的该区域上,并发现所涉及的表/视图/功能/等。

由于MSDN声明了懒惰的假脱机,the spool operator gets a row from its input operator and stores it in the spool, rather than consuming all rows at once,这意味着每一行都在扫描,一次一个。

尽一切可能删除表假脱机和/或提高查询/执行计划的特定区域的性能,整个查询将受益。