Insert INTO #TempTable 很快但是 SELECT * FROM #TempTable 很慢,为什么以及如何提高性能?

问题描述 投票:0回答:1

我需要从不同的表插入临时表“#Temp”300 000行和30列,我创建了索引并且插入速度非常快,大约需要3秒。但是,当我想从这个临时表中读取数据时,需要很长时间 - 大约 3 分钟,我可以做些什么来加快这个过程吗?

我尝试创建索引,但它根本不起作用,因为我不需要对最终结果使用 ORDER BY 。 您知道如何解决这个问题吗?

SELECT 
    op.OperationId,
    op.OperationTypeId,
    op.BranchId,
    op.DateUpdated,
    op.OperationDate,
    op.StepCountTypeId,
    op.UserId,
    op.StatusTypeId,
    op.ChannelTypeId,
    cash.Amount, cash.OperationPersonId, cash.CurrencyTypeId
INTO #Operation
FROM CashDesk.Cash.Operation op
LEFT JOIN CashDesk.Cash.CashOperation AS cash WITH (NOLOCK) ON op.OperationId=cash.OperationId
WHERE CAST(op.OperationDate AS DATE) BETWEEN '2024-04-01' AND '2024-04-30'
AND op.OperationTypeId IN (9, 11, 10, 13, 14, 15, 348, 369, 385, 432)




SELECT * FROM #Operation

sql sql-server query-optimization sql-server-2016 temp-tables
1个回答
0
投票

消耗的时间可能是客户端造成的,因为在图形界面中消耗 300 000 行需要很长时间来计算。让我们看看是否有一些 ASYNC_NETWORK_IO:

--1 创建全局临时表 :

SELECT 
    op.OperationId,
    op.OperationTypeId,
    op.BranchId,
    op.DateUpdated,
    op.OperationDate,
    op.StepCountTypeId,
    op.UserId,
    op.StatusTypeId,
    op.ChannelTypeId,
    cash.Amount, cash.OperationPersonId, cash.CurrencyTypeId
INTO ##Operation
FROM CashDesk.Cash.Operation op
LEFT JOIN CashDesk.Cash.CashOperation AS cash WITH (NOLOCK) ON op.OperationId=cash.OperationId
WHERE CAST(op.OperationDate AS DATE) BETWEEN '2024-04-01' AND '2024-04-30'
AND op.OperationTypeId IN (9, 11, 10, 13, 14, 15, 348, 369, 385, 432);

--2 打开一个新的查询窗口并输入您的提取查询:

SELECT * FROM ##Operation;

--3 在同一窗口中,现在执行此查询:

SELECT * 
FROM   sys.dm_exec_session_wait_stats 
WHERE  session_id = @@SPID AND wait_time_ms > 0 
ORDER  BY wait_time_ms DESC

显示“ASYNC_NETWORK_IO”的行表明SQL Server正在等待客户端程序,该程序无法立即吸收所有数据...

所以你会发现这不是SQL Server慢,而是网络或客户端程序慢(即使是SSMS)。显示 300 000 行数据并不方便,因为通常情况下,用户可能会花 3 天左右不睡觉才能在屏幕上查看所有这些记录!

© www.soinside.com 2019 - 2024. All rights reserved.