2016-01-04 41 views
0

我刚将大型数据库从SQL Server 2012移至SQL Server 2014,并且遇到索引未被使用的问题。只有当我有一个SELECTSELECTWHERE子句中使用IN发生索引未被使用

的问题。

例如:

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语句来强制索引使用,我只需要它自动执行就像使用它一样。任何想法为什么会发生这种情况?

感谢

+2

由于新的基数估计器可能是一个不同的计划。数据库的兼容级别是什么?包含索引的表定义是什么?两个表中有多少行? 'SELECT ParentID FROM tblParents WHERE Office = 1'返回多少个?整个查询返回多少个? –

+0

内部选择平均返回5-10个记录。这些孩子包含2000万条记录,父母约有400万。所以它像疯了一样击中CPU,因此我注意到了它。该数据库在2008年的兼容性。 – Aki

+0

数据库整理是否保持不变?由于您不使用两个部分名称,如果'tblChildren'有一个名为'ParentID'的列并且'tblParents'有一个名为'ParentId'的列并且您切换到CS归类,那么该查询就可以更改语义。 –

回答

2

这可能是表的统计信息丢失和坏的计划被缓存,因为该查询,也就是现在被重用。尝试使用UPDATE STATISTICS dbo.tblParents更新统计信息,也可以为子表更新。然后使用DBCC FREEPROCCACHE清除查询计划。如果您可以在sys.dm_exec_cached_plans中找到您的查询,那么您可以清除该特定查询的计划,这将是首选。有关删除特定查询计划的更多信息,请查阅DBCC FREEPROCCACHE上的文档。