我在单独的服务器上有两个视图,我将它们连接成一个视图。
这是我的疑问:
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
答案 0 :(得分:1)
我同意我之前的所有评论,但我应该指出的另一点是,使用“COLLATE DATABASE_DEFAULT”添加排序规则 - 最有可能导致速度减慢,特别是如果你的表格相当大。请记住,它必须为返回的每一行执行此操作。