使用where子句中的NOT IN查询执行性能问题

时间:2013-12-03 10:31:57

标签: sql-server performance sql-server-2008-r2

我有一个查询

SELECT SOME_FILEDS FROM MY_VIEW

MY_VIEW是从其他视图检索数据的视图,从生产服务器上的MY_VIEW执行查询需要45分钟。

通过尝试调查问题,我意识到一个子视图很慢。

我知道创造很多观点并不是最好的观点,但这是我必须坚持的约束。

罪魁祸首(=慢)视图是这样的:

CREATE VIEW V_SLOW_VIEW
AS
SELECT     MAX(MAIN_ID), ANOTHER_ID
FROM         V_DETAIL_VIEW
WHERE     (MAIN_ID NOT IN -- NOT IN!!!
                          (SELECT     MAIN_ID
                            FROM          ANOTHER_SIMPLE_KEYVALUE_VIEW))
GROUP BY ANOTHER_ID

我注意到,通过评论WHERE条件,此V_SLOW_VIEW变得更快,MY_VIEW具有可接受的执行时间。因此,NOT IN会产生问题。

最后注释:在另一台(开发)计算机上复制的相同数据库行为正常,查询MY_VIEW无痛且快速(2秒对45分钟)。

我还尝试安装另一个sql server实例,我讨论了问题here

所以不知何故,这个问题与单个生产服务器有关,我想了解为什么NOT IN命令会产生这样的性能问题。

1 个答案:

答案 0 :(得分:1)

问题在于我没有使用索引视图,因为我必须尽可能快地执行此操作,因为我没有尝试索引视图(我知道它存在但我从未使用过)但只是简单地创建了一个{ {1}}和一个存储过程,用于加载该表,该数据应包含在一个视图中的数据,然后在最后一个TABLE

所以DELETE工作得非常慢,因为我认为缺乏索引。