Какие базы данных имеют функцию оптимизации для использования индексов? - PullRequest
1 голос
/ 25 марта 2012

Предположим, у меня есть столбец с плавающей точкой, индекс 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 ]

0 голосов
/ 25 марта 2012

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

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

0 голосов
/ 25 марта 2012

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

0 голосов
/ 25 марта 2012

Я знаю, 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
...