You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

已创建对应索引但执行计划仍提示索引缺失的问题求助

已创建对应索引但执行计划仍提示索引缺失的问题求助

嘿,我来帮你梳理下这个问题!你提到已经给[dbo].[T_markets_quotes]表创建了对应的缺失索引,但执行计划还是提示存在索引缺失,先看你提供的缺失索引详情:

<MissingIndexes>
  <MissingIndexGroup Impact="10.6268">
    <MissingIndex Database="[OPTIONS]" Schema="[dbo]" Table="[T_markets_quotes]">
      <ColumnGroup Usage="EQUALITY">
        <Column Name="[symbol]" ColumnId="5" />
      </ColumnGroup>
      <ColumnGroup Usage="INEQUALITY">
        <Column Name="[mid]" ColumnId="17" />
      </ColumnGroup>
      <ColumnGroup Usage="INCLUDE">
        <Column Name="[actual_runtime]" ColumnId="2" />
        <Column Name="[bid]" ColumnId="16" />
        <Column Name="[ask]" ColumnId="18" />
      </ColumnGroup>
    </MissingIndex>
  </MissingIndexGroup>
</MissingIndexes>

结合这个信息,你可以从这几个方向排查:

  • 索引结构不匹配:这个缺失索引要求的结构是:以symbol作为等值筛选列(放在索引键最前面),接着是mid作为不等值筛选列,同时需要INCLUDEactual_runtimebidask这三个列。你检查下自己创建的索引是不是列顺序错了,或者漏掉了INCLUDE列?SQL Server对索引的键列顺序、INCLUDE列的要求很严格,哪怕差一点都会判定为索引缺失。
  • 索引状态异常:有可能你创建的索引被禁用或者变成了假设性索引(hypothetical)。可以执行下面的查询检查索引状态:
    SELECT name, is_disabled, is_hypothetical 
    FROM sys.indexes 
    WHERE object_id = OBJECT_ID('[dbo].[T_markets_quotes]')
    
    如果is_disabled是1,记得启用索引;如果是假设性索引,可能需要重新创建正常的索引。
  • 执行计划缓存未更新:如果在你创建索引之前,这个查询已经生成了缓存的执行计划,SQL Server可能还在复用旧计划,没用到新索引。你可以试试用OPTION (RECOMPILE)强制查询重新生成执行计划,或者清除相关的计划缓存(注意:清除缓存要谨慎,避免影响其他查询)。
  • 统计信息过期:SQL Server依赖表和索引的统计信息来选择最优执行计划,如果统计信息过期,它可能识别不到你新建的索引是有效的。可以执行下面的命令更新统计信息:
    UPDATE STATISTICS [dbo].[T_markets_quotes] WITH FULLSCAN
    

备注:内容来源于stack exchange,提问作者user254060

火山引擎 最新活动