Очень длинное выполнение запроса с использованием C ++, Sql Server и ODBC-соединения

Я использую следующий код для подключения к базе данных sql-сервера. Я могу выполнить все другие запросы без затруднений, используя ту же функцию. Однако один запрос выполняется в Sql management studio и в R с использованием RODBC за ~ 11 секунд, но занимает более часа (в функции «SQLExecDirect») с использованием c ++. У кого-нибудь еще была эта проблема и как вы ее решили?

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);

3

Решение

Это потому, что свойство 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
1

Другие решения

Я понял это: база данных по умолчанию для моей строки подключения отличалась от базы данных по умолчанию в SSMS. При переключении этот запрос выполнялся с той же скоростью, что и SSMS.

0

По вопросам рекламы [email protected]