【问题标题】:Will many where clauses impact query performance许多 where 子句会影响查询性能吗
【发布时间】:2015-03-10 13:47:06
【问题描述】:

我有动态查询,它可能会以编程方式生成一千多个 where 子句,每个子句都可能像(列 a = '1' 和 b = '2' ),变化不大。请问一个Sql查询中有这么多条件是否会出现性能问题? a 列是一个 varchar max ,没有创建索引。它查询的表很大并且由另一列 c 分区。非常感谢。它是 Sql server 2012。

【问题讨论】:

    标签: sql sql-server performance query-optimization


    【解决方案1】:

    是的。一千个where 子句会影响性能。如果可以的话,我建议使用这些值创建一个临时表,并使用 join 作为逻辑。您应该在临时表上创建一个索引。

    注意:您可以在主表上使用一个技巧,即添加一个计算列,将列值连接在一起。然后使用in:

    alter table t add ab as (a + ':' + b);
    
    create index idx_t_ab on t(ab);
    

    然后将查询修改为:

    where ab in ('1:2', . . . )
    

    这不适用于所有应用程序,但它可能适合您的性能需求。

    【讨论】:

    • 感谢您的投入,如果我们能从授权方那里得到一个量化的性能指标就很好了,否则可能很难让人信服
    【解决方案2】:

    这将是低效的,但查询大小和参数数量也有限制,如果您以这种方式构建查询,可能会导致应用程序出错。这些限制并不总是很清楚,具体取决于多种因素,因此可能会导致难以消除的细微错误。

    请参阅this question 进行讨论。

    【讨论】:

    • 感谢您的回复,这适用于 sql 2012。我找不到证据,但有人告诉我 2012 已经改进了限制。是否有任何量化测量可用于向客户展示影响?
    【解决方案3】:

    尝试在动态查询中组合 where 子句。当对 (a,b) 值进行排序后,您可以生成类似的查询

    where a='1' and b in ('2', '5', '7', '8')
    or a='2' and b in ('1', '5', '9')
    

    【讨论】:

      猜你喜欢
      • 2015-06-04
      • 2011-05-01
      • 2017-03-22
      • 2011-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-11
      • 1970-01-01
      相关资源
      最近更新 更多