Я вызываю хранимые процедуры Oracle, которые возвращают RefCursors в моем приложении C #. Пример хранимой процедуры приведен ниже.
CREATE OR REPLACE
PROCEDURE "DOSOMETHING"(
P_RECORDS OUT SYS_REFCURSOR)
AS
BEGIN
OPEN P_RECORDS FOR
SELECT SOMETHING FROM SOMETABLE;
END;
При использовании OracleDataReader
для чтения результатов для этого, каждый раз, когда процедура вызывается, база данных анализирует процедуру. После долгих поисков я обнаружил, что с помощью .NET при использовании RefCursor
.
исключить этот вызов синтаксического анализа невозможно.
Однако, если я просто вызову процедуру с использованием подготовленного оператора, как показано ниже, этого вызова синтаксического анализа можно избежать.
public void DoSomething()
{
var command = ServerDataConnection.CreateCommand();
command.CommandType = CommandType.Text;
command.CommandText = "SELECT SOMETHING FROM SOMETABLE";
command.Prepare();
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
DoSomethingToResult();
}
}
}
Мой вопрос: какой из этих методов окажет минимальное влияние на производительность? Повлияет ли изменение процедур на подготовленные операторы во избежание вызовов синтаксического анализа еще более негативно на производительность приложения?
Обратите внимание, что эти операторы выбора могут возвращать большой набор результатов. Возможно тысячи строк.