SQL Server交叉应用速度问题

时间:2013-01-29 23:31:09

标签: sql sql-server sql-server-2012

我在单独的服务器上有两个视图,我将它们连接成一个视图。

这是我的疑问:

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格式的月份和计数。现在有几个月是空的,因为用户没有任何计数项,因此它们不会填充。所以我们创造了几个月并将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

1 个答案:

答案 0 :(得分:1)

我同意我之前的所有评论,但我应该指出的另一点是,使用“COLLATE DATABASE_DEFAULT”添加排序规则 - 最有可能导致速度减慢,特别是如果你的表格相当大。请记住,它必须为返回的每一行执行此操作。