使用 Dapper 和 Oracle 时出现奇怪的 SQL 性能问题
Strange SQL performance issue using Dapper & Oracle
我和 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:
深入挖掘,而不是我的代码,所以它需要更长的时间,发现一个创建一些临时 tables 的调用,我们将过程所需的数据加载到其中。如果我将其注释掉并仅提供现有的 table 名称,则需要 2-3 秒。
tables 的创建过程中似乎有什么东西阻碍了其余的进程?如果我标记所有方法 PRAGMA AUTONOMOUS_TRANSACTION 10-12 秒。如果我在特定或共享事务中或之外创建 tables,需要 10-12 秒。如果我在没有交易的情况下创建它们 10-12 秒。
我不明白为什么 table 的创建会在流程中造成任何形式的延迟,事实上,考虑到 tables,所以我转向了不同的方向。
我没有在用户模式中创建临时 tables,而是将 tables 创建为全局临时 tables,标记为 ON COMMIT DELETE ROWS。
现在,一切都在 2 秒或更短的时间内完成 运行 :-)
感谢您的帮助,如果您对延迟有任何想法,请随时分享。
我和 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:
深入挖掘,而不是我的代码,所以它需要更长的时间,发现一个创建一些临时 tables 的调用,我们将过程所需的数据加载到其中。如果我将其注释掉并仅提供现有的 table 名称,则需要 2-3 秒。
tables 的创建过程中似乎有什么东西阻碍了其余的进程?如果我标记所有方法 PRAGMA AUTONOMOUS_TRANSACTION 10-12 秒。如果我在特定或共享事务中或之外创建 tables,需要 10-12 秒。如果我在没有交易的情况下创建它们 10-12 秒。
我不明白为什么 table 的创建会在流程中造成任何形式的延迟,事实上,考虑到 tables,所以我转向了不同的方向。
我没有在用户模式中创建临时 tables,而是将 tables 创建为全局临时 tables,标记为 ON COMMIT DELETE ROWS。
现在,一切都在 2 秒或更短的时间内完成 运行 :-)
感谢您的帮助,如果您对延迟有任何想法,请随时分享。