【发布时间】:2023-03-13 21:11:01
【问题描述】:
我需要一些帮助来解决以下查询的最后一步
Select * from #PersonDetail order by....
执行需要这么长时间 - 为什么?
在这个临时表#PersonDetail 中插入了数百万条记录,插入过程需要几秒钟,但是来自同一个临时表的最后一个Select 需要很长时间。
我在用于 order by 的列上创建了一个唯一的聚集索引,并尝试了许多其他选项,但对性能没有任何影响。
这是一个包含许多临时表的大型存储过程,但正是最后一个选择步骤影响了性能。这是查询最后一步的示例:
DROP TABLE IF EXISTS #PersonDetail
CREATE TABLE #PersonDetail
(
PersonId INT NOT NULL,
Name NVARCHAR(50) NULL,
Number INT NOT NULL,
Tag NVARCHAR(50) NULL,
UserId INT NOT NULL,
NumberEncrypted VARCHAR(100),
Type NVARCHAR(255),
Status NVARCHAR(50),
CreatedDate DATETIMEOFFSET(7),
AddressDetailId NVARCHAR(50),
Category NVARCHAR(50),
PrimaryId INT,
DailyAmount MONEY,
UNIQUE (PersonId UserId),
UNIQUE CLUSTERED(CreatedDate, UserId)
)
INSERT INTO #PersonDetail (PersonId, Name, Number, Tag, UserId, NumberEncrypted,
Type, Status, CreatedDate, AddressDetailId, Category, PrimaryId, Amount)
SELECT
PersonId, Name, Number, Tag, UserId, NumberEncrypted,
Type, Status, CreatedDate, AddressDetailId, Category, PrimaryId, DailyAmount
FROM
#User u
JOIN
dbo.DailyAmount da (NOLOCK) ON da.UserId = u.UserId
SELECT *
FROM #PersonDetail pd
ORDER BY CreatedDate, UserId
【问题讨论】:
-
您使用的是哪个 dbms? (该代码是特定于产品的。)
-
@Jarlh - 使用 sql server 2019
-
在 SSMS 中,显示客户端统计信息 - 很可能大部分时间都花在传输上(网络慢)。
-
@Arvo - ClientProcessing 时间 -21617 和 TotalExecutionTime - 21646。这些值是什么?抱歉,不确定 ClientStatistics 是如何工作的。这是以秒为单位的时间吗?
-
嗯,您正在接收几乎 1 GB 的数据 - 即使在快速网络上也需要时间。如果你查询这些数据只是为了测试,使用
top 1000或其他东西;如果您需要在本地进一步处理它,则无需执行任何操作。如果您需要在服务器上处理它,那么客户端时间无关紧要。
标签: sql sql-server temp-tables sql-server-2019