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