2016-10-11 6 views
3

SQL Serverデータベースに接続するために、次のコードを使用しています。私は、同じ機能を使用しても問題なく他のすべてのクエリを実行できます。しかし、1つのクエリはSql管理スタジオで実行され、RではRODBCを〜11秒で使用しますが、C++を使用して(SQLExecDirect関数では)1時間以上かかります。他の誰かがこの問題を抱えていましたが、どのように解決しましたか?C++、Sql Server、およびODBC接続を使用した非常に長いクエリの実行

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

クエリを編集できますか? – Laurijssen

+0

[アプリケーションが遅く、SSMSは高速ですか?](http://www.sommarskog.se/query-plan-mysteries.html) – TheGameiswar

+0

@ServéLaurijssenその仕事に関連して、私は本当にしたくありません。それはいくつかの結合と集約を持つ些細なクエリではなく、何もクレイジーではありません。他の複雑な照会には、同じパフォーマンスの問題はありません。 – user9403

答えて

1

これは、データベースの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 
0

でそれを修正することができ、私はこれを考え出した:私の接続文字列のデフォルトのデータベースは、私はSSMSのデフォルトデータベースとして持っていたものとは異なっていました。これを切り替えると、クエリはSSMSと同じ速度で実行されました。

関連する問題