|
Поиск в символьном столбце
|
|||
---|---|---|---|
#18+
А кто-нибудь проверял, что быстрее работает: 1) upper(x.name) like '%'||upper(i_name)||'%' или 2) instr(upper(x.name), upper(i_name))>0? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 15:01 |
|
Поиск в символьном столбце
|
|||
---|---|---|---|
#18+
Не проверял, но думаю что первое: 1) есть надежда, что '%'||upper(i_name)||'%' будет вычисляться всегда один раз 2) можно построить function index по выражению upper(x.name) что-то еще Вариант через instr, как-то сильно по практологически выглядит. IMHO ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 15:36 |
|
Поиск в символьном столбце
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev Вариант через instr, как-то сильно по практологически выглядит. IMHO ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 16:28 |
|
Поиск в символьном столбце
|
|||
---|---|---|---|
#18+
Pastic А кто-нибудь проверял, что быстрее работает: 1) upper(x.name) like '%'||upper(i_name)||'%' или 2) instr(upper(x.name), upper(i_name))>0? Я думаю что для хорошего оптимизатора эти конструкции идентичны. Для плохого, второй должен быть быстрее. Если спецсимволов в i_name не ожидается, есть ещё regexp_like(x_name,i_name,'i'). Если ожидаются, то (1) и (2) могут не совпадать по смыслу. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2020, 07:38 |
|
Поиск в символьном столбце
|
|||
---|---|---|---|
#18+
Свежеразбаненный неофит начинает делиться своими размышлениями. Вместо прочтения документации по CBO, анализа планов. Все внимаем. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2020, 08:49 |
|
Поиск в символьном столбце
|
|||
---|---|---|---|
#18+
dmdmdm, "Я думаю, значит существую". Я высказал мнение на вопрос ТС на основании своего скромного опыта SQL, и достаточного опыта работы с оптимизаторами. Вы сказали что ответ есть в документации, и в "планах", но что-то не даёт вам ответить на вопрос ТС? Вопрос то простой - что быстрее - (1) или (2). Экспертам должно быть по плечу. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2020, 17:14 |
|
Поиск в символьном столбце
|
|||
---|---|---|---|
#18+
НеофитSQL, 2 ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2020, 17:24 |
|
Поиск в символьном столбце
|
|||
---|---|---|---|
#18+
НеофитSQL, НеофитSQLдостаточного опыта работы с оптимизаторами так поделитесь результатами работы оптимизатора, в первом и втором случае. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2020, 17:25 |
|
Поиск в символьном столбце
|
|||
---|---|---|---|
#18+
Stax, так прямо однозначно? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2020, 17:27 |
|
Поиск в символьном столбце
|
|||
---|---|---|---|
#18+
K790 Stax, так прямо однозначно? :) Да Да Да ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2020, 17:36 |
|
Поиск в символьном столбце
|
|||
---|---|---|---|
#18+
K790 Stax, так прямо однозначно? :) однозначно то, что второй вариант предотвратит "неумышленное" использование оптимизатором индекса по upper(x.name), даже если он кем-то будет создан со специальной целью нанесения вреда запросу, в фильтре которого присутствует upper(x.name). Для конкретной использованной формы instr(upper(x.name), upper(i_name)) это безусловное благо, по сравнению с услиями, которые нужно буждет предпринять в случае like '%'||upper(i_name)||'%' , чтобы избежать совсем такого индекса, или хотя бы превратить его использование в index fast full scan. upd; я не хочу сказать, что такой индекс универсально плохой. Я говорю, что в первом случае, его использование нежелательно, и за это, может быть, придётся побороться... ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2020, 17:53 |
|
Поиск в символьном столбце
|
|||
---|---|---|---|
#18+
booby, разве в случае с % в начале есть шанс, что используется индекс? Индекс помог бы если бы сравнение происходило с начала строки, но тогда споткнется об upper() ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2020, 18:15 |
|
Поиск в символьном столбце
|
|||
---|---|---|---|
#18+
booby, Не торопись делать выводы насчет индекса на UPPER(X.NAME) ничего не зная о ширине таблицы и кардинальности выборки. Вполне возможно FULL INDEX SCAN на UPPER(X.NAME) улучшит производительность. Хотя на "что быстрее" он не повлияет ибо как LIKE так и INSTR могут им воспользоваться. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2020, 18:17 |
|
Поиск в символьном столбце
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev ... 2) можно построить function index по выражению upper(x.name) что-то еще ... такой индекс может быть использован. тогда со 100% вероятностью получится index full scan, а за fast full scan нужно устраивать операцию по принуждению к использованию такой стратегии. В данном случае предпочтительнее "что-то еще"... ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2020, 18:20 |
|
Поиск в символьном столбце
|
|||
---|---|---|---|
#18+
K790 НеофитSQL, НеофитSQLдостаточного опыта работы с оптимизаторами так поделитесь результатами работы оптимизатора, в первом и втором случае. Мое мнение, новичка: Если цель - обработать каждую из этих строк (а не, скажем, использовать в подзапросе exists), то Оракл оптимизатор отдыхает, т.к. поиск ведется в середине строки, без указания что слово поиска ограничено пробелами или другими разделителями. Т.е. ни один индекс, обычный или фулл-текст в общем случае не поможет, имеем full scan, единственная оптимизация скана - длина поискового слова, можно не смотреть на строчки которые короче. Вопросы оптимизации UPPER() решаются одинаково в обоих случаях. Смена контекста не происходит в обоих случаях. План, думаю, будет одинаковый. Конструкция (2) переводится в наиболее эффективную машинную операцию (согласно моим знаниям 86 ассемблера) Значит, конструкция 1 в лучшем случае будет равна (2). Для этого, оптимизатор должен заметить одиночные '%' с обеих сторон, и вместо манипуляций с памятью, слияния строк, интерпретации спец символов '%' и умных проверок применить конструкцию (2) сразу. Для этого случай одиночных '%'||xxx||'%' должен быть конкретно записан в правилах оптимизатора. А теперь нужно попробовать и померять, желательно на разных версиях оракла. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2020, 18:32 |
|
Поиск в символьном столбце
|
|||
---|---|---|---|
#18+
SY, Вы правы, все черти всегда в деталях. я предполагах "почти везде заполненность" для i_name, "большую таблицу" и не слишком малую ширину для i_name, кажется, что безуловная полезность такого индекса, наверно, проявится на очень широких таблицах, например, когда общая ширина строки в таблице в 64 или 128 раз больше ширины i_name. про умения instr - не знал. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2020, 18:33 |
|
Поиск в символьном столбце
|
|||
---|---|---|---|
#18+
НеофитSQL, авторМое мнение... Здесь привыкли верить приведенным тестам и цифрам. Поиск по трассировкам по форуму вам в помощь. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2020, 19:01 |
|
Поиск в символьном столбце
|
|||
---|---|---|---|
#18+
Я вижу два твердых голоса в пользу преимущества (2), пока ни одного - в пользу (1). Будьте смелее, товарищи теоретики и практики. Блесните своими знаниями и опытом и потенцией в простом вопросе. Не бойтесь ошибиться, это не экзамен. Потом бенчмарк устроим. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2020, 19:38 |
|
Поиск в символьном столбце
|
|||
---|---|---|---|
#18+
booby про умения instr - не знал. Это не про INSTR. Oracle находит ф-цию которой на вход подается индексированное выражение. Oracle не знает логику ф-ции посему считает NULLы нужно тоже передавать. Это значит индекс будет использоваться только если Oracle знает что индекс содержит все строки. Тогда можно читать индекс а не таблицу для подачи ф-ции: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33.
Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63.
SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2020, 20:11 |
|
|
start [/forum/topic.php?fid=52&gotonew=1&tid=1880726]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
148ms |
get topic data: |
13ms |
get first new msg: |
8ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
others: | 12ms |
total: | 279ms |
0 / 0 |