500 times slower - Mailing list pgsql-odbc
From | Karol Szkudlarek |
---|---|
Subject | 500 times slower |
Date | |
Msg-id | 4202379B.5020604@mikronika.com.pl Whole thread Raw |
Responses |
Re: 500 times slower
|
List | pgsql-odbc |
Hi! I have the program which using LOBS with postgresql. When I connect to local windows server or remote linux server everything is fine. But when I connect to remote Windows server the function SQLDirectExec runs 500 times longer than normally. Problem concerns postgres on Windows with version > 7.4.1 and also 8.0. 7.x runs under cygwin and 8.x natively. Previously in the old cygwin which contains 7.4.1 postgres the performance was ok. I've included simple test case which shows the problem. Karol #include <iostream> #include <windows.h> #include <sql.h> #include <sqlext.h> void ODBCError(SQLRETURN rc,const char*where,bool ignoreError=false) { bool terminate=true; const char*err; switch (rc) { case SQL_SUCCESS: err="SQL_SUCCESS" ;terminate=false;break; case SQL_SUCCESS_WITH_INFO:err="SQL_SUCCESS_WITH_INFO";terminate=false;break; case SQL_NO_DATA :err="SQL_NO_DATA" ;terminate=false;break; default: err="ERROR";break; } if(!ignoreError) if (terminate) { std::cerr<<where<<":"<<err<<std::endl; exit(0); } } bool ODBCExec(SQLHDBC hdbc,const char* stmt) { SQLHSTMT hstmt; ODBCError(SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt),"SQLAllocHandle-Stmt"); ODBCError(SQLExecDirect(hstmt,(SQLCHAR*)stmt,SQL_NTS),"SQLExecDirect",true); ODBCError(SQLFreeHandle(SQL_HANDLE_STMT,hstmt),"SQLFreeHandle-Stmt"); return true; } bool ODBCTest() { SQLHENV henv; ODBCError(SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv),"SQLAllocHandle-Env"); ODBCError(SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3 ,NULL),"SQLSetEnvAttr"); SQLHDBC hdbc; ODBCError(SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc),"SQLAllocHandle-Conn"); const char*server="pi"; const char*user="legnica_e"; const char*passwd="syndis"; ODBCError(SQLConnect(hdbc,(SQLCHAR*)server,strlen(server),(SQLCHAR*)user,strlen(user),(SQLCHAR*)passwd,strlen(passwd)),"SQLConnect"); ODBCExec(hdbc,"drop table test"); ODBCExec(hdbc,"create table test(t text)"); ODBCExec(hdbc,"create table test(t text)"); ODBCExec(hdbc,"insert into test values ('0123456789')"); for (int x=0;x<20;++x)ODBCExec(hdbc,"update test set t=t||t"); SQLHSTMT hstmt; ODBCError(SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt),"SQLAllocHandle-Stmt"); const char*stmt="select t from test"; ULONGLONG t1,t2; GetSystemTimeAsFileTime((FILETIME*)&t1); ODBCError(SQLExecDirect(hstmt,(SQLCHAR*)stmt,SQL_NTS),"SQLExecDirect"); GetSystemTimeAsFileTime((FILETIME*)&t2); t2-=t1; std::cerr<<"SQLExecDirect time:"<<t2/10000<<"msec."<<std::endl; SQLRETURN rc,rc2; int maxsize=32760; char*buf=new char[maxsize]; SQLLEN ind; while ((rc=SQLFetch(hstmt))!=SQL_NO_DATA) { ODBCError(rc,"SQLFetch"); int count=0; while((rc2=SQLGetData(hstmt,1,SQL_C_CHAR,buf,maxsize,&ind))!=SQL_NO_DATA) { ODBCError(rc2,"SQLGetData"); if ((ind>maxsize)||(ind==SQL_NO_TOTAL)) ind=maxsize; count+=ind; std::cerr<<'.';//<<"reading "<<ind<<" bytes of data"<<std::endl; } std::cerr<<std::endl; ODBCError(rc2,"SQLGetData"); std::cerr<<"total "<<count<<" bytes of data"<<std::endl; } ODBCError(rc,"SQLFetch"); delete[] buf; ODBCError(SQLFreeHandle(SQL_HANDLE_STMT,hstmt),"SQLFreeHandle-Stmt"); ODBCError(SQLDisconnect(hdbc),"SQLDisconnect"); ODBCError(SQLFreeHandle(SQL_HANDLE_DBC,hdbc),"SQLFreeHandle-Conn"); ODBCError(SQLFreeHandle(SQL_HANDLE_ENV,henv),"SQLFreeHandle-Env"); return 0; } int main(int argc,char**argv) { return ODBCTest(); }
pgsql-odbc by date: