SQLRU.net
Разработка приложений баз данных

Начало » Использование СУБД » Firebird, HQbird, InterBase » Новые возможности Firebird 5.0: Часть 1, оптимизатор
Новые возможности Firebird 5.0: Часть 1, оптимизатор [сообщение #3724] Tue, 14 November 2023 20:45 Переход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 329
Зарегистрирован: June 2022
Senior Member
Компания IBase/IBSurgeon начинает публикацию цикла статей с разбором новых возможностей Firebird 5.0.

Первая часть посвящена оптимизатору, в котором были произведены самые значительные улучшения со времен версии 2.0.
Re: Новые возможности Firebird 5.0: Часть 1, оптимизатор [сообщение #3744 является ответом на сообщение #3724] Sat, 18 November 2023 13:38 Переход к предыдущему сообщениюПереход к следующему сообщению
ggreggory в настоящее время не в онлайне  ggreggory
Сообщений: 76
Зарегистрирован: July 2022
Member
Цитата:
1.4. Раннее вычисление инвариантных предикатов
Проверил, но так и не понял, что он там и как вычисляет (WI-V5.0.0.1249 Firebird 5.0 Release Candidate 1).

Пример. Запрос:

select count(*) from my_table
Plan
------------------------------------------------------------ --------------------
PLAN (MY_TABLE NATURAL)
------ Performance info ------
Prepare time = 32ms
Execute time = 1s 203ms
Avg fetch time = 1 203,00 ms
Current memory = 1 089 761 168
Max memory = 1 090 685 152
Memory buffers = 65 536
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = 6 296 091

select count(*) from my_table where
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true and
true and true and true and true and true and true and true and true and true and true
Plan
------------------------------------------------------------ --------------------
PLAN (MY_TABLE NATURAL)
------ Performance info ------
Prepare time = 32ms
Execute time = 2m 47s 968ms
Avg fetch time = 167 968,00 ms
Current memory = 1 090 144 336
Max memory = 1 090 685 152
Memory buffers = 65 536
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = 6 296 092
Re: Новые возможности Firebird 5.0: Часть 1, оптимизатор [сообщение #3745 является ответом на сообщение #3744] Sat, 18 November 2023 14:09 Переход к предыдущему сообщениюПереход к следующему сообщению
hvlad в настоящее время не в онлайне  hvlad
Сообщений: 355
Зарегистрирован: August 2022
Senior Member
ggreggory
Цитата:
1.4. Раннее вычисление инвариантных предикатов
Проверил, но так и не понял, что он там и как вычисляет (WI-V5.0.0.1249 Firebird 5.0 Release Candidate 1).
...
select count(*) from my_table where
true and true ... and true
Читаем ВНИМАТЕЛЬНО:
Цитата:
Начиная с Firebird 5.0, если фильтрующий предикат инвариантен, и его значение равно FALSE, то ...
Re: Новые возможности Firebird 5.0: Часть 1, оптимизатор [сообщение #3746 является ответом на сообщение #3745] Sat, 18 November 2023 15:27 Переход к предыдущему сообщениюПереход к следующему сообщению
ggreggory в настоящее время не в онлайне  ggreggory
Сообщений: 76
Зарегистрирован: July 2022
Member
hvlad писал(а) Sat, 18 November 2023 14:09

Читаем ВНИМАТЕЛЬНО:
Цитата:
Начиная с Firebird 5.0, если фильтрующий предикат инвариантен, и его значение равно FALSE, то ...

Ясно. А TRUE не планируется вычислять "на раннем этапе" ?
Re: Новые возможности Firebird 5.0: Часть 1, оптимизатор [сообщение #3747 является ответом на сообщение #3746] Sat, 18 November 2023 15:40 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 329
Зарегистрирован: June 2022
Senior Member
А зачем? True досрочное не прерывает фетч из огромного набора данных. Заметь тут не идет речь о свертке условий. Была бы свертка можно было бы удалять постоянно истинные инварианты из or.
Re: Новые возможности Firebird 5.0: Часть 1, оптимизатор [сообщение #3748 является ответом на сообщение #3747] Sat, 18 November 2023 16:18 Переход к предыдущему сообщениюПереход к следующему сообщению
ggreggory в настоящее время не в онлайне  ggreggory
Сообщений: 76
Зарегистрирован: July 2022
Member
sim_84 писал(а) Sat, 18 November 2023 15:40
А зачем? True досрочное не прерывает фетч из огромного набора данных. Заметь тут не идет речь о свертке условий. Была бы свертка можно было бы удалять постоянно истинные инварианты из or.

Затем чтобы быстрее работало. Скорость выполнения падает, пример я привел. Вычислять что можно вычислить на этапе компиляции вполне распространенная практика.
Re: Новые возможности Firebird 5.0: Часть 1, оптимизатор [сообщение #3749 является ответом на сообщение #3748] Sat, 18 November 2023 17:26 Переход к предыдущему сообщениюПереход к следующему сообщению
dimitr в настоящее время не в онлайне  dimitr
Сообщений: 18
Зарегистрирован: July 2022
Junior Member
да, планируется. Хотя изначально целью был именно отказ от последующих операций при FALSE. Но почему бы и не улучшить обратный случай.
Re: Новые возможности Firebird 5.0: Часть 1, оптимизатор [сообщение #3750 является ответом на сообщение #3748] Sun, 19 November 2023 10:17 Переход к предыдущему сообщениюПереход к следующему сообщению
dimitr в настоящее время не в онлайне  dimitr
Сообщений: 18
Зарегистрирован: July 2022
Junior Member
ggreggory писал(а) Sat, 18 November 2023 16:18
Затем чтобы быстрее работало. Скорость выполнения падает, пример я привел. Вычислять что можно вычислить на этапе компиляции вполне распространенная практика.
(пока что) на этапе компиляции мы выражения не вычисляем. Так что тут речь про однократное вычисление в рантайме.
В общем, пофиксил я случай TRUE-инварианта, твой пример теперь быстро работает. В сегодняшнем снапшоте уже должно быть доступно.
Re: Новые возможности Firebird 5.0: Часть 1, оптимизатор [сообщение #3751 является ответом на сообщение #3750] Sun, 19 November 2023 15:49 Переход к предыдущему сообщениюПереход к следующему сообщению
SD в настоящее время не в онлайне  SD
Сообщений: 407
Зарегистрирован: August 2022
Senior Member
Только если ты отмержишь свой реквест.

Кстати, а RecordKeyNode и ParameterNode-то у тебя почему недетерминированы? Они внезапно могут поменяться в процессе выполнения запроса?..
Re: Новые возможности Firebird 5.0: Часть 1, оптимизатор [сообщение #3758 является ответом на сообщение #3751] Sun, 19 November 2023 18:05 Переход к предыдущему сообщениюПереход к следующему сообщению
dimitr в настоящее время не в онлайне  dimitr
Сообщений: 18
Зарегистрирован: July 2022
Junior Member
Мой PR про другое, сабжа он не касается.
Re: Новые возможности Firebird 5.0: Часть 1, оптимизатор [сообщение #3767 является ответом на сообщение #3750] Mon, 20 November 2023 14:29 Переход к предыдущему сообщениюПереход к следующему сообщению
ggreggory в настоящее время не в онлайне  ggreggory
Сообщений: 76
Зарегистрирован: July 2022
Member
dimitr писал(а) Sun, 19 November 2023 10:17

В общем, пофиксил я случай TRUE-инварианта, твой пример теперь быстро работает. В сегодняшнем снапшоте уже должно быть доступно.

Подтверждаю. В WI-V5.0.0.1272 Firebird 5.0 RC 2 все ок! Спасибо!
Re: Новые возможности Firebird 5.0: Часть 1, оптимизатор [сообщение #3780 является ответом на сообщение #3767] Mon, 20 November 2023 20:10 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 329
Зарегистрирован: June 2022
Senior Member
я бы не сказал что совсем всё ОК. Иначе бы не появилось PR, который делает различия используются ли детерминированные функции в инвариантном выражении или нет.
Re: Новые возможности Firebird 5.0: Часть 1, оптимизатор [сообщение #3781 является ответом на сообщение #3780] Mon, 20 November 2023 20:20 Переход к предыдущему сообщениюПереход к следующему сообщению
hvlad в настоящее время не в онлайне  hvlad
Сообщений: 355
Зарегистрирован: August 2022
Senior Member
sim_84
я бы не сказал что совсем всё ОК. Иначе бы не появилось PR, который делает различия используются ли детерминированные функции в инвариантном выражении или нет.
Это действительно о другом.
Хотя темы близки, да.
Re: Новые возможности Firebird 5.0: Часть 1, оптимизатор [сообщение #3783 является ответом на сообщение #3781] Mon, 20 November 2023 20:46 Переход к предыдущему сообщениюПереход к следующему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 149
Зарегистрирован: August 2022
Senior Member
select * from t where s = upper( 'вот те на...' )
А что, сейчас upper( 'вот те на...' ) для каждой строки заново вычисляется? Вот те на... Мой организм обманут фортраном.
Re: Новые возможности Firebird 5.0: Часть 1, оптимизатор [сообщение #3784 является ответом на сообщение #3781] Mon, 20 November 2023 22:39 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 329
Зарегистрирован: June 2022
Senior Member
hvlad писал(а) Mon, 20 November 2023 20:20
sim_84
я бы не сказал что совсем всё ОК. Иначе бы не появилось PR, который делает различия используются ли детерминированные функции в инвариантном выражении или нет.
Это действительно о другом.
Хотя темы близки, да.
Там отличный пример, как патч для этого топика искажает результат запроса с where rand() > 0.5. Поэтому я считаю, что окончательно все будет хорошо, когда pr будет применен.
Re: Новые возможности Firebird 5.0: Часть 1, оптимизатор [сообщение #3785 является ответом на сообщение #3784] Mon, 20 November 2023 23:42 Переход к предыдущему сообщениюПереход к следующему сообщению
hvlad в настоящее время не в онлайне  hvlad
Сообщений: 355
Зарегистрирован: August 2022
Senior Member
sim_84 писал(а) Mon, 20 November 2023 21:39
hvlad писал(а) Mon, 20 November 2023 20:20
sim_84
я бы не сказал что совсем всё ОК. Иначе бы не появилось PR, который делает различия используются ли детерминированные функции в инвариантном выражении или нет.
Это действительно о другом.
Хотя темы близки, да.
Там отличный пример, как патч для этого топика искажает результат запроса с where rand() > 0.5. Поэтому я считаю, что окончательно все будет хорошо, когда pr будет применен.
Ты запутался.

Патч для этого топика Avoid repeating evaluation of the invariant pre-condition which is already known to be TRUE
никак не влияет на запросы с where rand() > 0.5

PR этого топика Do not consider non-deterministic expressions as invariants in pre-filters
как рвз исправляет подобные проблемы. Которые появились совсем не от "патча этого топика"

И насчёт "окончательно хорошо" - я тебя тоже разочарую Smile
Re: Новые возможности Firebird 5.0: Часть 1, оптимизатор [сообщение #3786 является ответом на сообщение #3785] Tue, 21 November 2023 04:39 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 329
Зарегистрирован: June 2022
Senior Member
Блин точно, там же про false оцениваемые инварианты. То есть неверное поведение было и до того как оптимизировали пример из этого топика

[Обновления: Tue, 21 November 2023 04:41]

Известить модератора

Re: Новые возможности Firebird 5.0: Часть 1, оптимизатор [сообщение #3788 является ответом на сообщение #3786] Tue, 21 November 2023 10:00 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 329
Зарегистрирован: June 2022
Senior Member
Попробовал.  Коммит тоже внёс свою лепту

До этого коммита была проблема описанная в Do not consider non-deterministic expressions as invariants in pre-filters

select count(*) from employee where rand() > 0.5
Когда добавили 1708 то стало возвращать либо 0 записей либо примерно половину. Когда добавили коммит для true инвариантов
стало либо 0, либо все записи.
Re: Новые возможности Firebird 5.0: Часть 1, оптимизатор [сообщение #3791 является ответом на сообщение #3783] Tue, 21 November 2023 10:21 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 329
Зарегистрирован: June 2022
Senior Member
shalamyansky писал(а) Mon, 20 November 2023 20:46
select * from t where s = upper( 'вот те на...' )
А что, сейчас upper( 'вот те на...' ) для каждой строки заново вычисляется? Вот те на... Мой организм обманут фортраном.
Зависит от того есть ли индекс для поля s. Если нет, то да будет вычисляться для каждой записи из таблицы t.

Вообще этот случай тоже можно пофиксить. У нас есть детерминированные и недетерминированные функции. Сейчас для своих функций мы моем указать детерминированность,
но она работает только для функций без аргументов. В общем случае, хранение детерминированного результата для всех возможных аргументов трудно сделать, да и не надо.
А вот если аргументы внутри такой функции являются литералами, или параметром, то есть значение аргументов не зависят от потоков, то вполне можно вычислять функцию один раз и использовать последний результат вычисления.
Re: Новые возможности Firebird 5.0: Часть 1, оптимизатор [сообщение #3794 является ответом на сообщение #3791] Tue, 21 November 2023 12:50 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 887
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
sim_84

В общем случае, хранение детерминированного результата для всех возможных аргументов трудно сделать, да и не надо.
Оракел же сделал.
несмотря на.
Re: Новые возможности Firebird 5.0: Часть 1, оптимизатор [сообщение #3796 является ответом на сообщение #3791] Tue, 21 November 2023 13:15 Переход к предыдущему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 149
Зарегистрирован: August 2022
Senior Member
sim_84 писал(а) Tue, 21 November 2023 10:21

А вот если аргументы внутри такой функции являются литералами, или параметром...
Интуиция шептала, что значение такой функции является инвариантом, и компилятор просто обязан заменить его константой. Однако она (моя интуиция) ошибалась. Вполне можно соорудить функцию, возвращающую разные результаты для равных аргументов. Использующую текущее время, например. Действительно, надо явным образом задавать детерминированность для собственных функций, а для системных эту детерминированность компилятор мог бы и сам знать.

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

P.S.
Прежде всего это относится даже не к функциям, а просто к константным выражениям из литералов.

Кстати, любопытно, есть ли в этом аспекте разница в выполнении
select '2023-11-21' from bigtable
и
select cast( '2023-11-21' as date ) from bigtable
?

P.P.S
Взял таблицу с 18 млн. записей
Все 3 запроса
select count( id )                           from bigtable
select count( '2023-11-21' )                 from bigtable
select count( cast( '2023-11-21' as date ) ) from bigtable
выполнились за одинаковое время (17 сек.). То есть похоже, что в данном случае константа вычислилась заранее.

[Обновления: Tue, 21 November 2023 13:35]

Известить модератора

Предыдущая тема: FB 2.5.3 to 3.0.4
Следующая тема: CLIENT_ADDRESS зачем порт?
Переход к форуму:
  


Текущее время: Fri Nov 15 05:40:43 GMT+3 2024

Общее время, затраченное на создание страницы: 0.01604 секунд