我有动态查询,可能以编程方式生成超过一千个where子句,每个子句都可以像(a列=' 1'和b =' 2')变化。我可以知道一个Sql查询中的这么多条件是否会出现性能问题?列a是varchar max,没有创建索引。它查询的表很大,并由另一列c分区。非常感谢。它是Sql server 2012。
答案 0 :(得分:0)
是。一千个where
条款可能会影响性能。如果可以,我建议使用值创建一个临时表,并使用join
作为逻辑。您应该在临时表上创建索引。
注意:您可以在主表上使用技巧,方法是添加一个将列值连接在一起的计算列。然后使用in
:
alter table t add ab as (a + ':' + b);
create index idx_t_ab on t(ab);
然后将查询修改为:
where ab in ('1:2', . . . )
这对所有应用程序都不适用,但它可能符合您对性能的需求。
答案 1 :(得分:0)
这样效率很低,但如果以这种方式构建查询,查询大小和参数数量也会受到限制,这些参数可能会导致应用程序出错。这些限制并不总是很明显,取决于许多因素,因此可能会导致难以消除的细微错误。
请参阅this question进行讨论。
答案 2 :(得分:0)
尝试在动态查询中组合where子句。对(a,b)值对进行排序后,您可以生成类似
的查询where a='1' and b in ('2', '5', '7', '8')
or a='2' and b in ('1', '5', '9')