|
|
|
not regexp_like vs not like
|
|||
|---|---|---|---|
|
#18+
сегодня попросила девелопера заменить 'not regexp_like' в запросе на обчный 'not like'. Время выполнения упало с 4 минут до 20 секунд. Делелопер расстроился и попросил разъяснений почему. У меня ничего кроме как "regexp тяжелый, жрет CPU" в голову ничего не лезет. А правда, почему? Вот простой пример: create table reg1 as select rownum id, object_id, object_name from dba_objects; insert into reg1 select * from reg1; insert into reg1 select * from reg1; insert into reg1 select * from reg1; commit; Вариант 1: select object_name,sum(id), sum(object_id) from reg1 where not regexp_like (object_name, 'AAA|BBB|CCC|DDD|EEE','i') group by object_name; Вариант 2: select object_name,sum(id), sum(object_id) from reg1 where not (upper(object_name) like '%AAA%' or upper(object_name) like '%BBB%' or upper(object_name) like '%CCC%' or upper(object_name) like '%DDD%' or upper(object_name) like '%EEE%') group by object_name; первый бежит 52 сек, второй 3. Если смотреть на trace, то перый ждет 50sec на CPU. Если из первого варианта уберу часть условий - бежит быстрее. типа: ...where not regexp_like (object_name, 'AAA','i')... он чего, каждое условие отдельно пробегает? Это что, глюк, фича? 12.2 если что. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2018, 15:12 |
|
||
|
not regexp_like vs not like
|
|||
|---|---|---|---|
|
#18+
JuliaTr, можно еще с instr сравнить ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2018, 15:45 |
|
||
|
not regexp_like vs not like
|
|||
|---|---|---|---|
|
#18+
StaxJuliaTr, можно еще с instr сравнить ..... stax instr тоже шустрый. Но нам не подошел, т.е. надо было конец строки фиксированый иметь. Типа where not regexp_like (object_name, '.*AAA$|.*BBB$|.*CCC$|.*DDD$|.*EEE$','i'). в примере просто по-максимуму упрощенно, но с той же особенностью. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2018, 16:14 |
|
||
|
not regexp_like vs not like
|
|||
|---|---|---|---|
|
#18+
JuliaTrт.е. надо было конец строки фиксированый иметь. Типа where not regexp_like (object_name, '.*AAA$|.*BBB$|.*CCC$|.*DDD$|.*EEE$','i'). Код: plsql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2018, 16:18 |
|
||
|
not regexp_like vs not like
|
|||
|---|---|---|---|
|
#18+
Вариантов много. Интересно другое. Почему REGEXP_LIKE так себя ведет? Это баг? Ну просто огромная разница, причем не описаная в документации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2018, 16:22 |
|
||
|
not regexp_like vs not like
|
|||
|---|---|---|---|
|
#18+
JuliaTrПочему REGEXP_LIKE так себя ведет? Это баг?Нет. RE тяжелы сами по себе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2018, 16:29 |
|
||
|
not regexp_like vs not like
|
|||
|---|---|---|---|
|
#18+
ElicRE тяжелы сами по себе. Причем задача ТС (N символов в конце строки) - как раз одна из тех, которые НЕ следует решать на RE. ...на самом деле этот пост я делаю ради вот этой ссылки (для особых ценителей): http://regex.info/blog/2006-09-15/247 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2018, 01:49 |
|
||
|
not regexp_like vs not like
|
|||
|---|---|---|---|
|
#18+
Понятно. Спасибо всем. Логично, но вот поведение, когда AAA|BBB|CCC в 3 раза медленней чем просто AAA, от RE все равно не ожидалось. Убираем нафиг. Надо будет в понедельник потестировать что-то аналогичное тем же перлом с большим файлом, и сравнить время. Даже интересно стало. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2018, 10:09 |
|
||
|
not regexp_like vs not like
|
|||
|---|---|---|---|
|
#18+
JuliaTr, Код: perl 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. тут регулярка быстрее чем 3 поочередных вызова функции ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2018, 18:29 |
|
||
|
not regexp_like vs not like
|
|||
|---|---|---|---|
|
#18+
полуоффтоп: сделал сравнение perl/python на этом примитиве python_re.py Код: python 1. 2. 3. 4. 5. 6. 7. 8. python_in.py Код: python 1. 2. 3. 4. 5. 6. 7. test.sh Код: perl 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. Результаты Код: perl 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2018, 19:33 |
|
||
|
not regexp_like vs not like
|
|||
|---|---|---|---|
|
#18+
Тоже поучаствую. Если в питоне сделать предварительную компиляцию выражения, то результаты становятся сравнимыми с перлом: python_re-c.py Код: python 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Результат см. re-c Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2018, 21:23 |
|
||
|
not regexp_like vs not like
|
|||
|---|---|---|---|
|
#18+
Alexander A. Sak, а какая версия питона? у меня на 2.7.5 магии не вышло: Код: python 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2018, 23:58 |
|
||
|
not regexp_like vs not like
|
|||
|---|---|---|---|
|
#18+
чуток изменил тест-кейс, чтобы данные сто раз не генерить python_re.py Код: python 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. test.sh Код: perl 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. типичный результат повторного вызова Код: bash 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. ps. Оказывается у тега SRC нет варианта для bash/sh, но есть для perl ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2018, 00:11 |
|
||
|
not regexp_like vs not like
|
|||
|---|---|---|---|
|
#18+
xtenderAlexander A. Sak, а какая версия питона? у меня на 2.7.5 магии не вышло: Python 2.7.15rc1 на Убунте 18.04. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2018, 19:53 |
|
||
|
not regexp_like vs not like
|
|||
|---|---|---|---|
|
#18+
у меня на питоне тоже медленнее. Python 2.6.6 и из примера видно, как только добавляетя 'OR', то сразу в два раза медленнее бежит. А там уже не важно сколько условий добававлено. Perl: re (looking for AAA|BBB|CCC|DDD): 2511 real 0m2.742s user 0m2.538s sys 0m0.191s ================ Perl: re (looking for AAA|BBB): 1267 real 0m2.506s user 0m2.326s sys 0m0.173s ================ Perl: re (looking for AAA): 622 real 0m1.216s user 0m1.084s sys 0m0.131s ================ Python: re (looking for AAA|BBB|CCC|DDD): 5022 real 0m4.597s user 0m4.453s sys 0m0.133s ================ Python: re (looking for AAA|BBB): 2534 real 0m4.128s user 0m3.964s sys 0m0.132s ================ Python: re (looking for AAA): 1244 real 0m2.098s user 0m1.985s sys 0m0.110s ================ Egrep (looking for AAA|BBB|CCC|DDD): 2511 real 0m0.527s user 0m0.448s sys 0m0.074s ================ Egrep (looking for AAA|BBB): 1267 real 0m0.514s user 0m0.440s sys 0m0.071s ================ Egrep (looking for AAA): 622 real 0m0.201s user 0m0.119s sys 0m0.080s ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2018, 10:03 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39661384&tid=1883840]: |
0ms |
get settings: |
7ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
73ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
3ms |
| others: | 235ms |
| total: | 379ms |

| 0 / 0 |
