2

Я использую Advantage Database Server v10 и соответствующий поставщик ADO.NET. Я обнаружил, что AdsConnection.Close занимает значительное количество времени после выполнения INSERT/UPDATE запросов.Advantage Database Server INSERT/UPDATE вызывает проблемы с производительностью

Например этот образец

class Program 
{ 
    static void Main(string[] args) 
    { 
     var openTimer = new Stopwatch(); 
     var closeTimer = new Stopwatch(); 
     var executeTimer = new Stopwatch(); 

     for (int ix = 0; ix < 100; ix++) 
     { 
      openTimer.Start(); 
      using (var cnn = new AdsConnection(
       @"data source=...; ServerType=remote; user id=admin; password=...")) 
      { 
       cnn.Open(); 
       openTimer.Stop(); 


       executeTimer.Start(); 
       using (var cmd = cnn.CreateCommand()) 
       { 
        cmd.CommandText = "SELECT MAX(colUGId) FROM tblUserGroup"; 

        var id = (int)cmd.ExecuteScalar() + 1; 

        cmd.CommandText = "INSERT INTO tblUserGroup (colUGId, colName, colDesc) VALUES (:id, :name, :desc)"; 
        cmd.Parameters.Add("id", id); 
        cmd.Parameters.Add("name", "Name " + id); 
        cmd.Parameters.Add("desc", "Description " + id); 
        cmd.ExecuteNonQuery(); 
       } 
       executeTimer.Stop(); 


       closeTimer.Start(); 
      } 
      closeTimer.Stop(); 
     } 

     Console.WriteLine("Open: {0}; Execute: {1}; Close: {2}", openTimer.Elapsed, executeTimer.Elapsed, closeTimer.Elapsed); 
    } 
} 

выходы:

Open: 00:00:00.2361612; Execute: 00:00:15.3849932; Close: 00:00:05.4333431 

Это очень интересно, почему 100 операций вставки в простую таблицу с тривиальными индексами и без каких-либо триггеров занимает 15 секунд. Но самый важный вопрос: почему Close занимает так много времени?

Любые идеи?

UPDATE

Только что попробовал то же самое с SQL Server. Он работает на другой рабочей станции, что немного быстрее, чем рабочая станция с Advantage. В любом случае, я вижу, что пул соединений работает (в случае SQL Server) хорошо:

Open: 00:00:00.2279668; Execute: 00:00:00.0189551; Close: 00:00:00.0003487 
+1

Вы создаете и удаляете класс AdsConnection 100 раз. Почему бы не просто открыть его один раз, выполнить все свои вставки, а затем закрыть? –

+0

@BradM Я думал, что пул соединений был изобретен, чтобы спасти меня от этого –

+0

т.е. правильно, объединение пулов должно решить именно это, см. также: http://devzone.advantagedatabase.com/dz/webhelp/Advantage11.1/dotnet_advantage_net_data_provider_and_connection_pooling.htm –

ответ

2

15 секунд, безусловно, длинный. Поскольку вы указываете индексы, я уверен, что у вас есть необходимый индекс, но убедитесь, что есть индекс на colUGId. Если этот индекс не существует, то запрос select max потребует полного сканирования таблицы при каждом запуске. Если таблица относительно велика, это может быть очень дорогостоящим.

В то время как пул соединений устраняет затраты на получение нового соединения каждый раз через цикл, код, как показано, вызывает полное закрытие таблицы с каждой итерацией. Таким образом, сервер заканчивает открытие и закрытие таблицы каждый раз через цикл (при условии, что ни один другой пользователь не откроет его во время выполнения этого теста). Это определенно добавит к стоимости, хотя я не знаю, почему это приведет к сообщенным временам.

Хотя это не дает ответа на вопрос, я побежал точный код, указанный выше (со строкой подключения модифицированном конечно), и получают эти цифры:

Open: 00:00:00.8909295; Execute: 00:00:01.4729069; Close: 00:00:01.4211188 

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

Open: 00:00:00.1073400; Execute: 00:00:00.0802774; Close: 00:00:00.0270569 

Еще одна вещь, чтобы отметить с кодом, как написано оно не может повторно использовать любые подготовленные заявления. В частности, один и тот же объект команды используется как для SELECT, так и для INSERT. Это приводит к анализу и семантическому анализу всех итераций. Это, конечно, не большая вещь, но она может складываться. Я снова проверил тест, используя два командных объекта, и получил следующие цифры:

Open: 00:00:00.0835544; Execute: 00:00:00.0567687; Close: 00:00:00.0267799 
Смежные вопросы