C# 准备好的语句与带有RefCursor的存储过程
我一直在调用在我的C#应用程序中返回RefCursors的Oracle存储过程。下面给出了一个示例存储过程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读取该过程的结果时,每次调用该过程时,数据库都会解析
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代码一样解析查询
如果需要发出完全相同的查询(只需更改参数),则可以重用命令对象,而无需额外的解析调用。但是,这些解析将是软解析,因此性能可能不明显(大部分工作是在硬解析中完成的,即数据库第一次遇到查询时)。由于查询返回大量行,因此与实际获取这些行所需的工作量相比,软解析所涉及的工作量当然可以忽略不计。是的,我做了此更改,现在我的语句没有解析那么多。是的,在实际代码中,我重用了我的命令对象。谢谢你的回复。