【发布时间】: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