我和Dapper在一起度过了美好的时光,并没有真正的问题到这个问题,这让我很生气。使用Dapper和Oracle的奇怪的SQL性能问题
鉴于这种呼叫到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");
任何人都有关于调试的最佳方法的任何想法?
UPDATE 1:
两者的WebAPI和控制台代码产生用于包功能中插入和更新处理1708个不同的SQL语句。 SQL调用之间只需要更长的时间,但我目前还看不到一个模式。
更新2:
进一步挖掘,不是我的代码,所以它采取了一会儿,发现创建为我们加载过程中所需的数据有些临时表的调用。如果我评论这一点,只提供一个现有的表名,2-3秒。
创建表中的某些东西似乎阻塞了过程的其余部分?如果我标记所有方法PRAGMA AUTONOMOUS_TRANSACTION 10-12秒。如果我在特定或共享事务中创建表格,则需要10-12秒。如果我在没有交易的情况下创建它们10-12秒。
当您报告10-12秒时,您是否仅仅执行了Dapper代码或整个WebAPI调用? –
使用直接位于实际的db.Query或Execute调用之前和之后的秒表对象。 – PoweredByPorkers
控制台应用程序,你也使用DAPPER?查询有多复杂? –