Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 вьюха или индекс с актуальными данными  [new]
Leax
Member

Откуда: Киев
Сообщений: 438
Всем привет.

Столкнулся с такой проблемой:
Есть таблица с данными: номер документа, дата изменения, описание изменения
declare @t table (docID int, modified date, desciption varchar(20))

insert @t 
values 
(1, '2010-01-25', 'Описание1')
,(1, '2010-01-26', 'Описание2')
,(1, '2010-01-27', 'Описание3')
,(1, '2010-01-28', 'Описание4')
,(2, '2010-02-15', 'Описание5')
,(2, '2010-02-16', 'Описание6')
,(2, '2010-02-18', 'Описание7')
,(2, '2010-02-19', 'Описание8')

select docID, modified, desciption 
from (
	select docID, modified, desciption, ROW_NUMBER() over (partition by docID order by modified desc) rn from @t
) x
where x.rn = 1

Нужно отобразить самые последние данные для каждого документа. Можно реализовать так, как я отобразил в примере.
Однако при числе строк порядка несколько миллионов начинаются серьезные проблемы со временем выполнения такого запроса. Эффективно не помогает даже индекс по полям docID asc, modified desc c Included колонкой desciption.

Можно ли каким-то образом создать или индекс или написать по другому условие выбора, чтобы актуальные данные выбирались максимально быстро? В идеале - это вьюха из которой сразу получаем актуальные данные
8 фев 14, 16:54    [15539656]     Ответить | Цитировать Сообщить модератору
 Re: вьюха или индекс с актуальными данными  [new]
Leax
Member

Откуда: Киев
Сообщений: 438
Увидел причину таких "тормозов".
Почему-то оптимизатор в сложном запросе, содержащем join с Select'ом из данного примера строит план выполнения с использованием Index Scan вместо Index Seek. Если же выполнять данный select отдельно, то оптимизатор использует Index Seek, как и положено.

Почему оптимизатор принимает такое решение в первом случае- непонятно...
8 фев 14, 17:52    [15539928]     Ответить | Цитировать Сообщить модератору
 Re: вьюха или индекс с актуальными данными  [new]
Glory
Member

Откуда:
Сообщений: 104751
Leax
Почему оптимизатор принимает такое решение в первом случае- непонятно...

Разные запросы оптимизатор выполняет по-разному
8 фев 14, 17:57    [15539953]     Ответить | Цитировать Сообщить модератору
 Re: вьюха или индекс с актуальными данными  [new]
qwerty112
Guest
Leax,

зачем вам внешний запрос понадобился ?
почему не так
select top 1 with ties docID, modified, desciption from @t
order by ROW_NUMBER() over (partition by docID order by modified desc)
8 фев 14, 20:08    [15540529]     Ответить | Цитировать Сообщить модератору
 Re: вьюха или индекс с актуальными данными  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
qwerty112
Leax,

зачем вам внешний запрос понадобился ?
почему не так
select top 1 with ties docID, modified, desciption from @t
order by ROW_NUMBER() over (partition by docID order by modified desc)
Это почти то же самое, но немного хуже.
Неоднократно когда-то оценивали
8 фев 14, 20:27    [15540611]     Ответить | Цитировать Сообщить модератору
 Re: вьюха или индекс с актуальными данными  [new]
Leax
Member

Откуда: Киев
Сообщений: 438
iap
qwerty112
Leax,

зачем вам внешний запрос понадобился ?
почему не так
select top 1 with ties docID, modified, desciption from @t
order by ROW_NUMBER() over (partition by docID order by modified desc)
Это почти то же самое, но немного хуже.
Неоднократно когда-то оценивали

Да, а если посмотреть план выполнения данных запросов, то стоимость моего запроса почти в 2 раза ниже в данном примере.
9 фев 14, 12:00    [15542041]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить