Индексированное представление с данными за последние две недели

Я пытаюсь создать индексированное представление, содержащее только данные за последние 2 недели.

Эта часть работает нормально:

CREATE VIEW [dbo].[MainLogView]
WITH SCHEMABINDING
AS
SELECT        Id, Date, System, [Function], StartTime, EndTime, Duration, ResponseIsSuccess, ResponseErrors
FROM            dbo.MainLog
WHERE        (Date >= DATEADD(day, - 14, GETDATE()))

Но когда я пытаюсь добавить индекс:

CREATE UNIQUE CLUSTERED INDEX IDX_V1 
    ON MainLogView (Id);

я получаю:

Не удается создать индекс для представления «dbo.MainLogView». Функция getdate дает недетерминированные результаты. Используйте детерминированную системную функцию или измените пользовательскую функцию, чтобы она возвращала детерминированные результаты.

Я знаю почему, но как уменьшить данные в представлении за последние 2 недели? Мне нужна небольшая и быстрая часть данных из моей таблицы.


person BWA    schedule 17.05.2016    source источник
comment
Вы не можете. Обслуживание индексированного представления эффективно выполняется с помощью триггеров для базовых таблиц и исключительно на основе строк, затронутых отдельными действиями в этих базовых таблицах (отсюда и все их ограничения). Последние две недели потребуются альтернативные механизмы обслуживания, которых нет в SQL Server.   -  person Damien_The_Unbeliever    schedule 17.05.2016
comment
Почему вы создаете индекс для ID   -  person TheGameiswar    schedule 17.05.2016
comment
@TheGameiswar, потому что я хочу это проверить. Первый столбец. В данном случае она незначительна. Потому что это не работает.   -  person BWA    schedule 17.05.2016
comment
если mainlog - это таблица, почему бы вам не создать индекс для функции dateadd и просто использовать выбор в своем представлении?   -  person TheGameiswar    schedule 17.05.2016
comment
@TheGameiswar Мне нужно что-то вроде материализованного представления в оракуле. Я хочу получить данные из представления без воздействия на MainLog. И обновляйте данные в поле зрения один раз в день.   -  person BWA    schedule 17.05.2016


Ответы (1)


Вы могли бы (я думаю, но у меня нет реального опыта работы с индексированными представлениями) создать таблицу с одной записью (фактическая таблица, поскольку представление не разрешено в индексированном представлении), которую вы заполняете текущей датой - 14 дней. Эту таблицу вы можете поддерживать в актуальном состоянии; либо вручную, спусковым крючком или каким-то другим хитрым механизмом. Вы можете использовать эту таблицу для объединения и фактически использовать ее в качестве фильтра.

Конечно, когда вы запрашиваете представление, вы должны обязательно сначала обновить таблицу «currentDate»!

Вы получите что-то вроде:

CREATE VIEW [dbo].[MainLogView]
WITH SCHEMABINDING
AS
SELECT        Id, Date, System, [Function], StartTime, EndTime, Duration, ResponseIsSuccess, ResponseErrors
FROM            dbo.MainLog ML
INNER JOIN      dbo.CurrentDate CD
           ON   ML.Date >= CD.CurrentDateMin14Days

(Полностью не проверено, может не сработать... Это в основном хак, я совсем не уверен, что индексированное представление даст вам какое-либо увеличение производительности. Возможно, вам лучше использовать обычное представление.)

person HoneyBadger    schedule 17.05.2016
comment
Умничка, буду тестировать. - person BWA; 17.05.2016
comment
Работает, индекс создан ;-) Надо посложнее протестировать. - person BWA; 17.05.2016
comment
@BWA Круто, не забудь проверить производительность. Возможно, вам будет лучше использовать менее хакерский метод. - person HoneyBadger; 17.05.2016