|
Вебинар: Firebird 3.0 - оптимизатор и расширенные планы запросов
|
|||
---|---|---|---|
#18+
Сегодня провели вебинар по теме Firebird 3.0 - оптимизатор и расширенные планы запросов Этим вебинаром открываем серию вебинаров о новых возможностях Firebird 3. Задавайте вопросы по вебинару, предложения по будущим темам, и т.д. Ответы на вопросы по вебинару будут выпущены как отдельное видео в ближайшее время. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2018, 23:22 |
|
Вебинар: Firebird 3.0 - оптимизатор и расширенные планы запросов
|
|||
---|---|---|---|
#18+
Записывайтесь на следующий вебинар: ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2018, 12:17 |
|
Вебинар: Firebird 3.0 - оптимизатор и расширенные планы запросов
|
|||
---|---|---|---|
#18+
Записывайтесь на следующий вебинар: "Архитектура Firebird 3: SuperServer, Classic и Embedded" ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2018, 12:18 |
|
Вебинар: Firebird 3.0 - оптимизатор и расширенные планы запросов
|
|||
---|---|---|---|
#18+
Я в замешательстве от предпоследнего слайда. Допустим, у меня таблица Docs с 5.000.000 записями, и мне надо загрузить 500 докуметов с известными ключами. Я просто делаю select * from Docs where DocId in (123,124,145,148, ... ) И всё моментально грузится. Если последовать совету и переписать на where DocId+0 in (...) станет всё очень медленно и печально. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2018, 22:17 |
|
Вебинар: Firebird 3.0 - оптимизатор и расширенные планы запросов
|
|||
---|---|---|---|
#18+
все дело в цене вопроса, явно 500 обращений к индексу дешевле 5 лямов натурала, но если есть еще отсечки, например, по дате, а ИД документа ПК, то может оказаться уже дешевле одно обращение к индексу по дате и дальше уже перебор по ИДам, чем 500 раз поддернуть индекс, а чтобы оптимизатор не хватал индекс по ПК его только +0 и можно отсеять. Опять таки, если у тебя так много известных ИДов, то можно очень легко натолкнуться на ограничение по длине запроса. Сдается мне дешевле будет ИДы влить в ГТТ табличку и сджойниться с ней, чем писать ин. а если не 500, скажем 5000? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2018, 22:59 |
|
Вебинар: Firebird 3.0 - оптимизатор и расширенные планы запросов
|
|||
---|---|---|---|
#18+
Ivan_Pisarevsky, извиняюсь за занудство, а разве с пятьюстами значениями в списке in () - не глюкнет? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2018, 23:27 |
|
Вебинар: Firebird 3.0 - оптимизатор и расширенные планы запросов
|
|||
---|---|---|---|
#18+
unahЯ просто делаю select * from Docs where DocId in (123,124,145,148, ... ) И всё моментально грузится. видимо, потому что индекс по docid уникальный, и там идет 500 поисков на одно значение (что хорошо видно в explain plan). В основном field in (...) используют с неуникальными индексами, о чём я и говорил. Там еще есть нюанс, про поиск последовательных и непоследовательных значений. Расскажу отдельно. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2018, 23:45 |
|
Вебинар: Firebird 3.0 - оптимизатор и расширенные планы запросов
|
|||
---|---|---|---|
#18+
чччДа разве с пятьюстами значениями в списке in () - не глюкнет? допустимо до 1500 значений, плюс раньше было ограничение по размеру текста запроса в 64к. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2018, 23:46 |
|
Вебинар: Firebird 3.0 - оптимизатор и расширенные планы запросов
|
|||
---|---|---|---|
#18+
kdvчччДа разве с пятьюстами значениями в списке in () - не глюкнет? допустимо до 1500 значений, плюс раньше было ограничение по размеру текста запроса в 64к. Точно, до 1500. А у меня почему-то ограничение в генераторах запросов - не более 255 элементов в списках in(), уж не помню, почему так... ... |
|||
:
Нравится:
Не нравится:
|
|||
08.03.2018, 01:57 |
|
Вебинар: Firebird 3.0 - оптимизатор и расширенные планы запросов
|
|||
---|---|---|---|
#18+
kdvВ основном field in (...) используют с неуникальными индексами, о чём я и говорил Спасибо, теперь стало понятнее. Также это, возможно, объясняет явление, что join по primary key намного быстрее, чем по другому индексированному полю таблицы. Я никак не мог этого понять, думал, что в обоих случаях используется одинаковый поиск по ключу в индексе. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.03.2018, 14:32 |
|
Вебинар: Firebird 3.0 - оптимизатор и расширенные планы запросов
|
|||
---|---|---|---|
#18+
Ivan_PisarevskyОпять таки, если у тебя так много известных ИДов, то можно очень легко натолкнуться на ограничение по длине запроса. а если не 500, скажем 5000? разбиваю на блоки по 500 Ivan_PisarevskyСдается мне дешевле будет ИДы влить в ГТТ табличку и сджойниться с ней, чем писать ин. тут проблема будет передать 500 инсертов, это очень медленно. всё никак не дождусь, когда сделают bulk insert ... |
|||
:
Нравится:
Не нравится:
|
|||
08.03.2018, 14:36 |
|
Вебинар: Firebird 3.0 - оптимизатор и расширенные планы запросов
|
|||
---|---|---|---|
#18+
unah, уже сделали в 4.0. Но новым API надо ещё уметь пользоваться ... |
|||
:
Нравится:
Не нравится:
|
|||
08.03.2018, 14:57 |
|
Вебинар: Firebird 3.0 - оптимизатор и расширенные планы запросов
|
|||
---|---|---|---|
#18+
unah> явление, что join по primary key намного быстрее, чем по другому индексированному полю таблицы. Ась? Это откуда ? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
08.03.2018, 19:27 |
|
Вебинар: Firebird 3.0 - оптимизатор и расширенные планы запросов
|
|||
---|---|---|---|
#18+
unahЯ в замешательстве от предпоследнего слайда. Допустим, у меня таблица Docs с 5.000.000 записями, и мне надо загрузить 500 докуметов с известными ключами. Я просто делаю select * from Docs where DocId in (123,124,145,148, ... ) И всё моментально грузится. Если последовать совету и переписать на where DocId+0 in (...) станет всё очень медленно и печально. Я тебе один умный вещь скажу, только ты не обижайся пожалуйста (С). За всю мою почти 25-летнюю практику с SQL количество случаев, когда действительно требовался километровый IN в запросе равно... нулю. Этот позыв к IN всегда был следствием попытки заменить естественные условия фильтрации. Например, получить документы с 5-го по 20-е число, со статусом "неоплачено". Или условие на сджойненнной таблице, скажем, город контрагента - Мухосранск. Эти примеры - примитивизация, разумеется, но суть - отсутствие желания проработать интерфейс и стремление замкнуться на построчное мышетыканье пользователем. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.03.2018, 21:17 |
|
Вебинар: Firebird 3.0 - оптимизатор и расширенные планы запросов
|
|||
---|---|---|---|
#18+
unahЯ никак не мог этого понять, думал, что в обоих случаях используется одинаковый поиск по ключу в индексе. гм. поиск по индексу всегда одинаковый. Только индексы могут быть разные - один допускает повторы значений (неуникальный), а другой - не допускает (уникальный). Соответственно, при поиске на равенство из неуникального индекса может быть извлечено несколько ключей, а из уникального - один. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.03.2018, 21:21 |
|
Вебинар: Firebird 3.0 - оптимизатор и расширенные планы запросов
|
|||
---|---|---|---|
#18+
unahтут проблема будет передать 500 инсертов, это очень медленно.Клиент же каким-то образом раздобыл себе списки ключей, сдается мне, что он вычитал оные с сервера, а не придумал сам. Откуда берутся эти списки ИДов? Старый плюшевый мишкастремление замкнуться на построчное мышетыканье пользователем.Есть у меня одно такое место, где ну никак без такого посточного натыкивания, несмотря на разлапистый фильтр. Я по рабочекрестьянски сразу пишу кажный "тык" в обычную табличку, никаких проблем с отпаданием клиента(по любым причинам, от отвалился ВПН до уборщицы со шваброй), перезапустил АРМ все "тыки" на месте. И мне потом мороки меньше: джойню штатными средствами без квадратноколесных лисапетов. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.03.2018, 21:49 |
|
Вебинар: Firebird 3.0 - оптимизатор и расширенные планы запросов
|
|||
---|---|---|---|
#18+
Ivan_Pisarevsky> Есть у меня одно такое место, где ну никак без такого пост Р очного Ivan_Pisarevsky> натыкивания, несмотря на разлапистый фильтр. Такое у всех есть. Но их никак не 500. Даже не 100. Пару десятков наберётся, от силы, и те - у местных сумасшедших, которые программу лучше тебя знают. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
08.03.2018, 23:52 |
|
Вебинар: Firebird 3.0 - оптимизатор и расширенные планы запросов
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустамunah> явление, что join по primary key намного быстрее, чем по другому индексированному полю таблицы. Ась? Это откуда ? Из жизни. Вот пример: Код: sql 1. 2. 3.
заливаем 700 записей в Shops, и 5.000.000 в Orders. Теперь сравниваем скорость Код: sql 1.
и Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.03.2018, 13:27 |
|
Вебинар: Firebird 3.0 - оптимизатор и расширенные планы запросов
|
|||
---|---|---|---|
#18+
unah, во-первых твои утверждения не верны. Подробней читай здесь http://www.ibase.ru/dataaccesspaths/ Во-вторых сравнивать надо Код: sql 1.
vs Код: sql 1.
чтобы быть уверенным в извлечении всех записей. Ну и ради интереса сравни с Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.03.2018, 13:53 |
|
Вебинар: Firebird 3.0 - оптимизатор и расширенные планы запросов
|
|||
---|---|---|---|
#18+
Симонов ДенисВо-вторых сравнивать надо Код: sql 1.
это понятно, что всё надо фетчить. сейчас сравнил все варианты на тестовом сервере. join по primary key - быстрее PLAN JOIN (O NATURAL, S INDEX (PK_SHOPS)) ------ Performance info ------ Prepare time = 15ms Execute time = 16s 224ms Avg fetch time = 16 224,00 ms Current memory = 147 808 712 Max memory = 800 120 680 Memory buffers = 2 048 Reads from disk to cache = 75 685 Writes from cache to disk = 17 Fetches from cache = 0 чем так PLAN JOIN (S NATURAL, O INDEX (FK_ORDER_REF_SHOP)) ------ Performance info ------ Prepare time = 16ms Execute time = 19s 640ms Avg fetch time = 19 640,00 ms Current memory = 147 734 296 Max memory = 800 120 680 Memory buffers = 2 048 Reads from disk to cache = 1 672 411 Writes from cache to disk = 28 Fetches from cache = 0 И внимание на кол-во страниц, это очень важно. Под нагрузкой время будет отличаться намного сильнее. Хеш-join вне конкуренции (новость тройки? я его как-то упустил из виду) PLAN HASH (O NATURAL, S NATURAL) ------ Performance info ------ Prepare time = 0ms Execute time = 6s 615ms Avg fetch time = 6 615,00 ms Current memory = 147 732 704 Max memory = 800 120 680 Memory buffers = 2 048 Reads from disk to cache = 75 433 Writes from cache to disk = 8 Fetches from cache = 0 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.03.2018, 14:10 |
|
Вебинар: Firebird 3.0 - оптимизатор и расширенные планы запросов
|
|||
---|---|---|---|
#18+
Ivan_PisarevskyКлиент же каким-то образом раздобыл себе списки ключей, сдается мне, что он вычитал оные с сервера, а не придумал сам. Откуда берутся эти списки ИДов? Разные случаи. Самое простое - загрузка (или любая другая операция) с большим списком сущностей, по которой юзер хочет видеть прогресс. Тогда первый запрос select Id from ... join .... узнаём, сколько всего будет строк в результате, а потом выполняем операцию (грузим на клиент) пачками по 100-1000. Особенно актуально, если клиент подключен не БД, а к серверу приложений по HTTP и на каждый запрос у клиента лимит по времени и размеру пакета. Был ещё вариант использования FB как тупое key-value хранилище. Применялось ручное управление кешированием в сервере приложений. Все join-ы делаются в памяти, а строки грузятся по списку Id, только те, которых ещё нет в памяти инстанса. Сильно экономит кол-во чтений из БД. И напоследок. Отношения многие-ко-многим. Мастер-сущность в таблице с 30 млн. записей, Detail - 3 млн. записей и линков между ними - более 300 млн (отдельная таблица со ссылками на master и detail для каждой связи, всё по лучшим практикам). И вот как раз join к таблице links стал захлёбываться (потому что не по unique index?). Последователи чистой реляционной теории могут плеваться, но факт есть факт. После переноса links в таблицу master тупо в строковое поле varchar(3000) id-шники через запятую, и чтением details по списку Id (where DetailId in (121,122,123,...)) нагрузка настолько уменьшилась, что система была спасена. Старый плюшевый мишкаЯ тебе один умный вещь скажу, только ты не обижайся пожалуйста (С)У вас опыт слишком ограничен, а мне обижаться? ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.03.2018, 14:33 |
|
Вебинар: Firebird 3.0 - оптимизатор и расширенные планы запросов
|
|||
---|---|---|---|
#18+
unah, не надо выдавать свой частный случай распределения данных в таблицах за решения для всех. Я тебе могу привести примеры где всё с точностью наоборот. Ну и буфер Memory buffers = 2 048 для троечного SS это просто смех. Увеличивать надо минимум в 10 раз. unahХеш-join вне конкуренции (новость тройки? я его как-то упустил из виду) У тебя Shops мизерная, а Orders большая. Здесь хеш-join то что доктор прописал. HASH JOIN заменил MERGE JOIN в 3.0 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.03.2018, 15:03 |
|
Вебинар: Firebird 3.0 - оптимизатор и расширенные планы запросов
|
|||
---|---|---|---|
#18+
Симонов ДенисНу и буфер Memory buffers = 2 048 для троечного SS это просто смех. Проверил на другом сервере PLAN JOIN (O NATURAL, S INDEX (PK_SHOPS)) Memory buffers = 4 194 304 Reads from disk to cache = 120 PLAN JOIN (S NATURAL, O INDEX (FK_ORDER_REF_SHOP)) Memory buffers = 4 194 304 Reads from disk to cache = 914 Похоже это не бага с огромным кол-вом чтений при таких join-ах. Просто надо buffers поднимать ))) Кто-ж знал ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.03.2018, 15:24 |
|
Вебинар: Firebird 3.0 - оптимизатор и расширенные планы запросов
|
|||
---|---|---|---|
#18+
unah, сравнивать разные планы запросов и делать из этого выводы о быстродействии поиска по индексу - это, скажем мягко, не умно... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.03.2018, 15:29 |
|
Вебинар: Firebird 3.0 - оптимизатор и расширенные планы запросов
|
|||
---|---|---|---|
#18+
hvlad, у меня было хорошо воспроизводимое наблюдение: - если добавлять в запрос join-ы по primary key, никаких проблем можно не ждать - есть добавлять в запрос join-ы по другим индексам, может резко вырасти кол-во чтений страниц, и такими join-ами надо всё 100 раз проверить. Хорошо, что в этой теме более-менее разобрали причину. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.03.2018, 15:39 |
|
|
start [/forum/topic.php?fid=40&fpage=35&tid=1561165]: |
0ms |
get settings: |
12ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
39ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
72ms |
get tp. blocked users: |
2ms |
others: | 301ms |
total: | 466ms |
0 / 0 |