2012-11-16 233 views
-4

我正在运行以下查询,但时间太长。有没有办法让它更快或改变查询的写法?SQL Server 2008 R2查询

请帮忙。

SELECT * 
FROM ProductGroupLocUpdate WITH (nolock) 
WHERE CmStatusFlag > 2 
     AND EngineID IN (0, 1) 
     AND NOT EXISTS (SELECT DISTINCT APGV.LocationID 
         FROM CM_ST_ActiveProductGroupsView AS APGV WITH(nolock) 
         WHERE APGV.LocationID = ProductGroupLocUpdate.Locationid); 
+2

可以摆脱内部查询中的独特性,尽管SQL服务器可能会为自己弄清楚这一点。缺少什么是你的表定义?你有什么指数?你的桌子有多少行? – Laurence

+0

你不会给我们很多事情.....(1)那个查询中涉及的表是什么样的(结构)? (2)它们包含什么样的数据 - 多少行,如何选择这些柱? (3)你已经有了什么样的索引? –

回答

0

尝试重写查询与加入

SELECT PGLU.* from ProductGroupLocUpdate PGLU WITH (NOLOCK) 
LEFT JOIN CM_ST_ActiveProductGroupsView APGV WITH (NOLOCK) 
     ON PGLU.LocationId = APGV.LocationID 
WHERE APGV.LocationID IS NULL AND CmStatusFlag>2 AND EngineID IN (0,1) 

取决于有多少数据是表中,检查添加索引LocationId(两个表中),CmStatusFlag和引擎ID

+0

左连接表是一个视图 – faiz

+0

@faiz:LEFT JOIN表是一个视图的事实是引擎的问题,而不是编写SQL的人。但是,由于您没有展示视图的定义,因此您目前正在执行的相关子查询很可能会加剧视图工作问题,并且是对整体性能问题的主要贡献。 –