Хранение активной строки в битовом столбце против сохранения логики в представлении - PullRequest
0 голосов
/ 18 мая 2018

У меня есть запрос, в котором несколько факторов определяют фактическую активную строку.Могу ли я сделать это в режиме реального времени и при этом оставаться продуктивным, или подход с битовым полем является общепринятым подходом, где указывается, индексируется и запрашивается текущее активное поле?

Мое решение в реальном времени включаетпромежуточный шаг в представлении (временная таблица в моем примере ниже).Поэтому я обеспокоен производительностью, потому что мне придется иметь дело с сотнями тысяч до миллионов записей.

Для иллюстрации:

DECLARE @grades TABLE (
    person int,
    grade int,
    attempt int,
    correction int)

INSERT @grades VALUES (1, 80, 1, 0)
INSERT @grades VALUES (1, 90, 2, 0)
INSERT @grades VALUES (1, 100, 3, 0)
INSERT @grades VALUES (2, 95, 1, 0)
INSERT @grades VALUES (2, 80, 1, 1)
INSERT @grades VALUES (2, 90, 1, 2)
INSERT @grades VALUES (2, 89, 1, 3)

SELECT b.*
INTO #grades_corrected
FROM @grades AS b
RIGHT JOIN (
    SELECT person, attempt, MAX(correction) AS last_correction
    FROM @grades as b
    GROUP BY person, attempt
)
AS last_corrections
ON (b.attempt = last_corrections.attempt
    AND b.correction = last_corrections.last_correction
    AND b.person = last_corrections.person
)

SELECT g.*
FROM #grades_corrected g
LEFT OUTER JOIN #grades_corrected g2 ON (
    g.person = g2.person
    AND g.grade < g2.grade)
WHERE g2.grade is null

DROP TABLE #grades_corrected

1 Ответ

0 голосов
/ 18 мая 2018

Производительность будет гораздо больше нюансов, чем просто у вас есть sql.В любом случае вышеупомянутый sql будет разбит по группе наиболее быстро с копией max и временной таблицы.Оба из них будут сильно зависеть от того, сколько записей в таблице и сколько энергии (в основном процессор и оперативная память) на вашем сервере sql.Если вы скопируете «миллионы» записей во временную таблицу, это, скорее всего, будет медленным по большинству стандартов.

...