【问题标题】:Query with IN operator not performing well in SQL Server使用 IN 运算符进行查询在 SQL Server 中表现不佳
【发布时间】:2019-12-04 07:34:10
【问题描述】:

我在 SQL Server 中有一个类似这样的查询。

select sum (col1) 
from TableA 
where col2 = ? 
  and col3 = ? 
  and col4 = in (?, ?, ?... ?)

TableA 在 (col2, col3, col4) 上有一个复合索引。

IN 运算符列表中的大小增加时,此查询性能不佳。

是否有一种好方法可以重写此查询以获得更好的性能?

列表可以从 1 增加到 300 项。

【问题讨论】:

  • 您可以将in 子句的值放在一个表中并加入它。
  • 检查查询计划并查看索引是否正常
  • @KedarLimaye 索引正在工作
  • @juergend 你能举个例子吗。您是否建议每次我需要运行查询时创建某种临时表或数据库中已经存在的表并插入其中具有列上的索引并在加入后清除该表。
  • 这可能是因为当您扩展要返回的值列表时,您实际上必须返回更多行,这会将您的 Index ScanIndex Seek 变成可能的 @ 987654327@。如果没有执行计划、有关表的索引或基数的更多详细信息,我们无法给您准确的答案。

标签: sql sql-server in-operator


【解决方案1】:

你的索引应该很好。对于这个查询:

select sum(col1) 
from TableA 
where col2 = ? and
      col3 = ? and
      col4 in (?, ?, ?... ?);

最佳索引是(col2, col3, col4, col1)(如果您愿意,可以包括最后一列。

对于要使用的索引,您需要确保类型与比较兼容。转换——以及排序规则的变化——排除了索引的使用。

【讨论】:

    猜你喜欢
    • 2014-05-05
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2020-06-06
    • 1970-01-01
    相关资源
    最近更新 更多