|
|
|
Процедура проверки вхождения в таблицы- как ускорить?
|
|||
|---|---|---|---|
|
#18+
Есть процедура на PL/SQL задача которой проверить наличие записей в 3 других таблицах с таким же id. Вызов процедуры осуществляется следующим образом: declare cursor cur is select id from table1; begin for i in cur loop proc1(id); end loop; end; table1 может содержать от 1000 до 30 млн записей (обновляется периодически полностью). Есть 3 другие таблицы, содержащие те же id, что и table1. логика работы proc1 следующая: 1. Проверить наличие записи с table1.id в table2, если такая запись есть, то в результирующую таблица table_result пишется результат (id,'есть в table2') 2. Если в table2 нет записи с table1.id идем проверять в table3, если такая запись есть, то в результирующую таблица table_result пишется результат (id,'есть в table3') 3. Если в table3 нет записи с table1.id идем проверять в table4, если такая запись есть, то в результирующую таблица table_result пишется результат (id,'есть в table4') 4. Если в table4 нет записи с table1.id идем проверять, то в результирующую таблица table_result пишется результат (id,'нет нигде') размер таблиц примерно: table2 - 55 млн записей table3 - 2 млн записей table4 - 7 млн записей Для 300 тыс записей в table1 процедура работает порядка 10 мин, а хочется чтобы это укладывалось в десятки секунд, т.е. чтобы скорость была порядка 10 тыс записей в секунду. Каким образом можно кардинально ускорить работы процедуры? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2018, 18:07 |
|
||
|
Процедура проверки вхождения в таблицы- как ускорить?
|
|||
|---|---|---|---|
|
#18+
DimetsКаким образом можно кардинально ускорить работы процедуры? Если содержимое table1 можно уничтожить после работы, то выкинуть функцию и использовать MERGE. Если нельзя - придётся искать где же ты облажался при реализации простой логики. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2018, 18:17 |
|
||
|
Процедура проверки вхождения в таблицы- как ускорить?
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovDimetsКаким образом можно кардинально ускорить работы процедуры? Если содержимое table1 можно уничтожить после работы, то выкинуть функцию и использовать MERGE. Если нельзя - придётся искать где же ты облажался при реализации простой логики. table1 уничтожить нельзя(( запросы по table2,table3,table4 выполняются за 3-5 мс в каждой ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2018, 18:25 |
|
||
|
Процедура проверки вхождения в таблицы- как ускорить?
|
|||
|---|---|---|---|
|
#18+
Dimetsзапросы по table2,table3,table4 выполняются за 3-5 мс в каждой А для скорости в 10000 записей в секунду они должны выполняться по 0,1-0,03 мс. Почувствуй разницу. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2018, 18:29 |
|
||
|
Процедура проверки вхождения в таблицы- как ускорить?
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovDimetsзапросы по table2,table3,table4 выполняются за 3-5 мс в каждой А для скорости в 10000 записей в секунду они должны выполняться по 0,1-0,03 мс. Почувствуй разницу. И как обеспечить такую скорость выполнения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2018, 18:33 |
|
||
|
Процедура проверки вхождения в таблицы- как ускорить?
|
|||
|---|---|---|---|
|
#18+
Dimetsлогика работы proc1 следующая: 1. Проверить наличие записи с table1.id в table2, если такая запись есть, то в результирующую таблица table_result пишется результат (id,'есть в table2') 2. Если в table2 нет записи с table1.id идем проверять в table3, если такая запись есть, то в результирующую таблица table_result пишется результат (id,'есть в table3') 3. Если в table3 нет записи с table1.id идем проверять в table4, если такая запись есть, то в результирующую таблица table_result пишется результат (id,'есть в table4') 4. Если в table4 нет записи с table1.id идем проверять, то в результирующую таблица table_result пишется результат (id,'нет нигде') Каким образом можно кардинально ускорить работы процедуры? Зависит от. К примеру, можно так (insert или merge - по потребности, индексы по id на всех таблицах - обязательны): Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. Если индексов нет, но есть много памяти и уверенность в уникальности id - можно внешние hash join-ы и выбирать результат тем же coalesce в стиле: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Этот вариант, при наличии навыков, можно еще и параллелить. Также можно попробовать самовыразиться на ANSI: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. но тут лучше иметь индексы по t3, t4 Если же требуется именно процедурой и именно построчно - то Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2018, 19:03 |
|
||
|
Процедура проверки вхождения в таблицы- как ускорить?
|
|||
|---|---|---|---|
|
#18+
DimetsИ как обеспечить такую скорость выполнения? Процедурой? Никак. Зато можно воспользоваться dbms_parallel_execute. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2018, 19:05 |
|
||
|
Процедура проверки вхождения в таблицы- как ускорить?
|
|||
|---|---|---|---|
|
#18+
А триггер не поможет? Тогда и процедуру вызывать не нужно - результат всегда готов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2018, 19:35 |
|
||
|
Процедура проверки вхождения в таблицы- как ускорить?
|
|||
|---|---|---|---|
|
#18+
KOT MATPOCKuH, Та же проблема что и с процедурой, для каждой строки выполняется несколько отдельных DML операций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2018, 20:11 |
|
||
|
Процедура проверки вхождения в таблицы- как ускорить?
|
|||
|---|---|---|---|
|
#18+
Как вариант, добавить поле в table1 и прогнать три update, накатывая последовательно table4, table3, table2. Строку 'есть в table2/3/4' заменить на код 2,3,4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2018, 20:15 |
|
||
|
Процедура проверки вхождения в таблицы- как ускорить?
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousDimetsИ как обеспечить такую скорость выполнения? Процедурой? Никак. Зато можно воспользоваться dbms_parallel_execute. В какой части воспользоваться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2018, 23:25 |
|
||
|
Процедура проверки вхождения в таблицы- как ускорить?
|
|||
|---|---|---|---|
|
#18+
KOT MATPOCKuHА триггер не поможет? Тогда и процедуру вызывать не нужно - результат всегда готов не поможет(( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2018, 23:26 |
|
||
|
Процедура проверки вхождения в таблицы- как ускорить?
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousDimetsлогика работы proc1 следующая: 1. Проверить наличие записи с table1.id в table2, если такая запись есть, то в результирующую таблица table_result пишется результат (id,'есть в table2') 2. Если в table2 нет записи с table1.id идем проверять в table3, если такая запись есть, то в результирующую таблица table_result пишется результат (id,'есть в table3') 3. Если в table3 нет записи с table1.id идем проверять в table4, если такая запись есть, то в результирующую таблица table_result пишется результат (id,'есть в table4') 4. Если в table4 нет записи с table1.id идем проверять, то в результирующую таблица table_result пишется результат (id,'нет нигде') Каким образом можно кардинально ускорить работы процедуры? Зависит от. К примеру, можно так (insert или merge - по потребности, индексы по id на всех таблицах - обязательны): Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. Если индексов нет, но есть много памяти и уверенность в уникальности id - можно внешние hash join-ы и выбирать результат тем же coalesce в стиле: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Этот вариант, при наличии навыков, можно еще и параллелить. Также можно попробовать самовыразиться на ANSI: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. но тут лучше иметь индексы по t3, t4 Если же требуется именно процедурой и именно построчно - то Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Индексы есть такие везде. Попробовал вариант с coalesce, ускорение есть, но не на порядок как требуется ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2018, 23:46 |
|
||
|
Процедура проверки вхождения в таблицы- как ускорить?
|
|||
|---|---|---|---|
|
#18+
declare cursor cur is select id from table1; begin for i in cur loop proc1(id); end loop; end; Можно ли каким то образом сделать несколько параллельных вызовов proc1, например 10 шт, каждая из которых будет запускаться со своим уникальным id? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 09:40 |
|
||
|
Процедура проверки вхождения в таблицы- как ускорить?
|
|||
|---|---|---|---|
|
#18+
DimetsМожно ли каким то образом сделать несколько параллельных вызовов proc1, например 10 шт, каждая из которых будет запускаться со своим уникальным id?Можно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 09:47 |
|
||
|
Процедура проверки вхождения в таблицы- как ускорить?
|
|||
|---|---|---|---|
|
#18+
ElicDimetsМожно ли каким то образом сделать несколько параллельных вызовов proc1, например 10 шт, каждая из которых будет запускаться со своим уникальным id?Можно. А пример подскажите? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 09:52 |
|
||
|
Процедура проверки вхождения в таблицы- как ускорить?
|
|||
|---|---|---|---|
|
#18+
А всё-таки, что у вас в proc1 такого внутри страшного ? Я накидал синтетический тест, при миллионе записей в table1 и при 70 миллионах в table2 даже ваша построчная обработка обрабатывает около 10-12 тыс записей в секунду. То-ли индексы у вас кривые, то-ли проверяется в реальности не число, а какая-нибудь строка LIKE-ом то ли всё время уходит на вставку в table_result (попробовать накапливать и BULK-ами скидывать) ощущение, что где-то в proc1 в логике косяк и в циклах делаются ненужные вещи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 10:03 |
|
||
|
Процедура проверки вхождения в таблицы- как ускорить?
|
|||
|---|---|---|---|
|
#18+
anvanoи в циклах делаются ненужные вещиНапример, оптимизированный fetch по 100. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 10:12 |
|
||
|
Процедура проверки вхождения в таблицы- как ускорить?
|
|||
|---|---|---|---|
|
#18+
DimetsА пример подскажите?Экстенсификация - это тупиковый путь развития. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 10:18 |
|
||
|
Процедура проверки вхождения в таблицы- как ускорить?
|
|||
|---|---|---|---|
|
#18+
anvanoА всё-таки, что у вас в proc1 такого внутри страшного ? Я накидал синтетический тест, при миллионе записей в table1 и при 70 миллионах в table2 даже ваша построчная обработка обрабатывает около 10-12 тыс записей в секунду. То-ли индексы у вас кривые, то-ли проверяется в реальности не число, а какая-нибудь строка LIKE-ом то ли всё время уходит на вставку в table_result (попробовать накапливать и BULK-ами скидывать) ощущение, что где-то в proc1 в логике косяк и в циклах делаются ненужные вещи. Ничего страшного там по сути нет, вот такой запрос там идет и потом Insert select coalesce( (select 'TBL2' x from dual where exists (select null from table2@y where rid = p_rid and aid=p_aid and cid=p_cid)) , (select 'TBL3' x from dual where exists (select null from table3@y where rid = p_rid and aid=p_aid)) , (select 'TBL4' x from dual where exists (select null from table4@y where rid = p_rid and aid=p_aid)) , 'NA' ) into l_check_result_code from dual; вызов процедуры: declare cursor cur is select rid, aid from table1; begin for i in cur loop proc1(i.rid,i.aid,1); --1 это p_cid end loop; end; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 11:14 |
|
||
|
Процедура проверки вхождения в таблицы- как ускорить?
|
|||
|---|---|---|---|
|
#18+
Dimets Код: plsql 1. Вот и корень зла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 11:16 |
|
||
|
Процедура проверки вхождения в таблицы- как ускорить?
|
|||
|---|---|---|---|
|
#18+
ElicDimets Код: plsql 1. Вот и корень зла. провел эксперимент скопировав таблицы в свою схему Итого при следующих параметрах: table1 - 281 065 records table2 - 24 999 999 records table3 - 2 434 885 records table4 - 7 289 199 records Время работы - 00:02:22.827602, примерно 281065/144 = 1951 rec per sec затем убрал Insert в proc1 и время стало 26 сек - 281065/26 = 10810 rec per sec Вот без insert это приемлемое время, что с этим можно поделать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 11:50 |
|
||
|
Процедура проверки вхождения в таблицы- как ускорить?
|
|||
|---|---|---|---|
|
#18+
DimetsElicпропущено... Вот и корень зла. провел эксперимент скопировав таблицы в свою схему Итого при следующих параметрах: table1 - 281 065 records table2 - 24 999 999 records table3 - 2 434 885 records table4 - 7 289 199 records Время работы - 00:02:22.827602, примерно 281065/144 = 1951 rec per sec затем убрал Insert в proc1 и время стало 26 сек - 281065/26 = 10810 rec per sec Вот без insert это приемлемое время, что с этим можно поделать? индексы есть на всех таблицах table2,table3,table4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 11:56 |
|
||
|
|

start [/forum/topic.php?fid=52&tid=1883291]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
174ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
| others: | 245ms |
| total: | 508ms |

| 0 / 0 |
