0
我刚将大型数据库从SQL Server 2012移至SQL Server 2014,并且遇到索引未被使用的问题。只有当我有一个SELECT
内SELECT
的WHERE
子句中使用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语句来强制索引使用,我只需要它自动执行就像使用它一样。任何想法为什么会发生这种情况?
感谢
由于新的基数估计器可能是一个不同的计划。数据库的兼容级别是什么?包含索引的表定义是什么?两个表中有多少行? 'SELECT ParentID FROM tblParents WHERE Office = 1'返回多少个?整个查询返回多少个? –
内部选择平均返回5-10个记录。这些孩子包含2000万条记录,父母约有400万。所以它像疯了一样击中CPU,因此我注意到了它。该数据库在2008年的兼容性。 – Aki
数据库整理是否保持不变?由于您不使用两个部分名称,如果'tblChildren'有一个名为'ParentID'的列并且'tblParents'有一个名为'ParentId'的列并且您切换到CS归类,那么该查询就可以更改语义。 –