Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Регулярное выражение которое убило Оракуль  [new]
mikich
Member

Откуда:
Сообщений: 93
Всем доброго дня

подскажите, что такого в регулярном выражении, что заставляет oracle очнуться только через SHUTDOWN immediate ?
kill session не помагает.


SELECT 1 FROM DUAL
WHERE REGEXP_LIKE (
'gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg',
'^((http|https|ftp)://)?(www.)?(((\w+[-]*)+\.)+){1}\w{2,6}(:\d+)?(/[^/]+)*/*(\?.+)*$');
13 мар 15, 10:24    [17379199]     Ответить | Цитировать Сообщить модератору
 Re: Регулярное выражение которое убило Оракуль  [new]
regexp_like
Guest
mikich,

SQL> ed
Wrote file afiedt.buf

1 SELECT 1 FROM DUAL
2 WHERE REGEXP_LIKE (
3 'gggggggggggggggggggg',
4* '^((http|https|ftp)://)?(www.)?(((\w+[-]*)+\.)+){1}\w{2,6}(:\d+)?(/[^/]+)*/*(\?.+)*$')
SQL> /

no rows selected

Elapsed: 00:00:00.00
SQL> ed
Wrote file afiedt.buf

1 SELECT 1 FROM DUAL
2 WHERE REGEXP_LIKE (
3 'ggggggggggggggggggggg',
4* '^((http|https|ftp)://)?(www.)?(((\w+[-]*)+\.)+){1}\w{2,6}(:\d+)?(/[^/]+)*/*(\?.+)*$')
SQL> /

no rows selected

Elapsed: 00:00:06.42
SQL> ed
Wrote file afiedt.buf

1 SELECT 1 FROM DUAL
2 WHERE REGEXP_LIKE (
3 'gggggggggggggggggggggg',
4* '^((http|https|ftp)://)?(www.)?(((\w+[-]*)+\.)+){1}\w{2,6}(:\d+)?(/[^/]+)*/*(\?.+)*$')
SQL> /

no rows selected

Elapsed: 00:00:12.85
SQL> ed
Wrote file afiedt.buf

1 SELECT 1 FROM DUAL
2 WHERE REGEXP_LIKE (
3 'ggggggggggggggggggggggg',
4* '^((http|https|ftp)://)?(www.)?(((\w+[-]*)+\.)+){1}\w{2,6}(:\d+)?(/[^/]+)*/*(\?.+)*$')
SQL> /

no rows selected

Elapsed: 00:00:25.51
SQL>
13 мар 15, 10:42    [17379280]     Ответить | Цитировать Сообщить модератору
 Re: Регулярное выражение которое убило Оракуль  [new]
jan2ary
Member

Откуда: Киев
Сообщений: 1780
Есть еще такое: REGEXP_LIKE Hangs and CPU Spikes After DB Upgrade To 11gr2 From 10.2.0.4 (Doc ID 1276379.1)
The SQL containing REGEXP_LIKE as below consumes high CPU and runs for ever... The statement spins in the lxregmatch stack;
Воспроизводится на 12.1.0.2.
13 мар 15, 11:12    [17379412]     Ответить | Цитировать Сообщить модератору
 Re: Регулярное выражение которое убило Оракуль  [new]
Elic
Member

Откуда:
Сообщений: 29980
mikich
'^((http|https|ftp)://)?(www.)?(((\w+[-]*)+\.)+){1}\w{2,6}(:\d+)?(/[^/]+)*/*(\?.+)*$')
Квантор на кванторе сидит и квантором погоняет.
Не найдя обязательной точки, приходится откатываться, перебирая все вариантов разбиения строки длиной на подстроки.
13 мар 15, 11:21    [17379461]     Ответить | Цитировать Сообщить модератору
 Re: Регулярное выражение которое убило Оракуль  [new]
mikich
Member

