Соединение ADO с OLE DB слишком медленное

Я использую ADO Connection & Объекты набора записей для доступа к базе данных Sybase ASE (поставщик OLE DB).

Например, простое выполнение оператора SQL выглядит примерно так:
(вставка 10000 строк данных)

_ConnectionPtr ConnPtr;
ConnPtr.CreateInstance("ADODB.Connection");
ConnPtr->Open(....my Connection String, UserID, and Password....);

for (int i=0; i<10000; i++)
ConnPtr->Execute("INSERT INTO my_table VALUES (1, 2, 3)");

ИЛИ (альтернативный вариант):

_RecordSet RecPtr; RecPtr.CreateInstance("ADODB.Recordset");
MyObject obj;

// Construct & Bind obj..
...

for (int i=0; i<10000; i++)
RecPtr->AddNew(&obj);

Оба подхода работают нормально и дают ожидаемый результат. Единственная проблема заключается в том, что они оба очень медленные. Вставка 10000 строк данных с использованием необработанных операторов SQL занимает всего около 3 ~ 5 секунд. С другой стороны, выполнение той же задачи с использованием объектов ADO требует 40-50 секунд!!!

Итак, вот некоторые из моих вопросов:

  1. Это нормальный результат? Я имею в виду, что очевидно, что прямое выполнение SQL всегда быстрее, чем использование чего-то вроде ADO, но разница в производительности, как правило, сильно отличается?

  2. Можно ли приписать узкое место в скорости главным образом ADO? Или проблема связана с базой данных (Sybase) ..?

  3. Есть ли другой способ доступа к OLE DB в C ++, вместо использования ADO (более быстрая альтернатива) ??

Любые идеи от людей, которые имеют большой опыт работы с базой данных, пожалуйста

0

Решение

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

_ConnectionPtr ConnPtr;
ConnPtr.CreateInstance("ADODB.Connection");
ConnPtr->Open(....my Connection String, UserID, and Password....);
_CommandPtr CmdPtr;
CmdPtr.CreateInstance("ADODB.Command");
CmdPtr->ActiveConnection = ConnPtr;
CmdPtr->CommandText = "INSERT INTO my_table VALUES (1, 2, 3)";
CmdPtr->PutPrepared(true);
for (int i=0; i<10000; i++)
CommandPtr->Execute(NULL, NULL, adCmdText);

Рекомендации:

0

Другие решения


По вопросам рекламы [email protected]