Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 准备好的语句与带有RefCursor的存储过程_C#_.net_Performance_Oracle_Oracle11g - Fatal编程技术网

C# 准备好的语句与带有RefCursor的存储过程

C# 准备好的语句与带有RefCursor的存储过程,c#,.net,performance,oracle,oracle11g,C#,.net,Performance,Oracle,Oracle11g,我一直在调用在我的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读取该过程的结果时,每次调用该过程时,数据库都会解析

我一直在调用在我的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();
        }
    }
}
我的问题是,这些方法中哪一种对性能的影响最小?将过程更改为预处理语句以避免解析调用会对应用程序性能产生更负面的影响吗


请注意,这些select语句可以返回大量结果。可能有数千行

在PL/SQL中使用ref游标将在每次打开游标时引发解析调用。每次调用
command.Prepare()
时都会发出相同的解析调用。现在,您的.NET代码将像解析PL/SQL代码一样解析查询


如果需要发出完全相同的查询(只需更改参数),则可以重用命令对象,而无需额外的解析调用。但是,这些解析将是软解析,因此性能可能不明显(大部分工作是在硬解析中完成的,即数据库第一次遇到查询时)。由于查询返回大量行,因此与实际获取这些行所需的工作量相比,软解析所涉及的工作量当然可以忽略不计。

是的,我做了此更改,现在我的语句没有解析那么多。是的,在实际代码中,我重用了我的命令对象。谢谢你的回复。