[英]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秒 !!!
所以这是我的一些问题:
这是正常结果吗? 我的意思是很明显,直接执行SQL总是比使用ADO之类的工具更快,但是性能差异通常有很大不同吗?
能否将速度瓶颈归因于ADO? 还是该问题与数据库(Sybase)有关。
还有什么其他方法可以使用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.