【问题标题】:Select from a Temp table is giving slow performance从 Temp 表中选择会导致性能下降
【发布时间】: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


【解决方案1】:

您必须指定您使用的数据库。

一般来说,你必须做这些事情:

  • 在连接列上创建一些索引(DailyAmount.userId、User.userID);如何创建索引必须改变;
  • 按列按顺序创建索引,(CreatedDate+UserID);这必须改变,例如在 postgresql 中具有 2 列的索引优于 2 索引;

如果您的数据不经常更改,您可以尝试物化视图并在物化视图上创建索引。

【讨论】:

  • 感谢您的回复。我正在使用 SQL Server 2019。已经在 CreatedDate 和 UserId 列上创建了一个 CLUSTERED INDEX。用于在此 TempTable 中插入数据的表上的索引是否会影响从同一个 TempTable 中选择的性能?
猜你喜欢
  • 2012-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多