ADO连接到OLE DB太慢了
ADO Connection to OLE DB is way too slow
我正在使用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秒!!
下面是我的一些问题:
这是正常结果吗?我的意思是,很明显,直接sql执行总是快于使用像ADO,但性能差异通常有这么大的不同吗?
速度瓶颈可以主要归因于ADO吗?或者这个问题是否需要更多地使用数据库(Sybase)…?
是否有其他方法访问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
相关文章:
- 制作时出错,C++"db.c:2127:错误:在"||"标记之前应使用";"
- OLE DB 大容量复制操作始终将 true 加载到位列中
- 优化使用 C++ 查询 SQLite DB 中超过 5000 万条数据记录的方式
- POST Arduino 传感器值通过 Flask API 发送到本地 Sqlite db
- ATL OLE DB Consumer Templates 与 Microsoft OLE DB Driver for
- 将 OLE 自动化日期 (OADate) 双精度转换为结构 tm,而不使用 VariantTime到SystemTime
- 使用 IDispatch::调用进行 OLE 交互的参数构造
- Poco c++ 如何从PostgreSQL DB读取"text"数据类型?
- 任何用于PostgreSQL的OLE DB提供商/消费者
- C PTHREAD_MUTEX在DB访问中无法正常工作
- 如何在mongo db上从gmlib存储mpz_t
- 在运行Visual Studio中用C 编写的Oracle DB客户端时,我会收到错误32104
- PostgreSQL在DB服务器中消耗更多内存,以进行长期运行的连接
- Borland C++ - 使用OLE使用Word打开RTF文件
- 在标头中声明 sqlite::d atabase db( ":memory:" ) 会给出错误
- 如何在Oracle DB中编写C 中的UDF
- ADO连接到OLE DB太慢了
- VARCHAR 数据不应该转换为 char * (MSSQL OLE DB)?
- 使用IRow::GetColumns (OLE DB)(MSSQL)获取列数据
- ODBC, ADO or OLE DB