我有一个查询
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
命令会产生这样的性能问题。
答案 0 :(得分:1)
问题在于我没有使用索引视图,因为我必须尽可能快地执行此操作,因为我没有尝试索引视图(我知道它存在但我从未使用过)但只是简单地创建了一个{ {1}}和一个存储过程,用于加载该表,该数据应包含在一个视图中的数据,然后在最后一个TABLE
。
所以DELETE
工作得非常慢,因为我认为缺乏索引。