powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / order by замедляет выполнение запроса в 100 раз
21 сообщений из 21, страница 1 из 1
order by замедляет выполнение запроса в 100 раз
    #39096016
anbsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть запрос:
Код: sql
1.
2.
3.
4.
select S.Kol Kol, S.Kol2, T.*, S.Brak, G.Name NameG, S2.Kol KolS2
from TOWAR T, Towar_S S, Valyta V, Gruppa G, Towar_S S2
WHERE (T.IDGruppa=G.ID) and (S.IDTowar=T.ID) and (T.Valyta=V.ID)
and (S.IDSklad=35)and (S2.IDSklad=35) and (S2.IDTowar=T.ID)


для него:
Plan
PLAN JOIN (S INDEX (ITSS), T INDEX (ITOWAR), V INDEX (IVALYTA), G INDEX (IGRUPPA), S2 INDEX (ITST, ITSS))
------ Performance info ------
Prepare time = 15ms
Execute time = 172ms
Avg fetch time = 7,48 ms
Current memory = 2 477 472
Max memory = 4 039 452
Memory buffers = 2 048
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = 3 265
Если добавить ORDER BY - время запроса увеличивается на два порядка:
Код: sql
1.
2.
3.
4.
5.
select S.Kol Kol, S.Kol2, T.*, S.Brak, G.Name NameG, S2.Kol KolS2
from TOWAR T, Towar_S S, Valyta V, Gruppa G, Towar_S S2
WHERE (T.IDGruppa=G.ID) and (S.IDTowar=T.ID) and (T.Valyta=V.ID)
and (S.IDSklad=35)and (S2.IDSklad=35) and (S2.IDTowar=T.ID)
order by t.name


Plan
PLAN SORT (JOIN (S INDEX (ITSS), T INDEX (ITOWAR), V INDEX (IVALYTA), G INDEX (IGRUPPA), S2 INDEX (ITST, ITSS)))
Adapted Plan
PLAN SORT (JOIN (S INDEX (ITSS), T INDEX (ITOWAR), V INDEX (IVALYTA), G INDEX (IGRUPPA), S2 INDEX (ITST, ITSS)))
------ Performance info ------
Prepare time = 16ms
Execute time = 11s 123ms
Avg fetch time = 794,50 ms
Current memory = 2 477 440
Max memory = 4 039 452
Memory buffers = 2 048
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = 163 808
Результат выборки 5600 записей.
При упрощении запроса:
Код: sql
1.
2.
3.
4.
5.
select S.Kol Kol, S.Kol2, T.*, S.Brak, G.Name NameG
from TOWAR T, Towar_S S, Valyta V, Gruppa G
WHERE (T.IDGruppa=G.ID) and (S.IDTowar=T.ID) and (T.Valyta=V.ID)
and (S.IDSklad=35)
order by t.name


получаем:
Plan
PLAN SORT (JOIN (S INDEX (ITSS), T INDEX (ITOWAR), V INDEX (IVALYTA), G INDEX (IGRUPPA)))
------ Performance info ------
Prepare time = 15ms
Execute time = 453ms
Avg fetch time = 28,31 ms
Current memory = 2 586 004
Max memory = 4 039 452
Memory buffers = 2 048
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = 84 683
Почему во втором запросе ORDER BY так тормозит запрос?
...
Рейтинг: 0 / 0
order by замедляет выполнение запроса в 100 раз
    #39096048
Граур Станислав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Версия FB, DDL таблиц
2) При выполнении запроса в ibExpert жмешь Fetch All (shift+F9) ?

P.S.
А зачем вообще второй раз делается join Towar_S ?
...
Рейтинг: 0 / 0
order by замедляет выполнение запроса в 100 раз
    #39096117
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
anbsoft,

1. Учись писать запросы с использованием явных JOIN
2. Увеличь TempCacheLimit или уменьшай ширину выборки
3. Замеряй время с помощью FetchAll
...
Рейтинг: 0 / 0
order by замедляет выполнение запроса в 100 раз
    #39096553
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
anbsoftT.*

