2017-01-31 149 views
0

我遇到了一个奇怪的性能问题。我有一个基于CTE的观点。这是我多年前写的一个观点,它一直没有问题地运行。突然之间,4天前,在1-2分钟内运行的查询运行了几个小时,然后我们确定了长时间运行的查询并暂停了查询。SQL Server LEFT OUTER JOIN查询性能

的CTE产生一个代理执行交易的时间标记的列表。然后,我从CTE中选择,然后使用后续事务的时间戳返回到CTE,以确定代理在每个事务上花费的时间长度。

WITH [CTE_TABLE] (COLUMNS) AS 
    (
    SELECT [INDEXED COLUMNS] 
     ,[WINDOWED FUNCTION] AS ROWNUM 
    FROM [DB_TABLE] 
    WHERE [EMPLOYEE_ID] = 111213 
    ) 

    SELECT [T1].[EMPLOYEE_ID] 
     ,[T1].[TRANSACTION_NAME] 
     ,[T1].[TIMESTAMP]   AS [START_TIME] 
     ,[T2].[TIMESTAMP]   AS [END_TIME] 
    FROM [CTE_TABLE] [T1] 
     LEFT OUTER JOIN [CTE_TABLE] [T2] ON 
      (
      [T1].[EMPLOYEE_ID] = [T2].[EMPLOYEE_ID] 
      AND [T1].[ROWNUM] = [T2].[ROWNUM] + 1 
      ) 

在测试中,我筛选了特定的代理。如果它运行CTE的内部部分,它会在不到一秒的时间内生成500条记录。 (当不过滤单个代理时,它会在14秒内生成95K条记录,这是正常运行时间范围。)如果我用一个简单的SELECT * FROM [CTE_TABLE]运行CTE,它也会在不到一秒的时间内运行。当我使用INNER JOIN将它运行回到自身时,运行时间不到一秒。最后,当我将它作为LEFT OUTER JOIN运行时,它只需要一分半钟就可以处理单个代理程序的500条记录。我需要LEFT OUTER JOIN,因为当天的最后记录是代理注销系统,并且它从来没有要加入的记录。

,我从拉桌子超过22GB的大小,并有500万行。从这张表中选择一天的记录需要14秒,或者一秒钟内的单个代理,所以我不认为性能瓶颈来自源表。瓶颈发生在LEFT OUTER JOIN回到CTE,但我一直有LEFT OUTER JOIN。再次,非常奇怪的是,这只是4天前开始的。我检查了服务器上的空间,有很多。 CPU尖峰到约。 25%,直到查询结束运行,无论是单独运行还是由管理员停止。

我希望有人有一些想法,什么原因可能造成这一点。它似乎是从哪里冒出来的。

+1

您运行的是什么版本的SQL Server?如果你在2012年以上,看起来像是使用LEAD/LAG的好选择。 –

回答

1

再次,很奇怪的方面是,这只是开始3天前

我建议所涉及的表更新的统计数据,也尝试重建索引

在出现瓶颈LEFT OUTER JOIN回CTE

CTE不会有任何统计数据,我会建议materalizingŧ他CTE到一个临时表,看看这有助于

+0

重建索引!谢谢!如果可能的话,为什么会影响INNER JOIN Vs.的表现?数据的内存表示的左外连接? – UncleJasper75

+0

更改加入的原因优化器采取的扫描不同的路径或寻求,这还基于可用的 – TheGameiswar

+0

@ UncleJasper75统计:还请执行后的计划,展望未来 – TheGameiswar