首页 > 解决方案 > 我们是否应该使用 order by 子句中使用的列作为 NC INDEX 的包含列

问题描述

我创建了一个 NC 索引并使用“LastUpdated”作为索引中的包含列,但“LastUpdated”在我的查询中按子句顺序使用。我们应该使用 order by 子句中使用的列作为 NC INDEX 的包含列吗?

   CREATE NONCLUSTERED INDEX [IXNI__symboltab__Status_active_Symbol] 
   ON symboltab (Status,active,Symbol)
   INCLUDE (LastUpdated)

    SELECT TOP 10000 symbol,LastUpdated 
    from symboltab
    with (nolock index = IXNI__symboltab__Status_active_Symbol)
    WHERE 
        active = 1 
        AND Status = 999 --999 is default
        AND Symbol NOT LIKE '/%'
        AND Symbol NOT LIKE '%#%'
        AND Symbol NOT LIKE '!%'
    ORDER BY LastUpdated ASC

标签: sql-server

解决方案


据我所知,INCLUDE子句中列出的列不是实际 B 树索引的一部分,而是仅出现在叶节点中。这样做的结果是,对于您当前的索引,叶节点通常不会LastUpdated值排序。这些值将存在于叶节点中,但不能保证任何类型。因此,如果你想让你的索引有机会覆盖查询的所有部分,你应该LastUpdated进入实际的索引结构:

CREATE NONCLUSTERED INDEX [IXNI__symboltab__Status_active_Symbol]
    ON symboltab (Status, active, Symbol, LastUpdated);

推荐阅读