指定在SQL查询中检查约束的顺序

时间:2015-03-07 03:07:51

标签: sql sql-server tsql sql-server-2012

我正在使用SQL Server 2012.我有一个表MyTable,其中包含合理数量的索引。该表有大约1000万条记录和20列:

 Field1, Field2, ..., Field20. 

我正在向表中写一个查询,其中包含15个字段约束:

select * 
from MyTable 
where Field1 = Value1 and Field2 = Value2 and... Field15 = Value15

问题在于,如果我把所有15个约束放在一起,那么即使它只返回约50条记录,查询也会永远存在。相反,如果我提出任何五个约束,那么查询将在几秒钟内执行并返回约300个记录(即,一个非常小的集合)。因此,将这10个过滤器应用于此超集非常快:它可以应用于客户端C#代码,也可以插入服务器端的临时表中。

我的问题是,是否有任何方法可以明确告诉SQL Server如何以及在哪个序列中应用WHERE子句中指定的约束?例如,当SQL Server处理约束列表时,它应首先处理字段Field1,Field3和Field7上的约束,然后才开始将其他过滤器应用于结果集。

一方面,很明显我可以自由地使用T-SQL显式存储/保存过滤过程的所有中间步骤的结果,如果依赖客户端则没有什么不好的。它提高了整体表现。但另一方面,我认为我面临一个相当普遍的情况,我相信应该有解决这个问题的特殊方法。

感谢任何方向!

更新:似乎marc_s建议使用CTE(Common Table Expression)是我一直在寻找的。

1 个答案:

答案 0 :(得分:0)

你告诉过:

  

如果我提出任何五个约束,那么查询将在a中执行   几秒钟

所以我更喜欢尝试使用嵌套选择来破坏where子句(5th-5th)中的条件,同时使用列的名称而不是使用*,因为它不关注索引:

select Field1, Field2, ..., Field20 from
 (select Field1, Field2, ..., Field20 from
  (select Field1, Field2, ..., Field20 
   from MyTable 
   where Field1 = Value1 and Field2 = Value2 and... Field5 = Value5)
  where Field6 = Value6 and Field7 = Value7 and... Field10 = Value10)
 where Field11 = Value11 and Field12 = Value12 and... Field15 = Value15