非常长的查询执行使用c++, Sql Server和ODBC连接

Very long query execution using C++, Sql Server and ODBC connection

本文关键字:Sql Server 连接 ODBC c++ 查询 执行 非常      更新时间:2023-10-16

我使用以下代码连接到sql-server数据库。我可以使用相同的函数毫无困难地运行所有其他查询。然而,使用RODBC在Sql管理工作室和R中执行一个查询只需11秒,但使用c++则需要一个多小时(在"SQLExecDirect"函数上)。其他人有这个问题吗?你是如何解决的?

std::string sqlQuery="[myquery]";
SQLHANDLE sqlconnectionhandle;
SQLAllocHandle(SQL_HANDLE_DBC, sqlenvhandle, &sqlconnectionhandle);
SQLCHAR retconstring[1024];
SQLDriverConnect (sqlconnectionhandle, NULL, 
        conn_str, 
        len, retconstring, 1024, NULL,SQL_DRIVER_NOPROMPT);
SQLHANDLE sqlstatementhandle;
SQLAllocHandle(SQL_HANDLE_STMT, sqlconnectionhandle, &sqlstatementhandle);
//this is where the program "hangs" for over an hour 
if(SQL_SUCCESS!=SQLExecDirect(sqlstatementhandle, (SQLCHAR*)(sqlQuery.c_str()), SQL_NTS)){ 
    show_error(SQL_HANDLE_STMT, sqlstatementhandle, errorMsg);
    return;
}
int numRow=0;
while(SQLFetch(sqlstatementhandle)==SQL_SUCCESS){    
    for(int i=1; i<=numFields+1; ++i){
        double myVal;
        SQLGetData(sqlstatementhandle, i, SQL_C_DOUBLE, &myVal, 0, NULL);
        cb(myVal, numRow, i-1); //callback function defined elsewhere
    }
    numRow++;
}
SQLFreeHandle(SQL_HANDLE_STMT, sqlstatementhandle );
SQLDisconnect(sqlconnectionhandle);
SQLFreeHandle(SQL_HANDLE_DBC, sqlconnectionhandle);

这是因为数据库的ArithAbort属性是关闭的。参见http://www.sommarskog.se/query-plan-mysteries.html

你可以用这个小脚本检查和纠正它

declare @value sql_variant 
select @value = SESSIONPROPERTY('ARITHABORT') 
if @value <> 1 
begin 
    USE master 
    ALTER DATABASE [your_database] SET ARITHABORT ON WITH NO_WAIT
    use your_database
end 

我弄清楚了:我的连接字符串的默认数据库与我在SSMS中作为默认数据库的数据库不同。切换此选项使查询以与SSMS相同的速度运行。