У нас є сховище даних з досить великою кількістю записів (10-20 мільйонів рядків) і часто виконуємо запити, які підраховують записи між певними датами, або рахують записи з певними прапорами, наприклад
SELECT
f.IsFoo,
COUNT(*) AS WidgetCount
FROM Widgets AS w
JOIN Flags AS f
ON f.FlagId = w.FlagId
WHERE w.Date >= @startDate
GROUP BY f.IsFoo
Виступ не жахливий, але може бути досить млявим (можливо, 10 секунд у холодному кеші).
Нещодавно я виявив, що можу використовувати GROUP BY
в індексованих поданнях, і тому випробував щось подібне до наступного
CREATE VIEW TestView
WITH SCHEMABINDING
AS
SELECT
Date,
FlagId,
COUNT_BIG(*) AS WidgetCount
FROM Widgets
GROUP BY Date, FlagId;
GO
CREATE UNIQUE CLUSTERED INDEX PK_TestView ON TestView
(
Date,
FlagId
);
В результаті ефективність мого першого запиту зараз становить <100 мс, а отриманий вигляд та індекс - <100 к (хоча наш ряд рядків великий, діапазон дат та ідентифікаторів прапор означає, що цей вид містить лише 1000-2000 рядків).
Я думав, що, можливо, це буде калічити ефективність записів у таблицю віджетів, але ні - на ефективність вставок і оновлень у цю таблицю, наскільки я міг сказати, майже не впливає (плюс, оскільки це сховище даних, ця таблиця оновлюється нечасто. все одно)
Мені це здається занадто гарним, щоб бути правдою - чи не так? З чим я повинен бути обережним, коли таким чином використовуються індексовані види?
SELECT
таCREATE VIEW
сценарії помиляються, як я вважаю, це вашCREATE INDEX
сценарій.