【问题标题】:Includes not covering select list包括不包括选择列表
【发布时间】:2015-08-17 18:20:57
【问题描述】:

我的查询中有 2 个表。我在 join 和 where 子句列上创建了一个非聚集索引,并包含了选择列表。当我运行查询并查看执行计划和统计信息 IO 时,我看到逻辑读取没有下降。将选择列表替换为选择 1 后,我发现逻辑读取显着减少。数据库是 SQL 2005 SP2。

正在使用 1 个索引(但不是包含)。另一个被完全忽略(不同的问题)。任何关于为什么我的包含被忽略的见解将不胜感激!

这是查询和索引:

SELECT 
    cm.col1
    ,cm.col2
    ,cm.col3
    ,cm.col4
    ,cm.col5
    ,cm.col6
    ,cp.col7
    ,cm.col8
    ,cm.col9
    ,cp.col10
FROM table1 cm  
INNER JOIN table2 cp 
    ON cm.col1 = cp.col11  
INNER JOIN table3 c 
    ON cp.col7 = C.col12
WHERE C.col13 = @Variable
and cm.col9 IN ('value1', 'value2')

创建索引 ix_table1_Includes ON 表 1 (col1, col9) 包括(col2、col3、col4、col5、col6、col8)

创建索引 ix_table2_Includes 在表 2 (col11) 包括 (col7, col10)

【问题讨论】:

  • 请编辑您的帖子以包含查询和索引。你现在的问题太模糊了。
  • 查询前有没有得到系统生成索引的时间?不是一蹴而就的!系统必须在后台执行搜索和 IO 以生成索引。

标签: sql-server indexing


【解决方案1】:

如果您的查询从col13 = @Variable 开始,问题是col7 是一个包含字段,所以连接不能使用它。

如果您的查询从col9 IN ('value1', 'value2') 开始,问题是 col9 不是索引的第一个字段,因此不能用于获取行。

【讨论】:

  • 哇!改变我的索引顺序让世界变得与众不同!非常感谢你!
【解决方案2】:

SQL Server 使用统计信息来开发它可以构建的最有效的查询计划。通常这意味着最少的读取或其他工作。与正在使用的索引相比,被覆盖的索引(包含包含的索引)是否产生最少的行数?您可以设置 io stats 并删除您不想使用的索引,并查看在我们使用每个索引时完成了多少逻辑和物理读取。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 2022-01-13
    • 2012-07-02
    • 2016-09-29
    • 2012-09-09
    • 2014-12-12
    • 1970-01-01
    相关资源
    最近更新 更多