Я отлично провожу время с Dapper и не имею никаких реальных проблем до этого, и это сводит меня с ума.Странная проблема производительности SQL с использованием Dapper & Oracle
Учитывая этот вызов метода 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 секунды.
- Внутри приложения IAP, размещенного в 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, но я пока не вижу шаблон.
UPDATE 2:
Копаем глубже, а не мой код, это занимает немного больше времени, нашел вызов, который создает некоторые временные таблицы, в которую мы загружаем данные, необходимые для процесса. Если я прокомментирую это и просто укажите существующее имя таблицы, 2-3 секунды.
Что-то в создании таблиц, похоже, блокирует остальную часть процесса? Если я помечаю все методы PRAGMA AUTONOMOUS_TRANSACTION 10-12 секунд. Если я создаю таблицы в или из конкретной или общей транзакции, 10-12 секунд. Если я создам их без транзакции 10-12 секунд.
Было ли у вас время выполнения только кода Dapper или всего вызова WebAPI при сообщении через 10-12 секунд? –
С объектом секундомера непосредственно перед и после фактических вызовов db.Query или Execute. – PoweredByPorkers
Консольное приложение, которое вы также использовали dapper? Насколько сложным является запрос? –