|
|
|
Применить ряд правил из таблицы к одной строке в чистом SQL
|
|||
|---|---|---|---|
|
#18+
Есть поле VARCHAR(2000) Вносятся туда данные вида ДокументОплатаБанк СотрудникВыплата ДокументНалогБанкСотрудник Задача: взять словарь (табличка) и по нему сократить эти названия. Длинное Название Короткое названиеДокумент ДокСотрудник СотрБанк Б Могу решить на PL\SQL (запускаю цикл по табличке и делаю REPLACE на каждую запись справочника), но как решить на чистом SQL - не знаю. CONNECT BY мог бы помочь, но я не совсем понимаю как его можно подключить. Подскажите пожалуйста, как можно соединить таблицу с данными и справочник так, чтобы весь справочник сокращений можно было применить. Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2016, 13:21 |
|
||
|
Применить ряд правил из таблицы к одной строке в чистом SQL
|
|||
|---|---|---|---|
|
#18+
Магика де Гипнос, MODEL или рекурсия. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2016, 14:14 |
|
||
|
Применить ряд правил из таблицы к одной строке в чистом SQL
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2016, 14:14 |
|
||
|
Применить ряд правил из таблицы к одной строке в чистом SQL
|
|||
|---|---|---|---|
|
#18+
Ну каков вопрос - таков ответ :) Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2016, 14:34 |
|
||
|
Применить ряд правил из таблицы к одной строке в чистом SQL
|
|||
|---|---|---|---|
|
#18+
andrey_anonymous, А не проще ли: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2016, 15:15 |
|
||
|
Применить ряд правил из таблицы к одной строке в чистом SQL
|
|||
|---|---|---|---|
|
#18+
SYА не проще ли: Ну не знаю. И исходный вариант на сахар, а это решение - вообще злой cartesian join по факту. Я даже в порядке шутки юмора такое писать морально не готов :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2016, 15:42 |
|
||
|
Применить ряд правил из таблицы к одной строке в чистом SQL
|
|||
|---|---|---|---|
|
#18+
такой себе переводчик русско-украинский тупой, чисто замена слово-слово, даже без учета смены рода при переводе, но кого-то устраивает и таки как-то работает + пропускает слова из цифр и англобукв Код: 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. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2016, 16:30 |
|
||
|
Применить ряд правил из таблицы к одной строке в чистом SQL
|
|||
|---|---|---|---|
|
#18+
Спасибо большое всем откликнувшимся. В данный момент реализовали при помощи функции, где в PL\SQL по циклу происходит перебор словаря. Используется как временное решение, поэтому сегодня-завтра выберу самый красивый способ из предложенных и применю. Спасибо большое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2016, 22:06 |
|
||
|
Применить ряд правил из таблицы к одной строке в чистом SQL
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousНу не знаю. И исходный вариант на сахар, а это решение - вообще злой cartesian join по факту. Я даже в порядке шутки юмора такое писать морально не готов :) Cartesian join сделает REPLACE всех строк. LIKE проверит все строки + REPLACE где LIKE. С другой стороны LIKE чуть быстрее и ищет до первого соотвествия. Так-что в данном случае баш на баш и я морально готов :) к cartesian join. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2016, 00:21 |
|
||
|
Применить ряд правил из таблицы к одной строке в чистом SQL
|
|||
|---|---|---|---|
|
#18+
Магика де ГипносСпасибо большое всем откликнувшимся. В данный момент реализовали при помощи функции, где в PL\SQL по циклу происходит перебор словаря. Используется как временное решение, поэтому сегодня-завтра выберу самый красивый способ из предложенных и применю. Спасибо большое. Все SQL способы для данной задачи будут медленнее и со значительно худшей масштабируемостью чем PL/SQL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2016, 01:58 |
|
||
|
Применить ряд правил из таблицы к одной строке в чистом SQL
|
|||
|---|---|---|---|
|
#18+
Задача учебная или практическая? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2016, 02:57 |
|
||
|
Применить ряд правил из таблицы к одной строке в чистом SQL
|
|||
|---|---|---|---|
|
#18+
dbms_photoshop Все SQL способы для данной задачи будут медленнее и со значительно худшей масштабируемостью чем PL/SQL. Это почему? Что в данной задаче PL/SQLьного? Что кроме nested loop PL/SQL тут может предложить? SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2016, 03:04 |
|
||
|
Применить ряд правил из таблицы к одной строке в чистом SQL
|
|||
|---|---|---|---|
|
#18+
SYCartesian join сделает REPLACE всех строк. LIKE проверит все строки + REPLACE где LIKE. Вариант с like дает rowsource меньшего размера - на существенных объемах предпочтительнее. Представьте табличку T миллионов на 100-200 записей и словарик на ~500 статей - по cartesian получаем rowsource в 50-100 ярдов записей. Вариант с фильтром оценочно выдаст "нагора" 300-500 миллионов. С другой стороны, в Вашем варианте не требуется группировка... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2016, 03:31 |
|
||
|
Применить ряд правил из таблицы к одной строке в чистом SQL
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopМагика де ГипносСпасибо большое всем откликнувшимся. В данный момент реализовали при помощи функции, где в PL\SQL по циклу происходит перебор словаря. Используется как временное решение, поэтому сегодня-завтра выберу самый красивый способ из предложенных и применю. Спасибо большое. Все SQL способы для данной задачи будут медленнее и со значительно худшей масштабируемостью чем PL/SQL. Вот научится оракель pl/sql в parallel гонять без извратов - тогда обсудим масштабируемость. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2016, 03:33 |
|
||
|
Применить ряд правил из таблицы к одной строке в чистом SQL
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousПредставьте табличку T миллионов на 100-200 записей и словарик на ~500 статей - по cartesian получаем rowsource в 50-100 ярдов записей. Вариант с фильтром оценочно выдаст "нагора" 300-500 миллионов. С другой стороны, в Вашем варианте не требуется группировка... Ну это вопрос temp space. И для сортировки (причем двойной) 300-500 миллионов его тоже понадобится прилично. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2016, 04:06 |
|
||
|
Применить ряд правил из таблицы к одной строке в чистом SQL
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousdbms_photoshopпропущено... Все SQL способы для данной задачи будут медленнее и со значительно худшей масштабируемостью чем PL/SQL. Вот научится оракель pl/sql в parallel гонять без извратов - тогда обсудим масштабируемость.Имеется в виду отсылка к особенностям pipelined? 19746366 Во-первых на них свет клином не сошелся и еще есть dbms_parallel_execute с материализацией результата в отдельном сегменте. Во-вторых плохая масштабируемость означает, что скорость роста времени выполнения от объема данных разная. Иными словами, после определенного предела serial PL/SQL execution гарантированно уделает SQL подходы (recursive subquery factoring или model). Есть весьма экзотические задачи на которых эти два инструмента смотрятся достойно, но пока о них говорить не буду. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2016, 04:27 |
|
||
|
Применить ряд правил из таблицы к одной строке в чистом SQL
|
|||
|---|---|---|---|
|
#18+
dbms_photoshop Все SQL способы для данной задачи будут медленнее и со значительно худшей масштабируемостью чем PL/SQL.Плюс PL/SQL сопровождаемей. А на 12с его можно писать и прямо в запросе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2016, 07:45 |
|
||
|
Применить ряд правил из таблицы к одной строке в чистом SQL
|
|||
|---|---|---|---|
|
#18+
SYЧто кроме nested loop PL/SQL тут может предложить?Что, кроме nested loop, может предложить sql? Кроме того, рассматривается простейший алгоритм без учета конфликтов кодирования. Хотя, может быть, заглавные буквы делят исходную строку на слова, тогда есть варианты сначала парсить строку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2016, 08:12 |
|
||
|
Применить ряд правил из таблицы к одной строке в чистом SQL
|
|||
|---|---|---|---|
|
#18+
982183Задача учебная или практическая? Стыдно признаться, но практическая. Раньше в подобных случаях мы собирали функцию, которая на вход брала строку, прогоняла через словарь и выдавала измененный вариант. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2016, 10:57 |
|
||
|
Применить ряд правил из таблицы к одной строке в чистом SQL
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopеще есть dbms_parallel_execute с материализацией результата в отдельном сегменте. Это и есть изврат, не всякой задаче подходит. К примеру, как там у dbms_parallel_excute дела с read consistency? А как обрабатывать исключения в одном из потоков, если надо обеспечить атомарность _всей операции? Ну и совсем уже мелочь - каждый из параллельных процессов dbms_parallel_excute самостоятельно просканирует источник, что в условиях отсутствия индексов кратно увеличит io. Можно, наверное, попробовать дать им всем один ref cursor в качестве параметра, пусть дерутся... если нет межстрочных зависимостей. parallel pipelined, по крайней мере, нормально работают в одной транзакции и разделяют общий dataset. Про "гарантированно медленнее" на больших объемах - не согласен. Зависит, знаете ли. Пусть PL/SQL гонит могучий параллельный курсор (ведь даже просто отсортировать входной набор для PL/SQL - штука затратная, в параллель существенно легче/быстрее), но ведь весь датасет в итоге соберется на одно процессорное ядро. Если нет вычислений - да и Бог с ним, но если есть - то лучше выполнить на слейвах. Хотите сделать на PL/SQL межстрочные вычисления? Тогда понадобится память. Иногда - Много памяти. С сожалению, один процесс не может без грубого хака скушать более 5% PGA_TARGET. А много параллельных - могут :) Дальше после вычислений итоговый датасет надо куда-то протолкнуть - в тот же merge, например. Тут тоже бывает выгодно использовать parallel_dml. А если так - то зачем собирать датасет в одну кучу, если затем опять раскидывать? К чему это все? Я согласен с тезисом Elic, что PL/SQL в ряде случаев легче сопровождать. Но не согласен с dbms_photoshop, что в текущей реализации PL/SQL большие объемы - его призвание. pipelined в качестве компромисса - вариант приемлемый, и у него, на мой взгляд, больше шансов подружиться с большими объемами. Ну и аналитика тоже, на самом деле, работает неплохо - до тех пор, пока не начинаем ей жонглировать, выстраивая в несколько этажей с разными окнами, сортировками и partitioning. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2016, 13:52 |
|
||
|
Применить ряд правил из таблицы к одной строке в чистом SQL
|
|||
|---|---|---|---|
|
#18+
Магика де Гипнос982183Задача учебная или практическая? Стыдно признаться, но практическая. Тогда очень внимательно отнеситесь к порядку, в котором применяются правила замены из словаря. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2016, 13:53 |
|
||
|
Применить ряд правил из таблицы к одной строке в чистом SQL
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousПро "гарантированно медленнее" на больших объемах - не согласен. Зависит, знаете ли.Конкретный пример в студию. Предлагаю создать отдельный топик вида: вот задача и вот ее решение на recursive subquery factoring/model которое быстрее решения PL/SQL. (за исключением построения иерархий или списков при наличии нормальных индексов и recursive subquery factoring, хотя и тут после определенного предела начинаются чудеса с чтением блоков в current mode и прочими деградациями) Все остальное - пустое сотрясание воздуха. Большие объемы - призвание хадупа, Оракл со своим максимумом 2ГБ на процесс (невероятно что это идиотское ограничение не сняли даже в 12с) и нелинейной масштабируемостью неврно курит в сторонке. Но это тема другой дискуссии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2016, 14:14 |
|
||
|
Применить ряд правил из таблицы к одной строке в чистом SQL
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopОракл со своим максимумом 2ГБ на процесс (невероятно что это идиотское ограничение не сняли даже в 12с)Что за ограничение? Для workarea насколько помню 4Г (по крайней мере перестройка индекса съедает столько), для сессионных переменных -- до 16Г (просто я больше не видел) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2016, 14:22 |
|
||
|
Применить ряд правил из таблицы к одной строке в чистом SQL
|
|||
|---|---|---|---|
|
#18+
Магика де ГипносСтыдно признаться, но практическая. Раньше в подобных случаях мы собирали функцию, которая на вход брала строку, прогоняла через словарь и выдавала измененный вариант. Вообще-то задача совсем не про масштабируемость (вернее не про масштабируемость размера тaблицы а про масштабируемость скорости вставки), cartesian join и прочее. Ведь короткое название опрeделяется при insert/update. Так-что тут скорее всего как быстрее в триггере/коде insert/update. Если так, то я бы: 1. Создал пакет в котором есть только блок инициализации. 2. Блок инициализации засасывает словарь (надеюсь словарь не БСЭ ) в ассоциативный массив с index by varchar2 со значениями массив(длинное_название) := короткое_название; 3. При insert/update (при update тoлько если :new.длинное_название != :old.длинное_название) бегаем в цикле по словам длинное_название, используем массив для сокращения слов и собирaем в короткое_название. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2016, 14:28 |
|
||
|
Применить ряд правил из таблицы к одной строке в чистом SQL
|
|||
|---|---|---|---|
|
#18+
SYdbms_photoshop Все SQL способы для данной задачи будут медленнее и со значительно худшей масштабируемостью чем PL/SQL. Это почему? Что в данной задаче PL/SQLьного? Что кроме nested loop PL/SQL тут может предложить? SY.Еще раз, товарищи: в этой задаче особенного то, что на SQL она решается через rec with/model. Оба этих инструмента после определенной границы вообще не конкуренты PL/SQL. Одно дело баловаться на форуме в пятничных задачках и демонстрировать познания в новых фичах, другое дело иметь код в продакшене. Для наборов данных порядка 10к строк может смотреться более менее терпимо. Для миллиона строк практически нереально придумать что-то решаемое rec with/model и быстрее PL/SQL. Некоторые балуются слейкой и разделением строк моделью, некоторые итеративно применяют правила с помощью rec with. Это все просто баловство и разминка для ума либо для небольших наборов данных. Вон было "прекрасное" решение моделью. 11567017 Что там с масштабируемостью? Есть конкретные варинты опровергнуть - только приветстуются. Не поленюсь написать скриптик, чтоб показать дерградацию наглядно еще раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2016, 14:31 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39323806&tid=1887259]: |
0ms |
get settings: |
5ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
168ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
37ms |
get tp. blocked users: |
1ms |
| others: | 202ms |
| total: | 434ms |

| 0 / 0 |
