我正在使用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)");
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秒 !!!
以下是我的一些问题:
这是正常的结果吗?我的意思是直接的sql执行总是比使用像ADO这样的东西更快,但性能差异通常会有很大不同吗?
速度瓶颈主要归因于ADO吗?或者问题是如何使用数据库(Sybase)做更多的事情..?
有没有其他方法可以在C ++中访问OLE DB,而不是使用ADO(更快的替代方案)?
有很多数据库经验的人的见解
答案 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);
参考文献: