500 times slower

Поиск
Список
Период
Сортировка
От Karol Szkudlarek
Тема 500 times slower
Дата
Msg-id 4202379B.5020604@mikronika.com.pl
обсуждение исходный текст
Ответы Re: 500 times slower  (Karol Szkudlarek <karol@mikronika.com.pl>)
Список 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 по дате отправления:

Предыдущее
От: Peter Eisentraut
Дата:
Сообщение: Re: odbc.sql?
Следующее
От: "Brien R. Givens"
Дата:
Сообщение: Re: Welcome to the pgsql-odbc list!