【问题标题】:How to improve my query performance SQL Server如何提高我的查询性能 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

标签: sql sql-server tsql sql-server-2016 database-performance


【解决方案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(我猜你的源表没有足够的索引。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    • 2011-03-03
    • 2019-03-20
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    相关资源
    最近更新 更多