如何提高我的查询性能 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的主要内容,如果未能解决你的问题,请参考以下文章