同时通话 [英] Simultaneous calls

查看:81
本文介绍了同时通话的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试通过查看日期时间范围来计算在进行特定呼叫时的同时呼叫数.我的查询有效,但是只需要9分钟就能完成95,000条记录,这太长了.有优化的想法吗?

I'm trying to calculate the number of simultaneous calls at the time a particular call is made by looking at the datetime ranges. My query works, but takes ~10 minutes to perform for only 95,000 records, which is too long. Any ideas for optimization?

SELECT r.*,
       rr.ChannelsActive  'ChannelsActive'
FROM #rg r
OUTER APPLY
(
      SELECT SUM(1) AS ChannelsActive
      FROM #rg r_inner 
      WHERE 
      (
             r_inner.CallStart BETWEEN r.CallStart AND r.CallEnd 
            OR r_inner.CallEnd BETWEEN r.CallStart AND r.CallEnd
            OR r.CallStart BETWEEN r_inner.CallStart AND r_inner.CallEnd 
            OR r.CallEnd BETWEEN r_inner.CallStart AND r_inner.CallEnd

      )
 ) rr

示例数据

CREATE TABLE #rg
  (
     CallStart DATETIME,
     CallEnd   DATETIME
  )

CREATE INDEX ix1
  ON #rg(CallStart, CallEnd)

CREATE INDEX ix2
  ON #rg(CallEnd, CallStart);

WITH T(N, R)
     AS (SELECT TOP (95000) ROW_NUMBER() OVER (ORDER BY (SELECT 0)) AS RN,
                            ABS(120 + 30 * SQRT(-2 * LOG(ABS(CAST(CAST(CRYPT_GEN_RANDOM(8) AS BIGINT) AS FLOAT) / 9223372036854775807))) * COS(2 * PI() * ABS(CAST(CAST(CRYPT_GEN_RANDOM(8) AS BIGINT) AS FLOAT) / 9223372036854775807)))
         FROM   sys.all_objects o1,
                sys.all_objects o2)
INSERT INTO #rg
SELECT DATEADD(SECOND, N, GETDATE()),
       DATEADD(SECOND, N + R, GETDATE())
FROM   T 

推荐答案

这应该做到:

 ;WITH cteCallEvents As
 (
        SELECT *, CallStart As EventTime, 1 As EventType FROM #rg r
    UNION ALL
        SELECT *, CallEnd   As EventTime, 0 As EventType FROM #rg r
 )
 , cteCallCounts As
 (
    SELECT *,
        ROW_NUMBER() OVER(Order By EventTime) as EventCount,
        ROW_NUMBER() OVER(Partition By EventType Order By EventTime) as TypeCount
    FROM cteCallEvents
 )
 SELECT *,
    2*TypeCount - EventCount  As OpenCalls
FROM    cteCallCounts
WHERE   EventType = 1

最多只需要几秒钟.应该可以在任何SQL Server 2005+上使用.

It should take a couple of seconds at most. Should work on any SQL Server 2005+.

这篇关于同时通话的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