0

別々のサーバーに 2 つのビューがあり、それらを 1 つのビューに結合しています。

これは私のクエリです:

SELECT *
FROM
(
 SELECT v1.Name COLLATE DATABASE_DEFAULT as Name, v1.Year as Year
 FROM AgentCallsByMonth v1
 UNION
 SELECT v2.Name as Name, v2.Year as Year
 FROM BH1PCIMD01.eGActiveDB.dbo.AgentChatsByMonth v2
 ) as u CROSS APPLY (
              SELECT       
                     ISNULL(v1.[Month],v2.[Month]) as [Month],
                     ISNULL(v2.[Chats], 0) AS [Chats], ISNULL(v1.[Calls], 0) AS [Calls]               
              FROM master..spt_values v 
                LEFT JOIN AgentCallsByMonth v1 ON v.number = v1.[MM] AND v1.Name = u.Name and v1.Year=u.Year
                LEFT JOIN BH1PCIMD01.eGActiveDB.dbo.AgentChatCountByMonth v2 ON v.number = v2.[MM] AND v2.Name = u.Name and v2.Year=u.Year
              WHERE v.type = 'P' AND v.number < 12 and u.Year = 2012
              ) o

何らかの理由で、これには永遠に時間がかかります。テーブルから個別にデータを取得すると、30 秒もかかりません。上記のクエリの最後の実行は 24 分であり、カウントされています。

何が起こる必要があるかについての少しの背景。

ユーザー名、00-mon 形式の月、およびカウントを持つ 2 つのテーブルがあります。ユーザーのカウントにアイテムがなかったため、いくつかの月が null になりました。そのため、月を作成し、そこに 0 を入れています。ただし、他のテーブルでは、他のテーブルには数がありませんでした。

例えば。

表1

JoeUser 01-Jan 48
JoeUser 03-Mar 12
JoeUser 09-Sep 3

表 2

JoeUser 01-Jan 12
JoeUser 02-Feb 4
JoeUser 05-May 6

結果の出力は次のとおりです。

JoeUser 01-Jan 48 12
JoeUser 02-Feb 0 4
JoeUser 03-Mar 12 0
JoeUser 04-Apr 0 0
JoeUser 05-May 0 6
JoeUser 06-June 0 0
etc
4

1 に答える 1

1

私の前のすべてのコメントに同意しますが、「COLLATE DATABASE_DEFAULT」を使用して照合を追加すると、特にテーブルがかなり大きい場合に、速度が低下する可能性が最も高いということを指摘しておく必要があります。返される行ごとにこれを行う必要があることに注意してください。

于 2013-01-30T06:22:10.263 に答える