Какие базы данных имеют оптимизацию для функций, чтобы использовать индексы?

Предположим, у меня есть столбец с плавающей точкой, индекс b-дерева и миллион строк:

CREATE TABLE test (
     val FLOAT,
     KEY (val)
);

INSERT INTO test VALUES (random(-1000, 1000)), (random(-1000, 1000)), ...

(1 млн рядов)

Теперь, если я хочу сделать запрос как

SELECT * FROM test WHERE abs(val) > param

или же

SELECT * FROM test WHERE int(val) % 2; /* odd integer numbers only */

Какие базы данных могут оптимизировать это для использования индекса на valчтобы мне не приходилось использовать индекс для проверяемого выражения или самому выполнять обратное выражение?

3 ответа

Решение

Я не думаю, что любая СУБД может использовать "простой" индекс на val если вы используете этот столбец в функции или выражении.

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

Я знаю, что Postgres может сделать это. Смотрите документацию, но вы создаете индекс для выражения.

Используя ваши примеры:

CREATE INDEX ON test( abs(val) ); -- function calls don't require surrounding brackets
CREATE INDEX ON test( (int(val) % 2) ); -- arbitrary expressions require surrounding brackets

SQL Server может это сделать. Это будет работать просто потому, что оптимизатор сопоставит выражение в вашем запросе с индексом.

Другие вопросы по тегам