substr или КАК быстрее в Oracle?

Вы хотите узнать о escape-последовательностях ANSI. Вот краткий пример:

CSI="\x1B["
print(CSI+"31;40m" + "Colored Text" + CSI + "0m")

Для большего количества информации видят http://en.wikipedia.org/wiki/ANSI_escape_code

Для символа блока, пробуют unicode символ как \u2588:

print(u"\u2588")

Соединение всего этого:

print(CSI+"31;40m" + u"\u2588" + CSI + "0m")

25
задан Brian Ramsay 28 July 2009 в 22:07
поделиться

6 ответов

Предполагая, что максимальная производительность является целью, в идеале я бы выбрал SUBSTR (my_field, 1,6) и создать функциональный индекс для поддержки запроса.

CREATE INDEX my_substr_idx
    ON my_table( substr( my_field,1,6 ) );

Как отмечают другие, SUBSTR (my_field, 1,6) не сможет использовать обычный индекс для MY_FIELD . Версия LIKE может использовать индекс, но оптимизатор s оценки мощности в этом случае, как правило, довольно плохие, поэтому весьма вероятно, что либо не будет использовать индекс, когда он будет полезен, либо использовать индекс, когда предпочтительнее сканирование таблицы. Индексирование фактического выражения даст оптимизатору гораздо больше информации для работы, поэтому вероятность правильного выбора индекса гораздо выше. Кто-то более умный, чем я, может предложить способ использования статистики по виртуальным столбцам в 11g, чтобы дать оптимизатору более точную информацию для запроса LIKE.

Если 6 - это переменная (т. Е. Иногда нужно искать первые 6 символов и иногда вы хотите выполнить поиск по другому номеру), вы, вероятно, не сможете найти функциональный индекс для поддержки этого запроса. В этом случае вам, вероятно, будет лучше противостоять капризу решений оптимизатора с формулировкой LIKE.

Индексирование фактического выражения даст оптимизатору гораздо больше информации для работы, поэтому вероятность правильного выбора индекса гораздо выше. Кто-то более умный, чем я, может предложить способ использования статистики по виртуальным столбцам в 11g, чтобы дать оптимизатору более точную информацию для запроса LIKE.

Если 6 - это переменная (т. Е. Иногда нужно искать первые 6 символов и иногда вы хотите выполнить поиск по другому номеру), вы, вероятно, не сможете найти функциональный индекс для поддержки этого запроса. В этом случае вам, вероятно, будет лучше противостоять капризу решений оптимизатора с формулировкой LIKE.

Индексирование фактического выражения даст оптимизатору гораздо больше информации для работы, поэтому вероятность правильного выбора индекса гораздо выше. Кто-то более умный, чем я, может предложить способ использования статистики по виртуальным столбцам в 11g, чтобы дать оптимизатору более точную информацию для запроса LIKE.

Если 6 - это переменная (т. Е. Иногда нужно искать первые 6 символов и иногда вы хотите выполнить поиск по другому номеру), вы, вероятно, не сможете найти функциональный индекс для поддержки этого запроса. В этом случае вам, вероятно, будет лучше противостоять капризу решений оптимизатора с формулировкой LIKE.

Если 6 - это переменная (т. Е. Вы иногда хотите выполнить поиск по первым 6 символам, а иногда хотите найти другое число), вы, вероятно, не сможете придумать функциональный индекс для поддержки этого запроса. В этом случае вам, вероятно, будет лучше противостоять капризу решений оптимизатора с формулировкой LIKE.

Если 6 - это переменная (т. Е. Вы иногда хотите выполнить поиск по первым 6 символам, а иногда хотите найти другое число), вы, вероятно, не сможете придумать функциональный индекс для поддержки этого запроса. В этом случае вам, вероятно, будет лучше противостоять капризу решений оптимизатора с формулировкой LIKE.

20
ответ дан 28 November 2019 в 21:30
поделиться

Из двух представленных вариантов однозначно НРАВИТСЯ. Метод подстроки должен быть выполнен для всех строк в таблице. Использование LIKE позволит использовать индексы.

Чтобы проверить мой ответ, просто профилируйте результаты. Все должно быть ясно как день.

10
ответ дан 28 November 2019 в 21:30
поделиться

Если у вас есть индекс для my_field, то LIKE может быть быстрее. Сделайте свои собственные тесты.

2
ответ дан 28 November 2019 в 21:30
поделиться

Поскольку никто не упомянул об этом, для полноты картины, есть плагин для инструментария Fox . Это тот, который я использовал в прошлый раз, когда делал любую работу с пользовательским интерфейсом C ++ по собственному желанию. Для этого также есть привязка к Ruby и Python (хотя последний уже давно устарел).

В общем,

select count(*) from ... where my_field LIKE 'search%';

Один из двух методов может быть значительно более точным, чем другой.

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

explain plan for 
select /*+ dynamic_sampling(4) */ ... from ... where substr(my_field,1,6) = 'search';

select * from table(dbms_xplan.display);

Что касается использования индекса, оба метода могут использовать метод доступа на основе индекса. Предикат LIKE, вероятно, более удобен для индекса и может использовать сканирование диапазона или быстрое сканирование полного индекса. Метод SUBSTR, безусловно, может использовать быстрое сканирование полного индекса, но вопрос о том, будет ли оптимизатор рассматривать сканирование диапазона, лучше всего проверить на вашей собственной версии - я помню, что он не будет, но кто скажет, что substr (my_column, 1 , n) выиграла »

1
ответ дан 28 November 2019 в 21:30
поделиться

Я бы профилировал оба. Но я бы предположил, что LIKE будет намного быстрее, потому что он использует двоичный поиск по индексу (если поле проиндексировано). Если вы используете метод SUBSTR, вы получите полное сканирование таблицы, так как Oracle должен обрабатывать функцию построчно.

0
ответ дан 28 November 2019 в 21:30
поделиться

Если у вас нет индекса , то разницы нет. Потому что oracle выполняет полное сканирование таблицы и оценивает выражение для каждой строки. Вы можете поместить индекс в столбец, чтобы ускорить оба запроса.

CREATE INDEX my_like_idx
ON my_table( my_field );

Этот индекс более гибкий и ускоряет выполнение запроса с помощью like. Он будет работать для любого сравнения, начинающегося с символов и имеющего заполнитель (%) в конце. Oracle выполняет сканирование диапазона индекса, чтобы найти все совпадающие строки.

CREATE INDEX my_substr_idx
ON my_table( substr( my_field,1,6 ) );

Этот индекс ускоряет запрос с помощью substr. Но индекс очень особенный, чтобы сравнивать только первые 6 символов.

Если вы запрашиваете часть начала в середине. Создание индекса на основе функций поможет.

WHERE substr(my_field,2,5) = 'earch'
WHERE my_field like '%earch%'
2
ответ дан 28 November 2019 в 21:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: