Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server左外部联接查询性能_Sql Server_Left Join_Database Performance - Fatal编程技术网

Sql server SQL Server左外部联接查询性能

Sql server SQL Server左外部联接查询性能,sql-server,left-join,database-performance,Sql Server,Left Join,Database Performance,我遇到了一个奇怪的性能问题。我有一个基于CTE的视图。这是我几年前写的一个观点,它一直没有问题。突然,在4天前,运行了1-2分钟的查询运行了数小时,然后我们发现了长时间运行的查询并停止了它 CTE生成代理执行的事务的时间戳列表。然后,我从CTE中进行选择,使用后续事务的时间戳左键连接回CTE,以确定代理在每个事务上花费的时间长度 WITH [CTE_TABLE] (COLUMNS) AS ( SELECT [INDEXED COLUMNS] ,[WINDOWED

我遇到了一个奇怪的性能问题。我有一个基于CTE的视图。这是我几年前写的一个观点,它一直没有问题。突然,在4天前,运行了1-2分钟的查询运行了数小时,然后我们发现了长时间运行的查询并停止了它

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条记录。这是正常运行的时间范围。)如果我使用[CTE_TABLE]中的简单SELECT*运行CTE,它也会在不到一秒钟的时间内运行。当我使用一个内部连接运行它时,同样,运行时间不到一秒钟。最后,当我将其作为左外部联接运行时,仅对于单个代理的500条记录,它就需要一分钟半的时间。我需要左边的外部连接,因为当天的最终记录是代理注销系统,并且它从来没有要连接的记录

我从中提取的表大小超过22GB,有5亿行。从该表中选择一天的记录需要14秒,或者在不到一秒钟的时间内选择一个代理,因此我认为性能瓶颈不会来自源表。瓶颈发生在返回到CTE的左外连接中,但我一直使用左外连接。同样,非常奇怪的是,这是4天前才开始的。我已经检查了服务器上的空间,有足够的空间。CPU峰值约为25%,并一直保持到查询结束运行为止,无论是单独运行还是被管理员停止

我希望有人知道是什么导致了这一切。它似乎是不知从哪里冒出来的

同样,非常奇怪的是,这是4天前才开始的

我建议更新相关表的统计信息,并尝试重建索引

瓶颈发生在返回CTE的左侧外部连接中


CTE不会有任何统计数据,我建议将CTE整理成一个临时表,看看这是否有帮助

您正在运行哪个版本的SQL Server?如果你在2012年以上,看起来是使用超前/滞后的好选择。重建索引成功了!非常感谢。如果可能的话,为什么这会影响内存中数据表示的内部联接与左侧外部联接的性能?更改联接会导致优化器采用不同的扫描或搜索路径,这进一步取决于统计数据available@UncleJasper75:另请提交执行后计划,如果这些数据完全存在于内存中,我看不出碎片有任何问题