Почему во втором запросе ORDER BY так тормозит запрос?
Потому что бешеная ширина и высота выборки провоцирует внешнюю сортировку.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
order by замедляет выполнение запроса в 100 раз
    #39096588
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
anbsoft, что-то в плане выполнения я не наблюдаю индекса по полю TOWAR.NAME...
Хотелось бы увидеть DDL всех участвующих таблиц.

Скорость выполнения запроса может меняться в зависимости от выбранного плана запроса, при создании которого сервер опирается в том числе и на статистику индексов.
...
Рейтинг: 0 / 0
order by замедляет выполнение запроса в 100 раз
    #39096602
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBConstructoranbsoft, что-то в плане выполнения я не наблюдаю индекса по полю TOWAR.NAME...Это наверное, потому, что индекс для сортировки не нужен.
...
Рейтинг: 0 / 0
order by замедляет выполнение запроса в 100 раз
    #39096611
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSeryЭто наверное, потому, что индекс для сортировки не нужен.
Может, ты хотел сказать "не используется сервером"? ;)
...
Рейтинг: 0 / 0
order by замедляет выполнение запроса в 100 раз
    #39096622
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBConstructor,

Обычно, всё же, не нужен.
...
Рейтинг: 0 / 0
order by замедляет выполнение запроса в 100 раз
    #39096777
Romanzek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery,

Обычно все же нужен, так как никто в здравом уме например несколько миллионов записей не хочет читать, а уж тем более сортировать.
Тут правда всего 5600 записей, но не факт, что они все нужны топикстартеру.

Кроме создания индекса можно еще ускорить выполнение, если выбрать сначала идентификаторы товара с сортировкой, а потом снаружи заджоинить LEFT все остальное. Но это если индекс не хочется делать. Ну или попробовать РБД, там быстрее будет работать.
Начать нужно, конечно, с советов Дениса Симонова ;-)
...
Рейтинг: 0 / 0
order by замедляет выполнение запроса в 100 раз
    #39096819
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RomanzekОбычно все же нужен, так как никто в здравом уме например несколько миллионов записей не хочет читать, а уж тем более сортировать.
Прежде чем писать дальше, попробуй ORDER BY INDEX и SORT на какой-нибудь большой таблице.
Тут тебе не кластерный индекс.

P.S. Только про FetchAll не забудь, по индексу ПЕРВЫЕ записи получишь, конечно же, быстро.
...
Рейтинг: 0 / 0
order by замедляет выполнение запроса в 100 раз
    #39098723
Romanzek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery,

А я и не говорил про FetchAll. Я как раз говорил о ситуациях, когда не нужны все записи, а первые несколько только.
...
Рейтинг: 0 / 0
order by замедляет выполнение запроса в 100 раз
    #39098731
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RomanzekА я и не говорил про FetchAll. Я как раз говорил о ситуациях, когда не нужны все записи, а первые несколько только.
вот только здесь 18379452 про "первые несколько только" нет ни одного слова
...
Рейтинг: 0 / 0
order by замедляет выполнение запроса в 100 раз
    #39098800
Romanzek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m7mRomanzekА я и не говорил про FetchAll. Я как раз говорил о ситуациях, когда не нужны все записи, а первые несколько только.
вот только здесь 18379452 про "первые несколько только" нет ни одного слова

Вот это:
"так как никто в здравом уме например несколько миллионов записей не хочет читать, а уж тем более сортировать."

Никто не читает миллионы, читают несколько (десятков) первых записей с фильтрами обычно.
...
Рейтинг: 0 / 0
order by замедляет выполнение запроса в 100 раз
    #39098804
Romanzek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и эта фраза тоже прямо свидетельствует:

"но не факт, что они все нужны топикстартеру."
...
Рейтинг: 0 / 0
order by замедляет выполнение запроса в 100 раз
    #39098810
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Romanzekm7mпропущено...

вот только здесь 18379452 про "первые несколько только" нет ни одного слова

Вот это:
"так как никто в здравом уме например несколько миллионов записей не хочет читать, а уж тем более сортировать."