Откуда:
Сообщений: 93
судя по времени выполнения с каждой лишней буквой время растет в геометрической прогрессии.
Стало немного легче :), хотябы я понимаю, что для моей строки нужно просто немного подождать, но в чем причина такого гнусного поведения функции?
13 мар 15, 11:26    [17379494]     Ответить | Цитировать Сообщить модератору
 Re: Регулярное выражение которое убило Оракуль  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
mikich
Всем доброго дня

подскажите, что такого ..

(оставляя в стороне реакции сервера на сабж)
выражение ваше весьма нестрогое расслабленное
ну и применение на достаточно длинном первом параметре, гарантирует чумавой рост цены - с очевидным итогом
13 мар 15, 11:30    [17379521]     Ответить | Цитировать Сообщить модератору
 Re: Регулярное выражение которое убило Оракуль  [new]
mikich
Member

Откуда:
Сообщений: 93
Elic,

Спасибо!
13 мар 15, 11:30    [17379523]     Ответить | Цитировать Сообщить модератору
 Re: Регулярное выражение которое убило Оракуль  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
самое хреновое, что когда литералы туда вбиваешь, то регулярка матчится еще на этапе парса запроса. при замене на бинды все же полегче:
+
SQL> exec :mask:='^((http|https|ftp)://)?(www.)?(((\w+[-]*)+\.)+){1}\w{2,6}(:\d+)?(/[^/]+)*/*(\?.+)*$';

PL/SQL procedure successfully completed.

SQL> SELECT 1 FROM DUAL WHERE REGEXP_LIKE ('gggggggggggggggggg','^((http|https|ftp)://)?(www.)?(((\w+[-]*)+\.)+){1}\w{2,6}(:\d+)?(/[^/]+)*/*(\?.+)*$');

no rows selected

Elapsed: 00:00:03.86
SQL> SELECT 1 FROM DUAL WHERE REGEXP_LIKE ('gggggggggggggggggg',:mask);

no rows selected

Elapsed: 00:00:02.14
SQL> SELECT 1 FROM DUAL WHERE REGEXP_LIKE ('ggggggggggggggggggg','^((http|https|ftp)://)?(www.)?(((\w+[-]*)+\.)+){1}\w{2,6}(:\d+)?(/[^/]+)*/*(\?.+)*$');

no rows selected

Elapsed: 00:00:09.08
SQL> SELECT 1 FROM DUAL WHERE REGEXP_LIKE ('ggggggggggggggggggg',:mask);

no rows selected

Elapsed: 00:00:03.75
SQL> SELECT 1 FROM DUAL WHERE REGEXP_LIKE ('gggggggggggggggggggg','^((http|https|ftp)://)?(www.)?(((\w+[-]*)+\.)+){1}\w{2,6}(:\d+)?(/[^/]+)*/*(\?.+)*$');

no rows selected

Elapsed: 00:00:16.22
SQL> SELECT 1 FROM DUAL WHERE REGEXP_LIKE ('gggggggggggggggggggg',:mask);

no rows selected

Elapsed: 00:00:10.61
13 мар 15, 11:35    [17379557]     Ответить | Цитировать Сообщить модератору
 Re: Регулярное выражение которое убило Оракуль  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
т.е. с одной стороны плохо, что висит на парсе, с другой - зато повторный вызов будет моментальным, в отличие от варианта с биндом, т.к. с биндом придется повторно вычислять
13 мар 15, 11:37    [17379570]     Ответить | Цитировать Сообщить модератору
 Re: Регулярное выражение которое убило Оракуль  [new]
avas
Guest
mikich
\w{2,6}


отстаёте от века
13 мар 15, 12:08    [17379814]     Ответить | Цитировать Сообщить модератору
 Re: Регулярное выражение которое убило Оракуль  [new]
mikich
Member

Откуда:
Сообщений: 93
Всем большое спасибо.

все что было найдено в интернете, до этого поста не совсем подходило.

в результате получился такой шаблон
^((ht|f)tps?://)?([0-9a-zA-Zа-яА-ЯёЁ.-]+)\.\w{2,6}(:\d+)?(/\S+)*/?$

Может кто предложет лучше?
13 мар 15, 12:56    [17380093]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить