Ускорить запрос
От: Didi  
Дата: 30.07.15 10:57
Оценка:
Народ, есть ли способы помочь серверу выполнить запрос:
SELECT * FROM Table WHERE field1 <= const AND const <= field2
field1, field2 — поля таблицы типа INT
field1 <= field2 или это всегда перебор всех записей в таблице?
Re: Ускорить запрос
От: Alex.Che  
Дата: 30.07.15 11:06
Оценка: +1
> Народ, есть ли способы помочь серверу выполнить запрос:
> SELECT * FROM Table WHERE field1 <= const AND const <= field2
> field1, field2 — поля таблицы типа INT
> field1 <= field2 или это всегда перебор всех записей в таблице?

Сервер какой?
Индексы какие есть?
Каков текущий план выполнения запроса?
Posted via RSDN NNTP Server 2.1 beta
Re: Ускорить запрос
От: Softwarer http://softwarer.ru
Дата: 30.07.15 11:56
Оценка:
Здравствуйте, Didi, Вы писали:

Смотря насколько помочь. На бытовом уровне индекс по (field1, field2) либо по любому из этих полей может пригодиться, если условие выбора селективно. А на более серьёзном — смотреть, как в используемой СУБД поддерживаются r-индексы.
Re: Ускорить запрос
От: Vaako Украина  
Дата: 30.07.15 12:08
Оценка: -5 :)
Здравствуйте, Didi, Вы писали:

D>Народ, есть ли способы помочь серверу выполнить запрос:

D>SELECT * FROM Table WHERE field1 <= const AND const <= field2
D>field1, field2 — поля таблицы типа INT
D>field1 <= field2 или это всегда перебор всех записей в таблице?

SELECT * FROM Table WITH(NOLOCK)
WHERE field1 <= const AND const <= field2

ускорит
Re[2]: Ускорить запрос
От: Alex.Che  
Дата: 30.07.15 12:10
Оценка:
> SELECT * FROM Table *WITH(NOLOCK)*
> WHERE field1 <= const AND const <= field2
>
> ускорит

вот поэтому я не люблю школьников...
Posted via RSDN NNTP Server 2.1 beta
Re: Ускорить запрос
От: Somescout  
Дата: 30.07.15 14:57
Оценка: 2 (1)
Здравствуйте, Didi, Вы писали:

D>Народ, есть ли способы помочь серверу выполнить запрос:

D>SELECT * FROM Table WHERE field1 <= const AND const <= field2
D>field1, field2 — поля таблицы типа INT
D>field1 <= field2 или это всегда перебор всех записей в таблице?

Когда пытался понять что такое CROSS APPLY наткнулся на такую статью. Возможно поможет, хотя тут инвертированное условие.
ARI ARI ARI... Arrivederci!
Отредактировано 30.07.2015 15:22 Somescout . Предыдущая версия . Еще …
Отредактировано 30.07.2015 15:21 Somescout . Предыдущая версия .
Re: Ускорить запрос
От: Docker Канада  
Дата: 31.07.15 14:13
Оценка:
Здравствуйте, Didi, Вы писали:

Мда, вам не повезло... Вот к примеру народ тоже страдает.

В общем случае да, будет перелопачена часть индекса или вообще вся таблица. Проблема вот в чем. Допустим в вашей таблице миллион записей и field1 содержит все числа от 1 до 1 млн. А теперь допустим вы ищете const = 500000. Произойдет то, что в лучшем случае серверу придеться перелопатить 500000 записей в индексе, если он селективный, в худшем сделать полный table scan. И это будет самое лучшее, что можно придумать.

Но, безвыходных ситуаций нет! Подумайте какие еще условия у вас есть для field1/field2. К примеру, если вы знаете, что max(field2-field1) меньше относительно небольшой константы (назовем ее max_len), то можете добавить условие

SELECT * FROM Table WHERE field1 <= const AND field1 >= const — max_len AND const <= field2

может значительно ускорить выборку.

У меня была задача поиска по отрезкам IP адресов в многомиллионной таблице. Этот поход сработал на ура. В вашем может быть еще что-нибудь.

D>Народ, есть ли способы помочь серверу выполнить запрос:

D>SELECT * FROM Table WHERE field1 <= const AND const <= field2
D>field1, field2 — поля таблицы типа INT
D>field1 <= field2 или это всегда перебор всех записей в таблице?
Re[2]: Ускорить запрос
От: LuciferArh Россия  
Дата: 02.08.15 06:01
Оценка:
Здравствуйте, Vaako, Вы писали:

V>SELECT * FROM Table WITH(NOLOCK)

V>WHERE field1 <= const AND const <= field2

V>ускорит


А то... И вылезет геморроем в тольких местах, что проще будет все убить и написать заново. Как раз сейчас такую БД ковыряю изнутри. Продакшн, и успешный... Но вот за вот эти NOLOCK просто поотрывал бы все.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re[3]: Ускорить запрос
От: Vaako Украина  
Дата: 02.08.15 08:14
Оценка: -5
Здравствуйте, LuciferArh, Вы писали:

