【发布时间】:2011-09-09 19:26:00
【问题描述】:
我一直在调用在我的 C# 应用程序中返回 RefCursors 的 Oracle 存储过程。下面给出了一个示例存储过程。
CREATE OR REPLACE
PROCEDURE "DOSOMETHING"(
P_RECORDS OUT SYS_REFCURSOR)
AS
BEGIN
OPEN P_RECORDS FOR
SELECT SOMETHING FROM SOMETABLE;
END;
当使用OracleDataReader 读取结果时,每次调用该过程时,数据库都会解析该过程。经过大量搜索后,我发现使用RefCursor 时,.NET 无法消除此解析调用。
但是,如果我只使用如下准备好的语句调用该过程,则可以避免此解析调用。
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();
}
}
}
我的问题是,这些方法中的哪一种对性能的影响最小?将过程更改为准备好的语句以避免解析调用会对应用程序性能产生更大的负面影响吗?
请注意,这些选择语句可能会返回大量结果。可能有数千行。
【问题讨论】:
标签: c# .net performance oracle oracle11g