SQL - 优化执行时间
SQL - Optimize the execution time
我正在尝试从 stackexchange 数据库中获取数据。我的查询是:
select distinct top 50 U.Id, U.DisplayName, U.Reputation,
Tags = stuff( (SELECT ','+p2.Tags
FROM posts p2 join votes V on p2.id = V.PostId
where V.VoteTypeId=5 and V.UserId = U.id
order by p2.CreationDate DESC
FOR XML PATH, TYPE).value('.[1]','nvarchar(max)')
,1,1,'')
from Users U
order by U.Reputation DESC;
但是,当我 运行 data.stackexchange.com 上的查询时,它显示一条错误消息:Execution Timeout Expired.
有什么方法可以修改查询以优化执行时间,所以我可以 运行 这个查询成功吗?
您需要排除具有单个 XML 的子查询。这将需要使用结构 <user ...><tag1><tag2>...</user><user>...
(使用 EXPLICIT MODE)构建公共 XML。并将其解析为单个用户的行。
with U as(
select top 50 id, Reputation, DisplayName
from users order by Reputation DESC
),
V as(
select U.*,p2.Tags, p2.CreationDate
from U, posts p2, votes V
where p2.id = V.PostId and V.VoteTypeId=5 and V.UserId = U.id
),
Q(XML) as(
select tag,parent,id [user!1!id],Reputation [user!1!Reputation],Name [user!1!Name], T [T!2!!element]
from (
select 1 tag, NULL parent, U.id, U.Reputation, U.DisplayName Name, NULL t, NULL dt
from U
union all
select 2, 1, V.id, NULL, NULL, ','+Tags, CreationDate
from V
) X
order by id, tag, dt desc
for xml explicit, type
)
select node.value('(@id)[1]','int'),
node.value('(@Reputation)[1]','int'),
node.value('(@Name)[1]','nvarchar(max)'),
stuff(node.value('.[1]','nvarchar(max)'),1,1,'')
from Q
cross apply XML.nodes('/user') as Y(node)
order by 2 desc
我正在尝试从 stackexchange 数据库中获取数据。我的查询是:
select distinct top 50 U.Id, U.DisplayName, U.Reputation,
Tags = stuff( (SELECT ','+p2.Tags
FROM posts p2 join votes V on p2.id = V.PostId
where V.VoteTypeId=5 and V.UserId = U.id
order by p2.CreationDate DESC
FOR XML PATH, TYPE).value('.[1]','nvarchar(max)')
,1,1,'')
from Users U
order by U.Reputation DESC;
但是,当我 运行 data.stackexchange.com 上的查询时,它显示一条错误消息:Execution Timeout Expired.
有什么方法可以修改查询以优化执行时间,所以我可以 运行 这个查询成功吗?
您需要排除具有单个 XML 的子查询。这将需要使用结构 <user ...><tag1><tag2>...</user><user>...
(使用 EXPLICIT MODE)构建公共 XML。并将其解析为单个用户的行。
with U as(
select top 50 id, Reputation, DisplayName
from users order by Reputation DESC
),
V as(
select U.*,p2.Tags, p2.CreationDate
from U, posts p2, votes V
where p2.id = V.PostId and V.VoteTypeId=5 and V.UserId = U.id
),
Q(XML) as(
select tag,parent,id [user!1!id],Reputation [user!1!Reputation],Name [user!1!Name], T [T!2!!element]
from (
select 1 tag, NULL parent, U.id, U.Reputation, U.DisplayName Name, NULL t, NULL dt
from U
union all
select 2, 1, V.id, NULL, NULL, ','+Tags, CreationDate
from V
) X
order by id, tag, dt desc
for xml explicit, type
)
select node.value('(@id)[1]','int'),
node.value('(@Reputation)[1]','int'),
node.value('(@Name)[1]','nvarchar(max)'),
stuff(node.value('.[1]','nvarchar(max)'),1,1,'')
from Q
cross apply XML.nodes('/user') as Y(node)
order by 2 desc