База данных Enterprise Library. ExecuteNonQuery скрытые проблемы с производительностью - PullRequest
2 голосов
/ 31 января 2009

Мне было интересно, каковы были скрытые последствия для производительности при использовании объекта Database в Enterprise Library. У меня есть OleDbCommand (тип = хранимый процесс), который вызывает хранимую процедуру IBM iSeries, выполнение которой занимает от 1,5 до 4,5 минут.

Если я вручную запускаю sproc с помощью инструментов iSeries и аналогичных параметров, то это занимает около 5 секунд. Таким образом, снижение производительности происходит либо из-за сетевого взаимодействия с iSeries, либо из-за чего-то скрытого в объекте Database в библиотеке Enterprise. Просто ищу любые идеи.

m_asi = DatabaseFactory.CreateDatabase("ASI-TEST");
using (var cmd = new OleDbCommand())
{
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = string.Format("{0}.P_VNDR_INV", m_strASISprocCatalog);
    cmd.Parameters.Add("@RUN_ENV", OleDbType.Char, 1).Value = strEnvironmentCode;
    cmd.Parameters.Add("@SIS_KEY", OleDbType.Char, 36).Value = InvFilter.SISKey;
    cmd.Parameters.Add("@FROM_DTE", OleDbType.Char, 8).Value = InvFilter.CheckDateFrom.ToString("yyyyMMdd");
    cmd.Parameters.Add("@TO_DTE", OleDbType.Char, 8).Value = InvFilter.CheckDateTo.ToString("yyyyMMdd");
    cmd.Parameters.Add("@EXT_Y", OleDbType.Char, 1).Value = (InvFilter.IsExternal ? "Y" : "N");
    cmd.Parameters.Add("@INC_Y", OleDbType.Char, 1).Value = (InvFilter.IncludeASI ? "Y" : "N");
    cmd.Parameters.Add("@VND_ID", OleDbType.Char, 1800).Value = InvFilter.GetVendorQueryString(18, 1800);

    // This call is the bottleneck
    m_asi.ExecuteNonQuery(cmd);
}

1 Ответ

1 голос
/ 31 января 2009

Я бы ожидал , что это будет какой-то странный параметр, который отличается от инструментов iSeries и клиента .NET - например:

  • режим транзакции?
  • Настройки ANSI?
  • другие варианты подключения? (для SQL Server я имею в виду такие вещи, как SET CONCAT_NULL_YIELDS_NULL и т. д.)

Я не очень разбираюсь в iSeries, но, например, в SQL Server он может использовать столбцы «индексированные постоянные вычисленные», только если все правильно; в противном случае он пересчитывает формулу для строки.

Вы пробовали отследить?

...