Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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;
/

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)