【发布时间】:2014-09-20 00:46:43
【问题描述】:
SELECT
b.User_Id
,(CONVERT(varchar, DATEADD(hh, - 7, b.callstartdt), 101))as 'Dt'
,(COUNT(distinct b.SeqNum ) + Count(distinct c.SeqNum) + count(distinct d.seqnum)) as 'TotalCalls'
,COUNT(distinct b.SeqNum )as 'ACD'
,COUNT(distinct c.SeqNum)as 'AOD'
,COUNT(distinct d.seqnum) as 'Manual'
,COUNT(distinct e.SeqNum)as 'Contacts'
,COUNT (distinct es.seqnum) as 'Success'
FROM
[detail_epro].[dbo].[ACDCallDetail]as b
LEFT JOIN
[detail_epro].[dbo].[AODCallDetail]as c on c.User_Id = b.User_Id
LEFT JOIN
[detail_epro].[dbo].[manualCallDetail]as d on d.User_Id = b.User_Id
LEFT JOIN
(SELECT
USER_ID, CallStartDt, SeqNum
FROM
[detail_epro].[dbo].[AgentDispoDetail]
WHERE
Disp_Id IN
(100000150, 100000126, 100000137, 100000093, 100000133,
100000123, 100000094, 100000161, 100000162, 100000085,
100000084, 100000086, 100000096, 100000087, 100000157,
100000088, 100000097, 100000154, 100000148, 100000134,
100000131, 100000160, 100000156, 100000165, 100000166,
100000122, 100000121, 100000138, 100000130, 100000144,
100000132, 100000158, 100000098, 100000147, 100000100,
100000153, 100000139, 100000145, 100000101, 100000140,
100000102, 100000103, 100000104, 100000105, 100000106,
100000159, 100000112, 100000135, 100000090, 100000113,
100000141, 100000146, 100000115, 100000108, 100000092,
100000155, 100000125, 100000151, 100000136, 100000107,
100000142)
) AS e ON e.User_Id = b.User_Id
LEFT JOIN
(SELECT
USER_ID, CallStartDt, SeqNum
FROM
[detail_epro].[dbo].[AgentDispoDetail]
WHERE Disp_Id IN
(100000150, 100000137, 100000093, 100000133, 100000123,
100000094, 100000161, 100000085, 100000086, 100000157,
100000088, 100000131, 100000160, 100000156, 100000165,
100000166, 100000122, 100000121, 100000138, 100000144,
100000132, 100000098, 100000100, 100000153, 100000139,
100000145, 100000101, 100000140, 100000102, 100000103,
100000105, 100000106, 100000159, 100000112, 100000135,
100000141, 100000146, 100000115, 100000108, 100000092,
100000155, 100000125, 100000151, 100000136, 100000107)
) AS es ON es.User_Id = b.User_Id
WHERE
(CONVERT(varchar, DATEADD(hh, - 7, b.CallStartDt), 101)) = (CONVERT(varchar, DATEADD(hh, - 7, c.CallStartDt), 101))
AND (CONVERT(varchar, DATEADD(hh, - 7, b.CallStartDt), 101))= (CONVERT(varchar, DATEADD(hh, - 7, d.CallStartDt), 101))
AND (CONVERT(varchar, DATEADD(hh, - 7, b.CallStartDt), 101))= (CONVERT(varchar, DATEADD(hh, - 7, e.CallStartDt), 101))
AND (CONVERT(varchar, DATEADD(hh, - 7, b.CallStartDt), 101))= (CONVERT(varchar, DATEADD(hh, - 7, es.CallStartDt), 101))
AND (CONVERT(varchar, DATEADD(hh, - 7, b.CallStartDt), 101)) >= '08/01/2014'
GROUP BY
b.User_Id, b.CallStartDt
运行此查询花费的时间比我想运行的要长,超过一分钟,我猜这与服务器有很大关系,但我想我会问是否有人有任何想法让这个更快
查询是获取一些电话代理数据,没有任何表格汇总
- acd = 呼入电话
- aod = 拨号器调用
- manual = 手动调用
- 联系人 = 基于代理将使用的处置代码
- 成功 = 是联系人的子集
【问题讨论】:
-
您到底为什么要将日期时间转换为
VARCHAR,甚至更糟的是转换为'08/01/2014'格式? -
在这里,查看接受的答案以了解解释是什么stackoverflow.com/a/7359705/1745672
-
如果必须这样设置,那么我会考虑使用 DatePart 而不是投射整个日期。
-
要清楚,当您投射日期并比较它们时会发生什么,sql 必须逐个字符地检查每个日期并比较每个单独的字符。您的每个日期比较现在都在进行十次比较,而不是一次。
-
除了其他人投入到环中的内容之外,您还有 LEFT-JOIN,但随后在 WHERE 子句中明确测试各自“c”、“d”、“e”和“ es" 别名,因此将其转换为所有 INNER JOIN。这是你的意图吗?
标签: sql sql-server optimization lag