如何提高我的查询性能 SQL Server

Posted

技术标签:

【中文标题】如何提高我的查询性能 SQL Server【英文标题】:How to improve my query performance SQL Server 【发布时间】:2022-01-09 12:16:03 【问题描述】:

我的程序中有一个临时表,它与另一个临时表连接,它似乎需要一些时间才能运行。 谁能建议如何加快速度。

下面是我的一段代码:

    declare @installs table
    (
        UserName varchar(200),
        DeviceName varchar(500),
        FirstSeenDate datetime
    )

    insert into @installs
    SELECT  [Username] 
          ,[Device Name]
          ,min([First Seen]) as 'Install Date'
      FROM [DataCollection].[dbo].[iBoss_Installed_Users]
      where [Device Type] not like '%Server%'
      group by [Device Name], Username
      

    declare @installs_User table
    (
        UserName varchar(200),
        InstalledDate varchar(max)

    )

    insert into @installs_User
    select main.UserName,
            left(main.installs,len(main.installs)-1) as "Installs"
        From
        (
        select distinct ins2.UserName,
            (
                select convert(varchar(200),ins.FirstSeenDate)+', ' as [text()]
                from @installs ins
                where ins.UserName=ins2.UserName
                order by ins.Username
                for XML PATH('')
            ) [installs]
            from @installs ins2
        )[Main]
        

【问题讨论】:

你能展示一下表格吗,可能更容易理解你想要做什么。 对于与性能相关的问题,我们需要一个执行计划,您可以使用“粘贴计划”提供该计划。 @Dale K 似乎我的 XML PATH('') 需要时间。是否有任何替代方法 真的适用于 SQL Server 2008 吗? @MatBailie,不,我正在使用 sql server 2016 【参考方案1】:

首先,这些不是临时表,它们是表变量,SQL Server 为它们提供了硬编码的静态数据,因此估计总是很遥远,而且它们在这方面很糟糕。

因此,如果您只使用临时表并且(可能在它们上添加索引)将有很大帮助:

create table #installs
    (
        UserName varchar(200),
        DeviceName varchar(500),
        FirstSeenDate datetime
    )

insert into #installs
SELECT  [Username] 
....

【讨论】:

【参考方案2】:

我会避免使用表变量或临时表,而是使用公用表表达式。我也会使用GROUP BY 而不是DISTINCT,因此优化器知道它不必尝试对您的日期列表进行重复数据删除...

declare @installs_User table
(
    UserName varchar(200),
    InstalledDate varchar(max)
);

WITH
    installs AS
(
    SELECT [Username] 
          ,[Device Name]
          ,min([First Seen]) as 'Install Date'
    FROM [DataCollection].[dbo].[iBoss_Installed_Users]
    where [Device Type] not like '%Server%'
    group by [Device Name], Username
) 
insert into
    @installs_User
SELECT main.UserName
      ,left(main.installs,len(main.installs)-1) as "Installs"
From
(
    SELECT
        ins2.UserName,
        (
            select convert(varchar(200),ins.FirstSeenDate)+', ' as [text()]
            from installs ins
            where ins.UserName=ins2.UserName
            order by ins.Username
            for XML PATH('')
        ) [installs]
    FROM
        installs ins2
    GROUP BY
        ins2.UserName
)
    [Main]
        

【讨论】:

嗨@matbailie。谢谢你的回答。但看起来你给的方法比我的时间长 @ram :然后请回复 DaleK 的评论,并在您的问题中包含执行计划?使用本网站或类似网站; brentozar.com/pastetheplan(我猜你的源表没有足够的索引。)

以上是关于如何提高我的查询性能 SQL Server的主要内容,如果未能解决你的问题,请参考以下文章

如何提高 SQL Server 查询的性能 [关闭]

sql server 2008 r2 提高性能

如何提高 Sql server 中 Distinct Query 的性能

使用具有中等数据的表提高 SQL Server 查询性能

提高 SQL Server 查询性能

如何提高 SQL Azure 查询性能