У нас есть приложение-гиперион, источником которого является Oracle EBS.У нас есть пакет oracle, который извлекает данные из комбинации таблиц Oracle EBS и выгружает их в приложение hyperion.Сейчас мы пытаемся повторить ту же функциональность пакета oracle через интегрированный jython, но сталкиваемся с проблемами производительности
Существующий пакет oracle следует следующей структуре:
- курсор для выбора всехдействительные идентификаторы заголовка GL и идентификаторы строк
CURSOR gl_ (
period VARCHAR2,
cat VARCHAR2,
source VARCHAR2
)
IS
SELECT p_header_id , p_line_num …...
- курсор для извлечения данных по этим действительным идентификаторам заголовков и номерам строк
CURSOR ytd_val (p_header_id NUMBER, p_line_num NUMBER)
IS SELECT …..
- циклическое перемещение по курсорам и вставка данныхв таблице
FOR i IN gl_ (v_period_name, v_category, v_source)
LOOP
FOR j IN ytd_ (i.je_header_id, i.je_line_num)
LOOP
accounted_dr := 0;
accounted_cr := 0;
IF j.amount >= 0
THEN
accounted_dr := ABS (j.amount);
ELSE
accounted_cr := ABS (j.amount);
END IF;
INSERT INTO hyp_ytd_data ……
- REPLICATION IN JYTHON
from __future__ import with_statement
from com.ziclix.python.sql import zxJDBC
import csv
from timeit import default_timer as timer
-- setting connection
try :
conn = zxJDBC.connect("<connection details>")
cursor = conn.cursor()
fdmAPI.logDebug("Connection successfully created")
except :
fdmAPI.logDebug("Connection not successfull")
--cursor to get the valid head lines and je lines
cursor.execute("""SELECT je_header_id, je_line_num .....)
itr = cursor.fetchall()
conn.close()
i = 1
--getting relevant data against these valid gl headers and lines
for x in itr:
start = timer()
conn2 = zxJDBC.connect(
cursor2 = conn2.cursor()
cursor2.execute("<DATA QUERY>")
itr2 = cursor2.fetchall()
end = timer()
-- to check the time taken by each iteration
fdmAPI.logDebug("Time for Iteration:%s is %s" % (i, str(end - start)))
i = i + 1
with open("D:/test_cursor.csv", 'a') as myfile:
wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
wr.writerow(itr2)
conn2.close()
Разница во времени значительна.В то время как код оракула занимает всего около 10 минут, код Jython занимает 3 часа и более.Не уверен, где я могу пойти не так здесь.Пожалуйста, помогите.
Спасибо, Дев