c# - 使用 Dapper 和 Oracle 的奇怪 SQL 性能问题

标签 c# oracle11g ado.net dapper

我和 Dapper 玩得很开心,在这之前没有遇到任何实际问题,这让我发疯。

给定对包内 Oracle 方法的调用

begin
  package.method(in_table => :in_table,
                 in_clob_type => :in_clob_type,
                 out_error_table => :out_error_table);
end;
  • 从 PL/SQL 开发人员或它需要的任何其他 Oracle 工具中 约2秒运行。
  • 在标准 C# 控制台测试应用中 大约需要2-3 秒。
  • 从 IIS 托管的 WebAPI 应用程序中 大约需要10-12 秒。

相同的 SQL、相同的参数、相同的数据库和相同的用户。应用程序中的所有其他 SQL 都可以完美运行

var errorTable = string.Empty;
var parameters = new DynamicParameters();

parameters.Add("in_table", "table-name");
parameters.Add("in_clob_type", 0);
parameters.Add("out_error_table", dbType: DbType.String, size: 32, direction: ParameterDirection.Output);

db.Query("package.nethod", parameters, commandType: CommandType.StoredProcedure);

// Query or Execute makes no difference
// db.Execute"package.nethod", parameters, commandType: CommandType.StoredProcedure);

errorTable = parameters.Get<string>("out_error_table");

有人对调试此问题的最佳方法有任何想法吗?

更新 1:

WebAPI 和控制台代码都为包函数中的插入和更新过程生成 1708 个不同的 SQL 语句。只是 SQL 调用之间需要更长的时间,但我还看不到模式。

更新 2:

深入挖掘,而不是我的代码,所以它需要更长的时间,发现一个创建一些临时表的调用,我们将过程所需的数据加载到这些临时表中。如果我将其注释掉并仅提供现有表名,则需要 2-3 秒。

创建表的过程中似乎有什么东西阻碍了其余的过程?如果我将所有方法标记为 PRAGMA AUTONOMOUS_TRANSACTION 10-12 秒。如果我在特定或共享事务中或之外创建表,需要 10-12 秒。如果我在没有事务的情况下创建它们,需要 10-12 秒。

最佳答案

我无法弄清楚为什么表创建会导致过程中出现任何形式的延迟,事实上,考虑到表的非常简单的性质,我看不到任何可能的方法,所以我采用了不同的方法方向。

我没有在用户模式中创建临时表,而是将表创建为标记为 ON COMMIT DELETE ROWS 的全局临时表。

现在一切都按预期在 2 秒或更短的时间内运行:-)

感谢您的所有帮助,如果您对延迟有任何想法,请随时分享。

关于c# - 使用 Dapper 和 Oracle 的奇怪 SQL 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37265340/

相关文章:

c# - 如何将对象类型转换为 float ,其中对象可以是任何类型的数字,如 int、long、float、double 等

c# - 如何调用具有空属性名称的对象属性?

c# - SQL 从查询中检测无效的列名

oracle - TransactionScope 和存储过程?

c# - 如何 ping 网站并在 gridview 中显示状态

entity-framework-4 - 带有 oracle 插入父级和子级的 Entity Framework

sql - Oracle表中分母最小公倍数的计算

java - 如何在 java 中创建具有来自 3 个表的记录的数据结构?

c# - 如何在更改数据库后保存数据集?

c# - 这个公共(public)异步方法有什么用?它是如何使用的?