У нас возникли серьезные проблемы с производительностью при выполнении запросов SELECT из одной из наших баз данных. См. простую процедуру и соответствующий код ниже.
В коде метод ExecuteReader() выполняется примерно за 10 секунд для запроса, возвращающего 30 тысяч записей. Итерация Reader занимает 2 минуты (даже если я не перекачиваю данные ни в какой другой объект). 2 минуты для набора данных из 30 тыс. строк для нас неприемлемы, поскольку мы ожидаем, что наборы данных будут исчисляться миллионами.
Есть ли здесь что-то, что выделяется для кого-либо из вас? Надеюсь, что ваш опыт работы с ODP.NET и PL/SQL может помочь.
create or replace PROCEDURE TRACKING_FETCH (
p_tracking_id IN NUMBER,
p_parent_id IN NUMBER,
p_media_id IN NUMBER,
p_custodian_id IN NUMBER,
p_return_cursor OUT SYS_REFCURSOR)
AS
BEGIN
OPEN p_return_cursor FOR
SELECT
*
FROM
tracking
WHERE
(tracking_id = p_tracking_id OR p_tracking_id = 0)
AND (parent_id = p_parent_id OR p_parent_id = 0)
AND (media_id = p_media_id OR p_media_id = 0)
AND (custodian_id = p_custodian_id OR p_custodian_id = 0);
END TRACKING_FETCH;
--
using (DataFactory command
= new DataFactory(dbConnection,
DatabaseType.Oracle,
CommandType.StoredProcedure,
"TRACKING_FETCH"))
{
command.AddInParameter("p_tracking_id", DbType.Int32, trackingid);
command.AddInParameter("p_parent_id", DbType.Int32, parentid);
command.AddInParameter("p_media_id", DbType.Int32, mediaid);
command.AddInParameter("p_custodian_id", DbType.Int32, custodianid);
using (var dr = command.ExecuteReader())
{
while (dr.Read())
{
//Do Things...
}
}
}
Любое руководство будет принято с благодарностью.