【问题标题】:How can I force a view to use a specific index?如何强制视图使用特定索引?
【发布时间】:2018-10-25 12:17:43
【问题描述】:

如何强制视图使用特定索引?

当我尝试强制使用索引时收到以下警告消息:

警告:为视图“BANK.CUSTOMER_ORDER_VIEW”提供的索引提示将被忽略。

以下是我的查询:

DECLARE  @VALUE_DATE_START DATE = '20181001',
         @VALUE_DATE_END DATE  = '20181025'

SELECT * 
FROM BANK.CUSTOMER_ORDER_VIEW WITH(INDEX(IX_ValueDate))
WHERE VALUE_DATE BETWEEN @VALUE_DATE_START AND @VALUE_DATE_END

IX_ValueDate 是BANK.CUSTOMER_ORDER_VIEW 中使用的表的索引。

【问题讨论】:

  • 你试过了,还是不行。查询提示出现在最外层的查询上。一般来说,您可以相信优化器会做正确的事情。
  • SQL 中的视图类似于许多其他语言中的宏。无论在哪个查询中使用它们,视图定义都会“扩展”到查询中,然后将整个查询(来自任何视图内部的位和基于视图显式写入的位)作为一个整体进行优化。跨度>
  • 你试过 FORCESEEK 提示了吗?
  • 如果您发现优化器没有使用value_date 上的(明显的)索引,请首先验证其行估计是否正确,如果不正确则更新统计信息。如果您发现它没有使用正确的估计值,还可以考虑OPTION (RECOMPILE) 或OPTION (OPTIMIZE FOR)。强制索引应始终被视为最后的手段。
  • 谢谢,你解决了我的问题。选项(重新编译)是解决方案..

标签: sql sql-server tsql sql-server-2014


【解决方案1】:

您需要注意编写提示:查询/表提示仅用于推荐,优化器可能会像您的情况一样忽略它们。 这一点在某处没有很好的记录but mentioned,例如

当引用多个索引的索引提示用于事实时 星型连接中的表,优化器忽略索引提示并返回 一条警告信息。

另一方面,您的查询是一个典型的例子,因为声明的变量需要OPTION(RECOMPILE):一旦生成和缓存的计划在狭窄时期不适合大时期等。

【讨论】:

    猜你喜欢
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    • 2013-06-13
    相关资源
    最近更新 更多