我需要从不同的表插入临时表“#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
消耗的时间可能是客户端造成的,因为在图形界面中消耗 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 天左右不睡觉才能在屏幕上查看所有这些记录!