繁体   English   中英

ADO与OLE DB的连接速度太慢

[英]ADO Connection to OLE DB is way too slow

我正在使用ADO连接和记录集对象来访问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);


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

所以这是我的一些问题:

  1. 这是正常结果吗? 我的意思是很明显,直接执行SQL总是比使用ADO之类的工具更快,但是性能差异通常有很大不同吗?

  2. 能否将速度瓶颈归因于ADO? 还是该问题与数据库(Sybase)有关。

  3. 还有什么其他方法可以使用C ++访问OLE DB,而不是使用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);

参考文献:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM