Я использую 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 секунд!!!
Итак, вот некоторые из моих вопросов:
Это нормальный результат? Я имею в виду, что очевидно, что прямое выполнение SQL всегда быстрее, чем использование чего-то вроде ADO, но разница в производительности, как правило, сильно отличается?
Можно ли приписать узкое место в скорости главным образом ADO? Или проблема связана с базой данных (Sybase) ..?
Есть ли другой способ доступа к OLE DB в C ++, вместо использования ADO (более быстрая альтернатива) ??
Любые идеи от людей, которые имеют большой опыт работы с базой данных, пожалуйста
Вы должны рассмотреть возможность использования подготовленный свойство, чтобы 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);
Рекомендации: