从临时表中选择将导致性能降低

kwvwclae  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(277)

我需要一些帮助与下面的查询在哪里的最后一步

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
lymgl2op

lymgl2op1#

必须指定要使用的数据库。
一般来说,你必须做以下事情:
在连接列上创建一些索引(dailyamount.userid,user.userid);如何创建索引必须改变;
在orderby列上创建索引(createddate+userid);这必须改变,例如在postgresql中,一个有2列的索引比2个索引好;
如果您的数据不经常更改,您可以尝试物化视图并在物化视图上创建索引。

相关问题