|
|
|
Задача. Классификация строк по шаблону
|
|||
|---|---|---|---|
|
#18+
Дано: Есть таблица А, которая содержит помимо прочих поле str_numb varchar2(16), в строке только цифры. Примерный объём таблицы ~ 10 млн строк, под условие выборки попадают ~ 1 млн. Каждой такой строке нужно поставить в соответствие ТИП, который описывается набором шаблонов вида ????*???, например для 1234*099 подходит 1234111111111099. Шаблоны хранятся в таблице S (~ 100 строк): тип; набор шаблонов, который можно описать удобным способом (возможны варианты). Необходимо: Для каждой строки (~ 1 млн) определить тип (предполагаем, что подойдёт только 1). Простое решение: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Решение подходит, но есть проблемы: 1 - основная: Производительность - 10-ки минут. 2 - У regexp_like ограничение на длину строки (шаблона) 512 байт - может не уместиться. Прошу помочь с более оптимальным решением. Способ описания шаблона можно менять, можно добавлять индексы и другие вспомогательные объекты. Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2013, 20:59 |
|
||
|
Задача. Классификация строк по шаблону
|
|||
|---|---|---|---|
|
#18+
все ли шаблоны такого типа ????*??? ? лучше использовать substr() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2013, 22:30 |
|
||
|
Задача. Классификация строк по шаблону
|
|||
|---|---|---|---|
|
#18+
Regexp_likeСпособ описания шаблона можно менятьСудя по шаблону, интересуют строки состоящие из цифр, где первые и последние четыре цифры определены. В таком случае можно шаблон составлять из набора строк (1 тип - несколько строк), состоящих из 8 цифр и в условии соединения: Код: plsql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2013, 22:54 |
|
||
|
Задача. Классификация строк по шаблону
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopRegexp_likeСпособ описания шаблона можно менятьСудя по шаблону, интересуют строки состоящие из цифр, где первые и последние четыре цифры определены. В таком случае можно шаблон составлять из набора строк (1 тип - несколько строк), состоящих из 8 цифр и в условии соединения: Код: plsql 1. если в каждой маске ровно по три штуки (или не более трех), то, возможно, лучше не бить на строки, а сделать три поля с шаблонами и написать тройную проверку ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2013, 23:02 |
|
||
|
Задача. Классификация строк по шаблону
|
|||
|---|---|---|---|
|
#18+
а если задача выполняется часто, то лучше сделать FBI или вычисляемые поля для - substr(a.str_numb,1,4) - substr(a.str_numb,-4) - translate(a.str_numb,'_1234567890','_') is null ну и каждый шаблон вида ^3330\d+0300$ тоже разбить на части - на 3330 и на 0300 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2013, 23:07 |
|
||
|
Задача. Классификация строк по шаблону
|
|||
|---|---|---|---|
|
#18+
В топорном виде - для 8-ки или 9-ки, без FBI и с доп. полями, это выглядело бы так: добавляем в А два поля: start_A и end_A в триггере, если все число - цифры, заполняем start_A первыми цифрами, end_A - последними в противном случае - Null-ами и индексируем эти поля И в конце обычный самый джойн Еснно, это если шаблоны действительно вида 9999%9999 и других не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2013, 23:13 |
|
||
|
Задача. Классификация строк по шаблону
|
|||
|---|---|---|---|
|
#18+
andreymxв триггере, если все число - цифры , заполняем start_A первыми цифрами, end_A - последними сорри если вся строка - цифры ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2013, 23:17 |
|
||
|
Задача. Классификация строк по шаблону
|
|||
|---|---|---|---|
|
#18+
andreymxесли в каждой маске ровно по три штуки (или не более трех), то, возможно, лучше не бить на строки, а сделать три поля с шаблонами и написать тройную проверкуТройная проверка в лучшем случае сделает возможным hash join развернутый в concatenation. А это уже усложнение. andreymxа если задача выполняется часто, то лучше сделать FBI или вычисляемые поляНе вижу смысла, если надо проверить ВСЕ строки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2013, 23:30 |
|
||
|
Задача. Классификация строк по шаблону
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopandreymxа если задача выполняется часто, то лучше сделать FBI или вычисляемые поляНе вижу смысла, если надо проверить ВСЕ строки.меньше вычислительных операций однозначно взлетит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2013, 23:41 |
|
||
|
Задача. Классификация строк по шаблону
|
|||
|---|---|---|---|
|
#18+
Не увидел пока подходящего варианта, хотя возможно не понял их. Уточню условия: 1) Все шаблоны пока одинаковые (9999%999 или ????*???). Но потенциально могут появится и другие схожие (настройка может менятся и поэтому вынесена). С этой т.з. regexp_like идеально подходит. 2) Для 1 типа может быть произвольное их количество (потому есть проблема по длине regexp_like). 3) Обязательное условие: 1 тип - 1 строка шаблонов. 4) Допустимо использование динамического SQL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 00:13 |
|
||
|
Задача. Классификация строк по шаблону
|
|||
|---|---|---|---|
|
#18+
Regexp_likeНе увидел пока подходящего варианта, хотя возможно не понял их. Уточню условия: 1) Все шаблоны пока одинаковые (9999%999 или ????*???). Но потенциально могут появится и другие схожие (настройка может менятся и поэтому вынесена). С этой т.з. regexp_like идеально подходит. 2) Для 1 типа может быть произвольное их количество (потому есть проблема по длине regexp_like). 3) Обязательное условие: 1 тип - 1 строка шаблонов. 4) Допустимо использование динамического SQL.Если известно максимальное число символов шаблона в начале строки и в конце, то можешь использовать мой подход. regexp_like - это, конечно, красиво, но это только nested loops и сильная загрузка CPU. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 16:17 |
|
||
|
Задача. Классификация строк по шаблону
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopЕсли известно максимальное число символов шаблона в начале строки и в конце, то можешь использовать мой подход. Есть условие: 3) Обязательное условие: 1 тип - 1 строка шаблонов. Предлагаешь транспонировать в запросе строку из настройки, чтобы разнести по разным строкам каждый отдельный шаблон? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2013, 18:30 |
|
||
|
Задача. Классификация строк по шаблону
|
|||
|---|---|---|---|
|
#18+
Regexp_like, шаблоны ваши легко переписываются для использования с (обычным) like . имхо, это всё решит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2013, 18:53 |
|
||
|
Задача. Классификация строк по шаблону
|
|||
|---|---|---|---|
|
#18+
Regexp_likeЕсть условие: 3) Обязательное условие: 1 тип - 1 строка шаблонов.никто не мешает сделать мастер-деталь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2013, 19:43 |
|
||
|
Задача. Классификация строк по шаблону
|
|||
|---|---|---|---|
|
#18+
Regexp_likedbms_photoshopЕсли известно максимальное число символов шаблона в начале строки и в конце, то можешь использовать мой подход. Есть условие: 3) Обязательное условие: 1 тип - 1 строка шаблонов. Предлагаешь транспонировать в запросе строку из настройки, чтобы разнести по разным строкам каждый отдельный шаблон?Если поставлено требование "1 тип - 1 строка шаблонов" - никто ведь не запрещает в базе хранить в таком виде, как удобно разработчику? Даже если и запрещает, то модифицируй на лету. Как я уже сказал, всякие regexp_like, like - это всегда nested loops, что при более менее заметном числе шаблонов приводит к большим проблемам. Код: plsql 1. 2. 3. 4. 5. 6. Код: 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. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. Для полноты картины, оригинальный подход Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2013, 01:04 |
|
||
|
Задача. Классификация строк по шаблону
|
|||
|---|---|---|---|
|
#18+
Итоговый приемлемый вариант пока - транспонирование настройки + substr. Отлично по условиям подходил вариант транспонирования + like (чтобы настройку записывать в формате like), но like в моем случае оказался на несколько порядков медленнее substr. Но при этом имеем жёсткий формат записи настройки. Запрос примерно такой: Код: 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. Всем спасибо, особенно dbms_photoshop! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2013, 12:12 |
|
||
|
|

start [/forum/topic.php?fid=52&gotonew=1&tid=1900062]: |
0ms |
get settings: |
6ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
31ms |
get topic data: |
8ms |
get first new msg: |
5ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 205ms |
| total: | 317ms |

| 0 / 0 |
