Допустим, у вас есть таблица в Oracle:
CREATE TABLE person (
id NUMBER PRIMARY KEY,
given_names VARCHAR2(50),
surname VARCHAR2(50)
);
с этими функциональными индексами:
CREATE INDEX idx_person_upper_given_names ON person (UPPER(given_names));
CREATE INDEX idx_person_upper_last_name ON person (UPPER(last_name));
Теперь, для names_names нет значений NULL, но ради аргумента last_name имеет. Если я сделаю это:
SELECT * FROM person WHERE UPPER(given_names) LIKE 'P%'
план объяснения говорит мне, что он использует индекс, но измените его на:
SELECT * FROM person WHERE UPPER(last_name) LIKE 'P%'
это не так. Документы Oracle говорят, что использование индекса на основе функций будет использоваться только при выполнении нескольких условий, одно из которых - убедиться, что значения NULL отсутствуют, поскольку они не проиндексированы.
Я пробовал эти запросы:
SELECT * FROM person WHERE UPPER(last_name) LIKE 'P%' AND UPPER(last_name) IS NOT NULL
и
SELECT * FROM person WHERE UPPER(last_name) LIKE 'P%' AND last_name IS NOT NULL
В последнем случае я даже добавил индекс для last_name, но независимо от того, что я пробую, он использует полное сканирование таблицы. Предполагая, что я не могу избавиться от значений NULL, как мне заставить этот запрос использовать индекс UPPER (last_name)?