【问题标题】:SQL Server 2008 R2 querySQL Server 2008 R2 查询
【发布时间】:2012-11-16 20:19:11
【问题描述】:

我正在运行以下查询,但耗时太长。有没有办法让它更快或改变查询的编写方式?

请帮忙。

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);

【问题讨论】:

  • 你可以去掉内部查询中的 distinct,尽管 SQL Server 可能会自己解决这个问题。除此之外,您的表定义是什么?你有什么索引?你的表有多少行?
  • 你没有给我们太多的继续......(1)该查询中涉及的表是什么样的(结构)? (2) 它们包含什么样的数据——有多少行,列的选择性如何? (3) 您已经建立了什么样的索引?

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


【解决方案1】:

尝试使用连接重写查询

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 和 EngineID 添加索引

【讨论】:

  • 左连接表是一个视图
  • @faiz:LEFT JOIN 表是视图这一事实是引擎的问题,而不是编写 SQL 的人。但是,由于您没有显示视图的定义,因此您当前正在执行的相关子查询很可能会加剧使用视图的问题,并且是对整体性能问题的主要贡献。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-01
  • 2013-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多