【问题标题】:Index for using IN clause in where condition在 where 条件中使用 IN 子句的索引
【发布时间】:2019-10-29 14:57:06
【问题描述】:

我的应用程序从 SQL Server 中的表访问数据。考虑表名是 PurchaseDetail 和其他一些列。 选择查询具有以下 where 子句。 1. 名称 - 名称只有 10000 个值。 2. 创建日期时间

实际查询是

select *
from PurchaseDetail
where name in (~2000 name)
and createdDateTime = 'someDateValue';

SQL 调优顾问给出了一些建议。我尝试了那些推荐的索引。性能略有提升,但并不完全。

我的查询有什么问题吗?或者是否有可能更改/改进我的选择查询? 因为我之前没有在 where 子句中使用 IN。我的表有超过 1 亿条记录。

有什么建议吗?

【问题讨论】:

  • 使用带有 2,000 个值列表的 IN 将是一个杀手。似乎您最好使用表值参数和JOIN
  • 另外,如果您使用SELECT *,唯一有用的索引是CLUSTERED INDEX,或包含表中每一列的NONCLUSTERED 索引(在索引本身,或作为INCLUDE 列)。如果您不需要每一列,请不要返回每一列。

标签: sql-server indexing


【解决方案1】:

在这种情况下,使用IN 处理这么多数据根本不好。 最好的方法是改用INNER JOIN。 如果将这些名称插入到临时表中并使用 SELECT 查询将其插入到 INNER JOIN 会更好。

【讨论】:

    猜你喜欢
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    相关资源
    最近更新 更多