2016-05-17 3 views
2

Я отлично провожу время с 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 секунд.

+0

Было ли у вас время выполнения только кода Dapper или всего вызова WebAPI при сообщении через 10-12 секунд? –

+0

С объектом секундомера непосредственно перед и после фактических вызовов db.Query или Execute. – PoweredByPorkers

+0

Консольное приложение, которое вы также использовали dapper? Насколько сложным является запрос? –

ответ

0

Я не мог понять, почему создание таблицы вызывает какое-либо отставание в процессе, на самом деле я не вижу никакого способа, которым это могло бы дать очень простой характер таблиц, поэтому я пошел другой направление.

Вместо создания временных таблиц в схеме пользователей я создал таблицы как глобальные временные таблицы, помеченные как ON COMMIT DELETE ROWS.

Сейчас все работает в течение 2 секунд или меньше, как и ожидалось :-)

Спасибо за вашу помощь, и если вы найдете какие-либо идеи для лага, пожалуйста, не стесняйтесь поделиться.

 Смежные вопросы

  • Нет связанных вопросов^_^