MSSQL / Oracle Query Tuning 500 000+ записей Coldfusion - снижает () снижение производительности - PullRequest
1 голос
/ 05 апреля 2011

Я не пытаюсь начать дискуссию о том, что лучше вообще, я задаю этот вопрос специально. :)

Мне нужно написать запрос, чтобы получить список идентификаторов пользователей (uid) из базы данных, содержащей более 500 тыс. Записей. Я возвращаю только одно поле, UID. Я могу запросить либо наш блок Oracle, либо наш блок MSSQL 2000. Запрос выглядит так (это не было упрощено)

select uid
from employeeRec
where uid = 'abc123'

Да, это действительно просто запрос. Там, где мне нужна помощь по настройке, это то, что uid проиндексирован, и некоторые uid могут быть (не многие, а некоторые) «ABC123» или «abc123». MSSQL не заботится о чувствительности к регистру, тогда как Oracle. Поэтому для Oracle мой запрос будет выглядеть так:

select uid
from employeeRec
where lower(uid) = 'abc123'

Я узнал, что если вы используете более низкое поле индекса в MSSQL, вы делаете индекс бесполезным (есть способы обойти это, но это выходит за рамки моего вопроса здесь - поскольку, если я выберу MSSQL, я не Т нужно использовать ниже вообще). Я хотел знать, если я выберу Oracle и использую функцию lower (), это также повлияет на производительность запроса?

Я повторяю этот запрос около 200 раз в дополнение к некоторым другим запросам, которые выполняются, и на обработку всего цикла уходит 1 секунда на каждую итерацию, и я сузил медленность этого конкретного запроса. Для веб-страницы 200 секунд кажутся вечностью. Для читателей CF значение тайм-аута было увеличено, поэтому страница не содержит ошибок и нет ошибок, я просто пытаюсь ускорить этот запрос.

Еще один момент, на который следует обратить внимание: эта база данных находится в другом городе, чем другие выполняемые запросы, поэтому я ожидаю некоторого времени задержки там.

Ответы [ 3 ]

5 голосов
/ 05 апреля 2011

Как сказал TomTom, ваш индекс просто не будет использоваться Oracle. Но вы можете создать индекс , основанный на функции, , и этот новый индекс будет использоваться при выполнении запроса.

create index my_new_ix on employeeRec(lower(uid));
3 голосов
/ 05 апреля 2011

Завершение индексированного столбца в вызове функции может привести к проблемам с производительностью в Oracle.Oracle не может использовать обычный индекс для UID для обработки вашего запроса.С другой стороны, вы можете создать индекс на основе функции для lower(uid), который будет использоваться запросом, т.е.

CREATE INDEX case_insensitive_idx
    ON employeeRec( lower( uid ) );

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

1 голос
/ 05 апреля 2011

Я хотел знать, выберу ли я Oracle, и использовать функцию lower (), это также повредило производительность запрос

Да. Снижение производительности происходит потому, что индекс соответствует исходному значению, а сопоставление i чувствительно к регистру, поэтому все возможные значения должны быть пропущены через функцию, чтобы отфильтровать соответствующие значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...