Какие базы данных имеют оптимизацию для функций, чтобы использовать индексы?
Предположим, у меня есть столбец с плавающей точкой, индекс 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 может это сделать. Это будет работать просто потому, что оптимизатор сопоставит выражение в вашем запросе с индексом.