ADO连接到OLE DB太慢了

ADO Connection to OLE DB is way too slow

本文关键字:DB OLE 连接 ADO      更新时间:2023-10-16

我正在使用ADO连接&用于访问Sybase ASE数据库(OLE DB Provider)的记录集对象..

例如,简单地执行一个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)");

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. 是否有其他方法访问OLE DB在c++,,而不是使用ADO(更快的替代方案)??

有数据库经验的人有什么见解吗?

您应该考虑使用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);

引用:

  • MSDN - Prepared属性(ADO): http://msdn.microsoft.com/en-us/library/windows/desktop/ms675106(v=vs.85).aspx
  • MSDN - Prepared Property示例(vc++): http://msdn.microsoft.com/en-us/library/windows/desktop/ms681552(v=vs.85).aspx