我正在使用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)是我一直在寻找的。 p>
答案 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