Создать индекс в представлении с последней записью группового выбора

Я пытаюсь улучшить производительность своих представлений с помощью индексированных представлений, однако я не уверен, смогу ли я преодолеть ограничения.

На мой взгляд, я пытаюсь выбрать последние записи для определенной группы. Я могу написать такой запрос либо с помощью внутреннего выбора, либо с использованием общего табличного выражения с row_number() OVER..PARTITION BY.

Однако оба этих подхода не позволяют создать индекс для представления. Есть ли другой способ написать представление, чтобы я мог создать для него индекс?

SELECT [Person ID], [Updated DateTime], Email
FROM   dbo.[People Information History] AS [People Information]
WHERE  ([People Information].[Updated DateTime] =
            (SELECT        MAX([Updated DateTime]) AS Expr1
            FROM            dbo.[People Information History]
            WHERE        ([People Information].[Person ID] = [Person ID])))

or

WITH [Current  Information]
AS
(
    SELECT [Person ID], [Updated DateTime], Email,
           row_number() OVER (PARTITION BY [Updated DateTime] ORDER BY [Updated DateTime] DESC) as RowNum
    FROM dbo.[People Information History]
)

SELECT [Person ID], [Updated DateTime], Email
FROM   [Current  Information]
WHERE RowNum = 1

person Liero    schedule 09.07.2018    source источник
comment
каковы ваши показатели по истории информации о людях?   -  person Ctznkane525    schedule 09.07.2018
comment
PK сгруппировано по (идентификатор человека и обновленная дата и время), а также не сгруппировано по электронной почте и пару других столбцов, которые я пропустил   -  person Liero    schedule 09.07.2018
comment
Вы не можете. Правила для индексированных представлений означают, что представление может поддерживаться исключительно из фактических строк, на которые влияет какой-либо конкретный оператор DML. Но если последняя строка здесь удалена, невозможно узнать, какой новой последней строкой заменить, без сканирования всей базовой таблицы.   -  person Damien_The_Unbeliever    schedule 09.07.2018
comment
Вы запускали этот запрос через Query Analyzer? Это может дать вам простой индекс, который значительно повысит вашу производительность.   -  person Jason Geiger    schedule 09.07.2018
comment
Это проблема, которую я очень и очень старался решить. Здесь — отличная статья Алекса Кузнецова и его ответ на StackExchange DBA, который ссылается на некоторые другие важные решения.   -  person Reversed Engineer    schedule 01.07.2021


Ответы (1)


Вы должны создать индексы на ваших реальных таблицах.

Кажется, это неправильно с вашим вторым скриптом, например:

PARTITION BY [Person ID]

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

person Joyson    schedule 09.07.2018
comment
Если мне нужно создавать индексированные данные для реальных таблиц, для чего нужны индексированные представления? Идентификатор человека не уникален в таблице [People Information History]. И вообще, я не понимаю, что не так в моем PARTITION BY. Не могли бы Вы уточнить? - person Liero; 10.07.2018