2016-05-17 81 views
2

我和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秒。

+0

当您报告10-12秒时,您是否仅仅执行了Dapper代码或整个WebAPI调用? –

+0

使用直接位于实际的db.Query或Execute调用之前和之后的秒表对象。 – PoweredByPorkers

+0

控制台应用程序,你也使用DAPPER?查询有多复杂? –

回答

0

我无法弄清楚为什么表创建会导致过程中的任何滞后,事实上我没有看到任何可能的方式,它可以给出表的非常简单的性质,所以我去了不同的方向。

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

现在一切都以2秒或更少正在按预期运行:-)

感谢您的帮助,如果你找到一个滞后的任何想法,那么请随时分享。