| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Oracle > Как увелиить производительность PL/SQL скрипта |
| Автор: WolfON 15.7.2004, 12:44 |
| Нужны слветы по сабжу. |
| Автор: LSD 15.7.2004, 20:10 |
| Oracle писал, что производительность хранимых процедур написанных на Java по сравнению с процедурами PL/SQL, при использовании SQL запросов выше на 30-40%, без в 10-12 раз. Есть еще вариант с использованием процедур написанных на Си. Но если основное время занимают SQL запросы, то надо оптимизировать в первую очередь их. |
| Автор: <Spawn> 16.7.2004, 05:00 |
| Ты скрипт то покажи. Может ты написал неэффективный код. |
| Автор: WolfON 19.7.2004, 10:18 |
| DECLARE CURSOR c_oper (x NUMBER) IS SELECT log_id, user_id, object_code, operation_code, operation_date, pkey FROM log_operations WHERE log_id = x; v_c_oper c_oper%ROWTYPE; CURSOR c_field (x NUMBER) IS SELECT field, old_value, new_value FROM log_fields WHERE log_id = x ORDER BY log_field_id; v_c_temp c_field%ROWTYPE; BEGIN <<main_loop>> FOR c_log IN (SELECT log_id, user_id, date_chg, operation_code, object_code, data_id, chgs FROM loggin WHERE ROWNUM < 101) LOOP OPEN c_oper (c_log.log_id); OPEN c_field (c_log.log_id); FETCH c_oper INTO v_c_oper; <<nested_table_loop>> FOR cntr IN 1 .. c_log.chgs.LAST LOOP FETCH c_field INTO v_c_temp; IF c_log.chgs (cntr).field_name != v_c_temp.field OR c_log.chgs (cntr).old_value != v_c_temp.old_value OR c_log.chgs (cntr).new_value != v_c_temp.new_value THEN INSERT INTO err_log VALUES ( 'Error in nested table. Log_id: ' || TO_CHAR (c_log.log_id) || ' | ' || v_c_temp.field || ',' || v_c_temp.old_value || ',' || v_c_temp.new_value || ' | ' || c_log.chgs (cntr).field_name || ',' || c_log.chgs (cntr).old_value || ',' || c_log.chgs (cntr).new_value ); EXIT nested_table_loop; END IF; END LOOP nested_table_loop; IF v_c_oper.user_id != c_log.user_id OR v_c_oper.object_code != c_log.object_code OR v_c_oper.operation_code != c_log.operation_code OR v_c_oper.operation_date != c_log.date_chg OR v_c_oper.pkey != c_log.data_id THEN INSERT INTO err_log VALUES ( 'Error in main table. Log_id: ' || TO_CHAR (c_log.log_id) ); EXIT main_loop; END IF; CLOSE c_oper; CLOSE c_field; END LOOP main_loop; COMMIT; END; / |