У меня есть таблица, в которой хранятся отношения родитель-ребенок между элементами. Они могут быть изменены с течением времени, и необходимо вести полную историю, чтобы я мог спросить, как были отношения в любое время.
Таблица выглядит примерно так (я удалил несколько столбцов, первичный ключ и т. Д., Чтобы уменьшить шум):
CREATE TABLE [tblRelation](
[dtCreated] [datetime] NOT NULL,
[uidNode] [uniqueidentifier] NOT NULL,
[uidParentNode] [uniqueidentifier] NOT NULL
)
Мой запрос на получение отношений в определенное время выглядит следующим образом (предположим, @dt - это дата и время с желаемой датой):
SELECT *
FROM (
SELECT ROW_NUMBER() OVER (PARTITION BY r.uidNode ORDER BY r.dtCreated DESC) ix, r.*
FROM [tblRelation] r
WHERE (r.dtCreated < @dt)
) r
WHERE r.ix = 1
Этот запрос работает хорошо. Однако производительность пока не так хороша, как хотелось бы. Если посмотреть на план выполнения, он сводится к сканированию кластерного индекса (36% стоимости) и сортировке (63% стоимости).
Какие индексы я должен использовать, чтобы сделать этот запрос быстрее? Или вообще есть лучший способ выполнить этот запрос к этой таблице?