Никто не читает миллионы, читают несколько (десятков) первых записей с фильтрами обычно.
В пятницу если не забуду и будет соответствующее настроение отвечу, а сейчас и некогда и неохота флейм разводить
...
Рейтинг: 0 / 0
order by замедляет выполнение запроса в 100 раз
    #39098849
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Romanzek,

вообще большинство СУБД считает что по умолчанию клиент запрашивает все записи, и никогда не меняют стратегию оптимизации до тех пор пока оптимизатор явно не пнут в нужном направлении. Пинается обычно с помощью хинтов или ограничителей FIRST/ROWS/FETCH FIRST ... ONLY и т.д.

По историческим причинам сложилось так что Firebird старается задействовать индекс при сортировке если выборка идёт из одной таблицы практически всегда, т.е. фактически реализуется стратегию first rows. А вот когда появляется join, то тут уже оптимизатор начинает оценивать эффективность самого join, т.е. выстраивает порядок соединения, и лишь в том случае если чтение потоков идёт с той таблицы по полю которой есть сортировка применяется индекс. Это уже больше похоже на стратегию all rows, но реализованную как-то не до конца. Хотя с другой стороны это позволяет (не всегда) иметь более отзывчивый DataSet в приложениях на Delphi если не делается FetchAll.

В прочем в трёшке FB научился менять стратегию на first rows и порядок соединения если указаны ограничители FIRST/ROWS/FETCH FIRST ... ONLY.

В RDB если я правильно понял есть ещё подсказка для цели оптимизатора first/all rows, которую по какой-то причине ДЕ не стал выносить наружу в FB3.

P.S. Если вся таблица и индекс уже в кэше то навигация по индексу даже при fetchAll не имеет сильного негативного эффекта, она может оказаться даже эффективнее внешней сортировки.
...
Рейтинг: 0 / 0
order by замедляет выполнение запроса в 100 раз
    #39098889
Romanzek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

Спасибо за информацию, наверное полезно будет в форуме сохранить.
Просто ДЕ по моей просьбе делал все это в оптимизаторе и я как бы в курсе :)

Понятно, что способ оптимизации зависит от того, что за запрос и как его использует приложение. Я всего лишь сделал подсказку какие еще есть случаи и способы оптимизации для них. Вступать во флейм тоже нет никакого желания, есть желание помочь топикстартеру, но ему, видимо, уже не нужно.
...
Рейтинг: 0 / 0
order by замедляет выполнение запроса в 100 раз
    #39098898
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Romanzek,

я и не собирался вступать во флейм. Это моё мнение по поводу order index vs sort.

А ТС действительно пропал. Не ясно пытался он улучшить свой запрос по советам в топике или нет.
...
Рейтинг: 0 / 0
order by замедляет выполнение запроса в 100 раз
    #39099216
Romanzek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисRomanzek,

А ТС действительно пропал. Не ясно пытался он улучшить свой запрос по советам в топике или нет.

Это был постгрешный тролллль :)
...
Рейтинг: 0 / 0
order by замедляет выполнение запроса в 100 раз
    #39099290
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Romanzek,

Это ты тут тролль.
Влез с легкомысленными утверждениями, а затем стал вводить новые условия и допущения ("все полученные запросом записи не нужны"), чтобы подогнать свои утверждения под реальность.

Выбор только из одной таблицы нескольких записей, без дополнительного отбора, в порядке какого-то поля - это редкость несусветная, а не "обычно". В любом другом случае эффективность выбора в порядке индекса - спорна, полезность или вредность однозначно определяется только для конкретных случаев.

Как именно будут отсортированы пара тысяч записей, выбранных "обычным" запросом, абсолютно пофигу, если "ширина" выборки небольшая, то во многих случаях сортировка в памяти этих пары тысяч записей будет быстрее, чем обход в порядке индекса.
Это подтверждается практическим опытом.
...
Рейтинг: 0 / 0
order by замедляет выполнение запроса в 100 раз
    #39099377
Romanzek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSeryRomanzek,

Это ты тут тролль.


Черт, спалился что ли?
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / order by замедляет выполнение запроса в 100 раз
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]