Próbuję obliczyć liczbę równoczesnych połączeń w czasie wykonywania określonego połączenia, patrząc na zakresy datetime. Moje zapytanie działa, ale zajmuje około 10 minut, aby wykonać tylko 95 000 rekordów, co jest zbyt długie. Wszelkie pomysły na optymalizację?Jednoczesne połączenia
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
przykładowe dane
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
Jakiej wersji programu SQL Server używasz? –
Używam 2008R2. – user172839
Warunek jest równoważny: 'r_inner.CallStart <= r.CallEnd AND r.CallStart <= r_inner.CallEnd' (przy założeniu, że Start <= Koniec we wszystkich wierszach w obu tabelach.) –