Extraño problema de rendimiento de SQL con Dapper y Oracle

ado.net c# dapper oracle11g

Pregunta

Lo estoy pasando muy bien con Dapper y no tengo problemas reales hasta este momento, y me está volviendo loco.

Dada esta llamada a un método de Oracle dentro de un paquete

begin
  package.method(in_table => :in_table,
                 in_clob_type => :in_clob_type,
                 out_error_table => :out_error_table);
end;
  • Desde el desarrollador de PL / SQL o cualquier otra herramienta de Oracle, tarda aprox. 2 segundos para ejecutar.
  • Desde dentro de una aplicación de prueba de la consola C # estándar, toma aprox. 2-3 segundos
  • Desde dentro de una aplicación WebAPI hospedada por IIS, toma aprox. 10-12 segundos.

Mismo SQL, mismos parámetros, misma base de datos y mismo usuario. Cada otra parte de SQL dentro de la aplicación funciona perfectamente

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");

¿Alguien tiene alguna idea sobre la mejor manera de depurar esto?

ACTUALIZACIÓN 1:

Tanto WebAPI como el código de la consola producen 1708 sentencias SQL distintas para los procesos de inserción y actualización dentro de la función de paquete. Simplemente lleva más tiempo entre llamadas SQL pero aún no puedo ver un patrón.

ACTUALIZACIÓN 2:

Excavando más profundo, no mi código, por lo que me toma un poco más de tiempo, encontré una llamada que crea algunas tablas temporales en las que cargamos los datos requeridos para el proceso. Si comento esto y solo proporciono un nombre de tabla existente, 2-3 segundos.

Algo en la creación de las tablas parece estar bloqueando el resto del proceso? Si marcó todos los métodos PRAGMA AUTONOMOUS_TRANSACTION 10-12 segundos. Si creo tablas dentro o fuera de una transacción específica o compartida, 10-12 segundos. Si los creo sin una transacción 10-12 segundos.

Respuesta aceptada

No pude entender por qué la creación de la tabla estaría causando algún tipo de retraso en el proceso, de hecho no veo ninguna manera posible debido a la naturaleza muy simple de las tablas, así que tomé una dirección diferente.

En lugar de crear tablas temporales en el esquema de usuarios, creé las tablas como tablas temporales globales marcadas como ON COMMIT DELETE ROWS.

Ahora todo se ejecuta en 2 segundos o menos como se esperaba :-)

Gracias por toda su ayuda, y si encuentra alguna idea para el retraso, no dude en compartirla.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué