2016-05-17 2 views
2

Я пытаюсь создать индексный просмотр, содержащий только данные за последние 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 недели? Мне нужна небольшая и быстрая запрашиваемая часть данных из моего стола.

+0

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

+0

Почему вы создаете индекс для ID – TheGameiswar

+0

@TheGameiswar, потому что я хочу проверить его. Первый колум. В этом случае он пренебрежимо мал. Послушайте, что это не сработает. – BWA

ответ

2

Вы можете (я думаю, но у меня нет опыта реального мира с индексированными представлениями) создать одну таблицу записей (фактическая таблица, поскольку представление не разрешено в индексированном представлении), которое вы заполняете текущей датой - 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 

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

+0

Умный, я проверю его. – BWA

+0

Работы, индекс создан ;-) Я должен проверить его более сложным. – BWA

+0

@BWA Прохладный, не забудьте проверить производительность. Возможно, вам будет лучше с менее взломанным методом. – HoneyBadger