2017-11-16 2 views
0

stackexchangeデータベースからデータを取得しようとしています。私のクエリは次のとおりです。SQL - 実行時間を最適化する

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.を私がするように、実行時間を最適化するために、クエリを変更することができる方法はありますこのクエリは正常に実行できますか?

+0

ここに実行計画を掲載して、https://www.brentozar.com/pastetheplan/に投稿してください。また、 'index'の詳細を追加します –

+0

私はデータベースからオフラインデータを持っていませんstackexchangeデータベースを介して実行計画をオンラインで取得する方法を知っていません。 @Pサブ –

答えて

0

個々の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 
+0

ありがとう!できます!しかし、「top 5000」を取得しようとすると、期待値のタイムアウトが発生する可能性があります。トップ5000の行を検索するのを手伝ってもらえますか? –

+0

@LeoLi 5000人以上のユーザーには500kの音声がありますが、これはあまりにも多くの人に負担をかけます。 – Mike

関連する問題