LA>Здравствуйте, Vaako, Вы писали:


V>>SELECT * FROM Table WITH(NOLOCK)

V>>WHERE field1 <= const AND const <= field2

V>>ускорит


LA>А то... И вылезет геморроем в тольких местах, что проще будет все убить и написать заново. Как раз сейчас такую БД ковыряю изнутри. Продакшн, и успешный... Но вот за вот эти NOLOCK просто поотрывал бы все.


Так думать же надо куда вставлять а куда нет, а без них тормоза буду неслабые. Кто не использует NOLOCK вообще тот лох.
Re[3]: Ускорить запрос
От: Somescout  
Дата: 02.08.15 08:58
Оценка:
Здравствуйте, LuciferArh, Вы писали:

LA>А то... И вылезет геморроем в тольких местах, что проще будет все убить и написать заново. Как раз сейчас такую БД ковыряю изнутри. Продакшн, и успешный... Но вот за вот эти NOLOCK просто поотрывал бы все.


А можно кровавых подробностей? Просто тоже наблюдаю кучу NOLOCK по поводу и без (я знаю что это read uncommitted), но какие именно проблемы могут при этом вылезти?
ARI ARI ARI... Arrivederci!
Re[4]: Ускорить запрос
От: LuciferArh Россия  
Дата: 02.08.15 09:17
Оценка:
Здравствуйте, Somescout, Вы писали:

S>А можно кровавых подробностей? Просто тоже наблюдаю кучу NOLOCK по поводу и без (я знаю что это read uncommitted), но какие именно проблемы могут при этом вылезти?


Если без кода (нет его под рукой), то запросто. Имеем процедуру расчета оперативного баланса. По неким причинам, сие действо запланировано на исполнение раз в 15 минут, хотя по логике надо бы раз в пять минут. Ну да ладно. Встал вопрос о том, что запуск сей процедуры надо бы делать раз в 20, а то и 30 минут, ибо оно не успевает отрабатывать. (Немного о железе: двухпроцессорный ксеон (по факту — 16 ядер), 32 гига оперативы, 4 SSD в 10 рейде). Примерное количество клиентов онлайн, по которым надо отрабатывать, — 350-360 (зависит от активности). Обрабатываются четыре таблицы, примерно пять тысяч строк(!!!). Время отрабатывания задания — 12(!!!) минут. В теле процедуры на каждом шагу WITH (NOLOCK) и create table #bla-bla. С кучей инсертов в темповые таблицы, курсорам по ним и апдейтами оных эе с последующим итоговым апдейтом целевой нужной нам таблицы.

В общем, выкинул я всю эту бодягу. В итоге процедура отрабатывает за 15 секунд. Клиенты счастливы и довольны. И такого кода я за последний месяц "оптимизировал" (то есть, попросту снес в помойку) уже несчитано. Разработчик предложил контракт.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re[4]: Ускорить запрос
От: wildwind Россия  
Дата: 02.08.15 09:18
Оценка:
Здравствуйте, Somescout, Вы писали:

S> (я знаю что это read uncommitted), но какие именно проблемы могут при этом вылезти?


Проблемы с согласованностью данных, они вылезают, если использующий NOLOCK не понимает, что это read uncommitted; и/или не может оценить его пригодность /в конкретном случае.
Hardware eventually fails. Software eventually works. ::: avalon/1.0.442
Re[5]: Ускорить запрос
От: wildwind Россия  
Дата: 02.08.15 09:21
Оценка: +3
Здравствуйте, LuciferArh, Вы писали:

LA> В общем, выкинул я всю эту бодягу. В итоге процедура отрабатывает за 15 секунд.


Похвально. Но, судя по описанию, проблема была вовсе не в NOLOCK.
Hardware eventually fails. Software eventually works. ::: avalon/1.0.442
Re[5]: Ускорить запрос
От: Vaako Украина  
Дата: 02.08.15 09:39
Оценка: -2
Здравствуйте, LuciferArh, Вы писали:

LA>Здравствуйте, Somescout, Вы писали:


S>>А можно кровавых подробностей? Просто тоже наблюдаю кучу NOLOCK по поводу и без (я знаю что это read uncommitted), но какие именно проблемы могут при этом вылезти?


LA>Если без кода (нет его под рукой), то запросто. Имеем процедуру расчета оперативного баланса. По неким причинам, сие действо запланировано на исполнение раз в 15 минут, хотя по логике надо бы раз в пять минут. Ну да ладно. Встал вопрос о том, что запуск сей процедуры надо бы делать раз в 20, а то и 30 минут, ибо оно не успевает отрабатывать. (Немного о железе: двухпроцессорный ксеон (по факту — 16 ядер), 32 гига оперативы, 4 SSD в 10 рейде). Примерное количество клиентов онлайн, по которым надо отрабатывать, — 350-360 (зависит от активности). Обрабатываются четыре таблицы, примерно пять тысяч строк(!!!). Время отрабатывания задания — 12(!!!) минут. В теле процедуры на каждом шагу WITH (NOLOCK) и create table #bla-bla. С кучей инсертов в темповые таблицы, курсорам по ним и апдейтами оных эе с последующим итоговым апдейтом целевой нужной нам таблицы.


