索引未被使用
Indexes not being used
我刚刚将我的大型数据库从 SQL Server 2012 移至 SQL Server 2014,遇到索引未被使用的问题。
仅当我在 WHERE
子句中使用 IN
在 SELECT
中使用 SELECT
时才会出现此问题。
例如:
SELECT *
FROM tblChildren
WHERE ParentID IN (SELECT ParentID
FROM tblParents
WHERE Office = 1)
索引在 tblChildren
列 ParentID
。
以下语句可以很好地触发索引:
SELECT *
FROM tblChildren
WHERE ParentID IN (1, 2, 3)
和
SELECT *
FROM tblChildren
WHERE ParentID = 1
我不想更改任何代码或 SQL 语句来强制使用索引,我只需要它像过去一样自动执行。为什么会发生这种情况的任何想法?
谢谢
可能 table 统计数据丢失,并且因此为查询缓存了一个错误的计划,现在正在重用。尝试使用 UPDATE STATISTICS dbo.tblParents
和 child table 更新统计信息。然后使用 DBCC FREEPROCCACHE
清除查询计划。如果您可以在 sys.dm_exec_cached_plans
中找到您的查询,那么您可以清除该特定查询的计划,这是首选。查看 DBCC FREEPROCCACHE
上的文档以获取有关删除特定查询计划的更多信息。
我刚刚将我的大型数据库从 SQL Server 2012 移至 SQL Server 2014,遇到索引未被使用的问题。
仅当我在 WHERE
子句中使用 IN
在 SELECT
中使用 SELECT
时才会出现此问题。
例如:
SELECT *
FROM tblChildren
WHERE ParentID IN (SELECT ParentID
FROM tblParents
WHERE Office = 1)
索引在 tblChildren
列 ParentID
。
以下语句可以很好地触发索引:
SELECT *
FROM tblChildren
WHERE ParentID IN (1, 2, 3)
和
SELECT *
FROM tblChildren
WHERE ParentID = 1
我不想更改任何代码或 SQL 语句来强制使用索引,我只需要它像过去一样自动执行。为什么会发生这种情况的任何想法?
谢谢
可能 table 统计数据丢失,并且因此为查询缓存了一个错误的计划,现在正在重用。尝试使用 UPDATE STATISTICS dbo.tblParents
和 child table 更新统计信息。然后使用 DBCC FREEPROCCACHE
清除查询计划。如果您可以在 sys.dm_exec_cached_plans
中找到您的查询,那么您可以清除该特定查询的计划,这是首选。查看 DBCC FREEPROCCACHE
上的文档以获取有关删除特定查询计划的更多信息。