【问题标题】:SQL Server statements with IN clauses: how to make them faster?带有 IN 子句的 SQL Server 语句:如何使它们更快?
【发布时间】:2012-07-31 11:15:12
【问题描述】:

我需要优化以下查询(表group_attributes)得到列group_idattribute_idint_value

select  group_id 
from    group_attributes 
where   attribute_id= 1049 
        and int_value in (1247, 1248, 1249, 1250, 1251, 1252, 1253, 1254, 1255,
              1256, 1257, 1258, 1259, 1260, 1261, 1262, 1263, 1264, 
              1265, 1266, 1267, 1268, 1269, 1270, 1271)

group_attributes 是一个巨大的表,查询需要很长时间。

我不是 SQL 方面的专家,所以我想知道哪个查询会运行得更快?总的来说,这些IN 查询似乎非常慢。

最好的,阿斯卡

【问题讨论】:

  • 表中有哪些索引?可以展示一下执行计划吗?
  • 我猜(attribute_id, int_value, group_id) 上的索引会很有效。
  • 可能只是“风格”的问题,但在您的特殊查询中,您可以使用int_value BETWEEN 1247 AND 1271
  • 索引为: GA_ATTRIBUTE_ID_INDEX 非集群位于 PRIMARY ATTRIBUTE_ID GA_GROUP_ID_INDEX 非集群位于 PRIMARY GROUP_ID UQ_GROUP_ATTRIBUTES_TRX_ID 非集群、唯一、唯一键位于 PRIMARY TRX_ID

标签: sql sql-server performance query-optimization


【解决方案1】:

解决方案 - 我

我认为您可以通过创建以下索引来提高性能。

  1. 在 group_id 上创建聚集索引
  2. (attribute_id,int_value)上的非聚集索引

解决方案-II

您还可以将所有 int_values 插入临时表,然后在临时表上创建非聚集索引。同时在主表的 int_value 上创建非聚集索引。

【讨论】:

    【解决方案2】:

    首先,将所有需要的int_values 存储到一个临时表并创建一个聚集索引。其次,将这个临时表与group_attributes 表内联。

    希望这将提供更好的性能。另请更新性能结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-16
      • 1970-01-01
      • 1970-01-01
      • 2014-10-28
      • 2023-02-16
      • 2012-08-25
      • 1970-01-01
      相关资源
      最近更新 更多