LA>В общем, выкинул я всю эту бодягу. В итоге процедура отрабатывает за 15 секунд. Клиенты счастливы и довольны. И такого кода я за последний месяц "оптимизировал" (то есть, попросту снес в помойку) уже несчитано. Разработчик предложил контракт.


NOLOCK — это грязное чтение и не может затормозить еще больше тормознутую процедуру
Re[6]: Ускорить запрос
От: LuciferArh Россия  
Дата: 02.08.15 09:42
Оценка:
Здравствуйте, wildwind, Вы писали:

W>Похвально. Но, судя по описанию, проблема была вовсе не в NOLOCK.


В том числе и в этом. Много было фантомных списаний и начислений, которые потом сами собой пропадали. А уж про блокировки я лучше вообще промолчу.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re[6]: Ускорить запрос
От: LuciferArh Россия  
Дата: 02.08.15 09:44
Оценка:
Здравствуйте, Vaako, Вы писали:

V>NOLOCK — это грязное чтение и не может затормозить еще больше тормознутую процедуру


Я знаю. Зато оно может так искалечить данные, что потом без поллитрые и не понять, что реальность, а что дикий вымысел, порожденный NOLOCK. Обрабатываемые данные обязаны быть чистыми, консистентными и достоверными. И вот как раз NOLOCK с прочими ухищрениями тут не нужен от слова совсем.

З.Ы. Ненавижу блокировочники...
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re[5]: Ускорить запрос
От: rFLY  
Дата: 03.08.15 07:36
Оценка:
Здравствуйте, LuciferArh, Вы писали:

S>>А можно кровавых подробностей? Просто тоже наблюдаю кучу NOLOCK по поводу и без (я знаю что это read uncommitted), но какие именно проблемы могут при этом вылезти?

LA>Если без кода (нет его под рукой), то запросто. Имеем процедуру расчета оперативного баланса. Время отрабатывания задания — 12(!!!) минут. В теле процедуры на каждом шагу WITH (NOLOCK) и create table #bla-bla. С кучей инсертов в темповые таблицы, курсорам по ним и апдейтами оных эе с последующим итоговым апдейтом целевой нужной нам таблицы.
LA>В общем, выкинул я всю эту бодягу. В итоге процедура отрабатывает за 15 секунд.
И конечно же главный виновник — НОЛОК.

PS: 15 секунд дофига, для обработки 5к записей.
Re[6]: Ускорить запрос
От: LuciferArh Россия  
Дата: 03.08.15 10:19
Оценка:
Здравствуйте, rFLY, Вы писали:

FLY>И конечно же главный виновник — НОЛОК.


Не главный, но он запихивал в обработку фантомные записи, которых быть не должно. Что тоже не добавляло скорости работы.

FLY>PS: 15 секунд дофига, для обработки 5к записей.


Это не дофига, это нормально. Там еще вычислений много. Сегодня я еще раз прошелся по процедуре, подобавлял индексы и статистики — 2 секунды в итоге. Что после 12 минут, согласись, весьма и весьма... Эх, серверу бы еще памяти добавить бы, да сервиспаки поставить... А то предыдущему админу было все до фени, как поставил голый RTM, так и забил на все.
Re[7]: Ускорить запрос
От: rFLY  
Дата: 03.08.15 10:36
Оценка: -2
Здравствуйте, LuciferArh, Вы писали:

FLY>>И конечно же главный виновник — НОЛОК.

LA>Не главный, но он запихивал в обработку фантомные записи, которых быть не должно. Что тоже не добавляло скорости работы.
Да брось, кол-во таких записей ничтожно для того чтобы их учитывать (я сейчас о времени говорю, а не о целостности данных). Ну сколько 360 человек, даже если одновременно ломанутся добавлять, смогут создать записей?

FLY>>PS: 15 секунд дофига, для обработки 5к записей.

LA>Это не дофига, это нормально. Там еще вычислений много. Сегодня я еще раз прошелся по процедуре, подобавлял индексы и статистики — 2 секунды в итоге.
2 сек на 5к записей не 15 как было, согласись, пусть даже с учетом вычислений.
Re[8]: Ускорить запрос
От: LuciferArh Россия  
Дата: 03.08.15 17:53
Оценка: -1
Здравствуйте, rFLY, Вы писали:

FLY>Да брось, кол-во таких записей ничтожно для того чтобы их учитывать (я сейчас о времени говорю, а не о целостности данных). Ну сколько 360 человек, даже если одновременно ломанутся добавлять, смогут создать записей?


Дело не в том, сколько они создадут записей. Дело в качестве этих записей, когда у клиентов появятся совершенно левые цифры, ломающие все.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.