Начало » Использование СУБД » Firebird, HQbird, InterBase » Новые возможности Firebird 5.0: Часть 1, оптимизатор
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Re: Новые возможности Firebird 5.0: Часть 1, оптимизатор [сообщение #3791 является ответом на сообщение #3783] |
Tue, 21 November 2023 10:21 |
sim_84
Сообщений: 330 Зарегистрирован: June 2022
|
Senior Member |
|
|
shalamyansky писал(а) Mon, 20 November 2023 20:46select * from t where s = upper( 'вот те на...' )
А что, сейчас upper( 'вот те на...' ) для каждой строки заново вычисляется? Вот те на... Мой организм обманут фортраном.
Зависит от того есть ли индекс для поля s. Если нет, то да будет вычисляться для каждой записи из таблицы t.
Вообще этот случай тоже можно пофиксить. У нас есть детерминированные и недетерминированные функции. Сейчас для своих функций мы моем указать детерминированность,
но она работает только для функций без аргументов. В общем случае, хранение детерминированного результата для всех возможных аргументов трудно сделать, да и не надо.
А вот если аргументы внутри такой функции являются литералами, или параметром, то есть значение аргументов не зависят от потоков, то вполне можно вычислять функцию один раз и использовать последний результат вычисления.
|
|
|
|
Re: Новые возможности Firebird 5.0: Часть 1, оптимизатор [сообщение #3796 является ответом на сообщение #3791] |
Tue, 21 November 2023 13:15 |
shalamyansky
Сообщений: 150 Зарегистрирован: 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] Известить модератора
|
|
|
Переход к форуму:
Текущее время: Sun Nov 24 17:15:18 GMT+3 2024
Общее время, затраченное на создание страницы: 0.01659 секунд
|