gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:04:21 29 4
gpt4 key购买 nike

我一直在调用在我的 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();
}
}
}

我的问题是,这些方法中哪种方法对性能的影响最小?将过程更改为准备好的语句以避免解析调用会对应用程序性能产生更大的负面影响吗?

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

最佳答案

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

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

关于c# - 准备好的语句与带有 RefCursor 的存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6261167/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com