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

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

Есть табличка в ней больше миллиона записей.
Данные из неё выгребаются в грид. В гриде есть пейджинг.
Запрос по выгребанию данных такой :
SELECT * 
FROM (
	SELECT *, ROW_NUMBER() OVER (ORDER BY CreatedDate DESC) as RowNumber 
	FROM 
		vw_audit_log
	) AS AL
WHERE
        RowNumber BETWEEN 450271 and 450271 + 10 - 1


Запрос выполняется 1,5 минуты. Для пользователя это не слишком приемлемо.

Можете что-нибудь посоветовать, как ускорить работу запроса ?
Индексация по полю дата не вариант, потому как есть ещё 4 тестовых поля.
31 авг 12, 18:35    [13097107]     Ответить | Цитировать Сообщить модератору
 Re: Долго выгребаются данные из view  [new]
Alexandr Kr.
Member

Откуда: Украина, Харьков
Сообщений: 165
Tellurian
Всем привет.

Индексация по полю дата не вариант, потому как есть ещё 4 тестовых поля.


А что имеется ввиду под тестовыми полями, из-за которых невозможно построить индекс?
31 авг 12, 18:39    [13097122]     Ответить | Цитировать Сообщить модератору
 Re: Долго выгребаются данные из view  [new]
Читатель неместный
Guest
Надо построить кластерный индекс по полю CreatedDate.
31 авг 12, 18:44    [13097154]     Ответить | Цитировать Сообщить модератору
 Re: Долго выгребаются данные из view  [new]
Программист-Любитель
Member

Откуда:
Сообщений: 16839
Судя по названию аудит_лог туда что-то сваливается и там лежит. Нельзя организовать хранение насчитанных роу_намбер ? Выборка по битвин будет мгновенная.
31 авг 12, 19:05    [13097266]     Ответить | Цитировать Сообщить модератору
 Re: Долго выгребаются данные из view  [new]
Tellurian
Member

Откуда:
Сообщений: 7
Программист-Любитель
Судя по названию аудит_лог туда что-то сваливается и там лежит. Нельзя организовать хранение насчитанных роу_намбер ? Выборка по битвин будет мгновенная.


Нельзя, потому как сортировка может быть не только по полю CreationDate. Есть ещё 4 текстовых поля, по которым можно сортировать. Индекс по ним можно построить, но это же бред: индексировать кучу текста.
31 авг 12, 19:08    [13097285]     Ответить | Цитировать Сообщить модератору
 Re: Долго выгребаются данные из view  [new]
aleks2
Guest
Tellurian
Программист-Любитель
Судя по названию аудит_лог туда что-то сваливается и там лежит. Нельзя организовать хранение насчитанных роу_намбер ? Выборка по битвин будет мгновенная.


Нельзя, потому как сортировка может быть не только по полю CreationDate. Есть ещё 4 текстовых поля, по которым можно сортировать. Индекс по ним можно построить, но это же бред: индексировать кучу текста.


1. Осознай простую истину: шоб получить записи с №450271 надо эти 450271 элементов пронумеровать.
2. Как только на тебя снизойдет просветление - ты сообразишь ROW_NUMBER() OVER (ORDER BY CreatedDate DESC) для твоих целей непригодна.
31 авг 12, 19:13    [13097303]     Ответить | Цитировать Сообщить модератору
 Re: Долго выгребаются данные из view  [new]
Tellurian
Member

Откуда:
Сообщений: 7
1. Осознай простую истину: шоб получить записи с №450271 надо эти 450271 элементов пронумеровать.
2. Как только на тебя снизойдет просветление - ты сообразишь ROW_NUMBER() OVER (ORDER BY CreatedDate DESC) для твоих целей непригодна.


Да я осознаю. Потому сюда и обратился. Так как в SQL не очень силён.
Если бы я знал ответ на вопрос, то на форуме не писал.
31 авг 12, 19:16    [13097318]     Ответить | Цитировать Сообщить модератору
 Re: Долго выгребаются данные из view  [new]
aleks2
Guest
Tellurian
Есть ещё 4 текстовых поля, по которым можно сортировать. Индекс по ним можно построить, но это же бред: индексировать кучу текста.


Это не бред. 4-5 постоянных полей с нужными нумерациями и индексами по этим полям решают фсе твои проблемы.
31 авг 12, 19:20    [13097332]     Ответить | Цитировать Сообщить модератору
 Re: Долго выгребаются данные из view  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 35397
Блог
select top 10 + индексы по условиям
31 авг 12, 20:08    [13097472]     Ответить | Цитировать Сообщить модератору
 Re: Долго выгребаются данные из view  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31986
Tellurian
1. Осознай простую истину: шоб получить записи с №450271 надо эти 450271 элементов пронумеровать.
2. Как только на тебя снизойдет просветление - ты сообразишь ROW_NUMBER() OVER (ORDER BY CreatedDate DESC) для твоих целей непригодна.


Да я осознаю. Потому сюда и обратился. Так как в SQL не очень силён.
Если бы я знал ответ на вопрос, то на форуме не писал.
Тут нужно быть сильным в программировании, а не в SQL :-)

В лоб такую задачу не решить, всё равно будет медленно (разве что зараннее нумеровать записи в таблице, но это неприемлимо, если идёт много обновлений).

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

Например, пусть ключём будет поле CreatedDate

В гриде мы находимся на записи №450261, и сохранён ключ @CurrentCreatedDate для записи, последней на странице (№450270)

Тогда следующая страница (т.е. записи 450271-450280) будет (при прямой сортировке по CreatedDate):

SELECT TOP 10 *	
FROM vw_audit_log 
WHERE CreatedDate > @CurrentCreatedDate 
ORDER BY CreatedDate

Думаю, эффективный запрос на переход не на 1, а на 10 страниц вы сможете построить сами.

Единственное неудобство, что для этого способа нужен уникальный ключ из одного поля, по которому идёт сортировка, а у вас сортировка по трём полям. В таком случае нужно сделать либо дополнительное поле, куда класть значения всех трёх полей, либо вычисляемое индексируемое поле, и его использовать как ключ. Т.е. если у вас дата+2 текстовых поля, то вычисляемое поле будет выглядеть как то так: '201208312202:text1 text1 text1:text2 text2 text2'

Да, есть ещё одна сложность - может быть сортировка по одному полю ASC, а по другому DESC...
Тут можно инвертировать значение этого поля в том самом составном ключе - для поля CreatedDate будем хранить, допустим, количество дней между 2300 годом и CreatedDate
Тогда вычисляемое поле будет выглядеть как то так: '12345:text1 text1 text1:text2 text2 text2'
31 авг 12, 22:04    [13097796]     Ответить | Цитировать Сообщить модератору
 Re: Долго выгребаются данные из view  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Кривые интерфейсы приводят к кривым решениям.

Когда поставишь вопрос "а зачем нумерование листов", тогда начинаешь это понимать.
Подсказка 1: списки состоят не только из натуральных чисел
31 авг 12, 23:18    [13098092]     Ответить | Цитировать Сообщить модератору
 Re: Долго выгребаются данные из view  [new]
Tellurian
Member

Откуда:
Сообщений: 7
Вопрос решен. Через временную таблицу. И создание дополнительного поля ID.
3 сен 12, 18:12    [13107945]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить