Sql server: нове рішення задачі упаковки інтервалів. Продовження

Відео: Машина для упаковки в пакети дой пак з зіп

SQL Server: нове рішення задачі упаковки інтервалів. продовження
Мета другого етапу - з`ясувати, чи починається новий упакований інтервал з поточного інтервалу. На цьому кроці реалізована важлива частина рішення, тому обов`язково розберіться в його логіці. Інтервали I1 і I2 перетинаються, якщо виконуються дві умови: I2.endtime gt; = I1.starttime AND 12. starttime lt; = I1.endtime. Очевидно, в сеансах аж до передує поточному для останнього упакованого інтервалу в якості часу завершення буде використовуватися значення prvend. Завдяки віконного пропозицією порядку в обчисленні prvend за визначенням час завершення поточного сеансу більше або дорівнює часу початку останнього упакованого інтервалу. Це пояснюється тим, що час початку поточного сеансу більше або дорівнює часу початку будь-якого попереднього сеансу, а час завершення поточного сеансу більше або дорівнює часу початку поточного сеансу. Іншими словами, одна з умов перетину між поточним сеансом і останнім упакованим інтервалом завжди мається на увазі. Тому залишається явно перевірити лише іншу умову. А саме, якщо час початку поточного сеансу менше або дорівнює значенню prvend, то воно не починає новий упакований інтервал- в іншому випадку - починає. На основі цієї логіки в наступному програмному коді розраховується прапор з ім`ям isstart, якому присвоюється значення NULL, якщо поточний сеанс починає новий упакований інтервал, і значення 1, якщо починає:
WITH C1 AS (SELECT *, MAX (endtime) OVER (PARTITION BY actidORDER BY starttime, endtime, sessionidROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS prvendFROM dbo.Sessions) SELECT * FROM C1CROSS APPLY (VALUES (CASE WHEN starttime lt; = prvend THEN NULL ELSE 1 END)) AS A (isstart) -

SQL Server: нове рішення задачі упаковки інтервалів. продовження
Вихідні дані кроку 2

Третій крок рішення - формування групового ідентифікатора упакованих інтервалів (назвемо його grp) з обчисленням простої суми наростаючим підсумком прапора isstart від початку розділу до поточного рядка. Нижче наводиться програмний код, який реалізує цей крок:






WITH C1 AS (SELECT *, MAX (endtime) OVER (PARTITION BY actidORDER BY starttime, endtime, sessionidROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS prvendFROM dbo.Sessions) SELECT *, SUM (isstart) OVER (PARTITION BY actidORDER BY starttime, endtime, sessionidROWS UNBOUNDED PRECEDING) AS grpFROM C1CROSS APPLY (VALUES (CASE WHEN starttime lt; = prvend THEN NULL ELSE 1 END)) AS A (isstart) -

SQL Server: нове рішення задачі упаковки інтервалів. продовження
Вихідні дані кроку 3

SQL Server: нове рішення задачі упаковки інтервалів. продовження
Повний нове рішення

Відео: Про правильної і неправильної упаковці


Нарешті, щоб отримати упаковані інтервали, на четвертому кроці рядки результати кроку 3 групуються за ідентифікатором облікового запису і групового ідентифікатора. Повертаються мінімальний час початку в якості часу початку упакованого інтервалу і максимальний час завершення в якості часу завершення упакованого інтервалу. Програмний код, який ви бачите вище, представляє повне рішення.

SQL Server: нове рішення задачі упаковки інтервалів. продовження
Вихідні дані повного рішення

SQL Server: нове рішення задачі упаковки інтервалів. продовження
План для нового рішення з використанням віконних агрегатів

План виконання цього рішення дуже ефективний. На малюнку вище показаний мій план (побудований з використанням оглядача планів SQL Sentry (https://sqlsentry.com/products/plan-explorer)) для великих наборів тестових даних. Як ми бачимо, виконується тільки один впорядкований перегляд допоміжного індексу. Обидві віконні функції покладаються на порядок індексу, а не на явну сортування. Я отримав наступні статистичні дані про продуктивність для цього запиту на своєму комп`ютері: час центрального процесора = 12 545 мс, що минув час = 4277 мс, число логічних операцій читання = 3300.


Ваша корпоративна мережа дихає на ладан і постійно стає вашим головним болем? Значить, вам дійсно точно слід відвідати сторінку https://pks-alteko.ru/uslugi/resheniya_dlya_gos_struktur/ (https://pks-alteko.ru/uslugi/resheniya_dlya_gos_struktur/). Тут ви знайдете досвідчених фахівців з IT, які відмінно розбираються як SQL Server, так і в будь-яких інших мережевих середовищах, службовців для управління базами даних.

ІНШЕ

» » Sql server: нове рішення задачі упаковки інтервалів. Продовження