ADO与OLE DB的连接速度太慢

时间:2014-07-03 18:21:15

标签: c++ sql database oledb sybase

我正在使用ADO Connection&用于访问Sybase ASE数据库(OLE DB提供程序)的记录集对象..

例如,简单地执行SQ​​L语句看起来像这样: (插入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)");

OR(备选方案):

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

// Construct & Bind obj.. 
...

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


两种方法都可以正常工作并产生预期的结果。唯一的问题是它们都非常慢。使用原始sql语句插入10000行数据只需要 3~5秒。另一方面,使用ADO对象完成相同的任务需要 40-50秒 !!!

以下是我的一些问题:

  1. 这是正常的结果吗?我的意思是直接的sql执行总是比使用像ADO这样的东西更快,但性能差异通常会有很大不同吗?

  2. 速度瓶颈主要归因于ADO吗?或者问题是如何使用数据库(Sybase)做更多的事情..?

  3. 有没有其他方法可以在C ++中访问OLE DB,而不是使用ADO(更快的替代方案)?

  4. 有很多数据库经验的人的见解

1 个答案:

答案 0 :(得分:0)

您应该考虑使用 Prepared 属性,以便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);

参考文献: