Microsoft MVP성태의 닷넷 이야기
Sybase Adaptive Server Anywhere 6 버전에 대한 질문입니다. [링크 복사], [링크+제목 복사]
조회: 4159
글쓴 사람
heygongc (heygongc at naver.com)
홈페이지
첨부 파일
 
안녕하세요.

현재 Sybase Adaptive Server Anywhere 6버전인 디비를 C#(.Net 2.0) 으로 사용해야하는 상황입니다.

각 클라이언트 PC에 ODBC를 설정해두고

connectionString = "Dsn=dsn명;uid=아이디;pwd=비번";

OdbcConnection을 사용하여 데이터를 불러오고 있습니다.

그러나 클라이언트 PC에서 데이터를 불러올 때 OdbcDataAdapter.Fill(dt)로 데이터 테이블에 채우는 과정에서

60개의 행밖에 안되는 테이블을 조회하는데도 1, 2초 이상이 걸립니다.

그러나 java, vb6.0, 델파이에서는 같은 odbc 설정을 가지고 조회를 하면

상대적으로 즉각적인 속도를 보입니다.

1, 2초 정도이지만 프로그램 실행 시 여러 설정값들을 디비에서 반복하여 불러오다 보니 속도차이가 굉장히 많이 납니다.

iAnywhere.Data.SQLAnywhere.dll을 사용하여 연결하자니 Sybase 6버전에서는 사용이 안되는 듯 하고

ODBC 말고는 따로 연결할 수 있는 방법이 없는 듯하여 애를 먹고 있습니다.

1. 혹시 Sybase6버전에 대한 ODBC 설정과 닷넷이 최적화 되어 있지 않아서 다른 언어와 다르게 속도가 유독 떨어질 수 있을까요..?

2. ODBC의 속도 해결이 안된다면 Sybase6 버전을 ODBC가 아닌 다른 방법으로 연결할 수 있는 방법이 있을까요?

조금 글이 길어졌는데 읽어주셔서 감사합니다.




donaricano-btn



[최초 등록일: ]
[최종 수정일: 5/21/2018]


비밀번호

댓글 쓴 사람
 



2018-05-22 11시42분
1번은 가능성이 있지만 구체적인 것은 Sybase 측의 포럼들을 이용해 문의하는 것이 좋습니다.

2번은 글쎄요, ODBC에서 속도 해결이 안되고 .NET Provider가 Sybase 6을 지원하지 않는다면 어떤 방법이 있을지... 혹시 OLEDB 층의 드라이버를 제공한다면 그걸 사용해 보는 정도가 아닐까 싶은데요.

그런데, 구체적으로 어디서 느린지 한번 확인해 보세요. 어차피 Fill은 Select 구문 수행하고 DateReader로부터 while문으로 루프 돌면서 한 행씩 데이터를 읽어오는 기능을 묶은 것에 불과합니다. 따라서 Fill 대신 해당 과정을 SELCT/DataReader로 직접 실행해 어느 지점에서 느린지 확인이 필요합니다.
정성태
2018-05-23 09시16분
[heygongc] 일단은 말씀해주신 것처럼 DataReader를 사용하여 직접 datatable에 데이터를 채워보았습니다.

테스트 해본 코드는 아래와 같으며 결과로는

open() 시간 : 0.069 초
datatable에 컬럼을 만드는 시간 : 0초
datatable에 행을 추가하는 시간 : 3.593초

해당 테이블의 컬럼수 : 11개
해당 테이블의 로우수 : 73개

입니다. 이 결과 자체로는 의심해볼 수 있는 부분이 있을까요?

string sql = "Select * From TestTable";
string OdbcConnectionString = "Dsn=testDsn;uid=test;pwd=test";

using (DataTable dt = new DataTable())
using (OdbcConnection conn = new OdbcConnection(OdbcConnectionString))
using (OdbcCommand cmd = new OdbcCommand(sql, conn))
{
    Stopwatch sw = new Stopwatch();
    sw.Reset();
    sw.Start();

    conn.Open();

    sw.Stop();
    textBox1.Text += "Open : " + sw.ElapsedMilliseconds / 1000.0F + Environment.NewLine;

    using (OdbcDataReader reader = cmd.ExecuteReader())
    {
        string colName;

        sw.Reset();
        sw.Start();

        for (int i = 0; i < reader.FieldCount; i++)
        {
            colName = reader.GetName(i);

            if (!dt.Columns.Contains(colName))
            {
                dt.Columns.Add(colName, typeof(string));
            }
        }

        sw.Stop();
        textBox1.Text += "Fill Columns : " + sw.ElapsedMilliseconds / 1000.0F + Environment.NewLine;

        string[] row = new string[reader.FieldCount];


        sw.Reset();
        sw.Start();

        while (reader.Read())
        {
            for (int i = 0; i < reader.FieldCount; i++)
            {
                row[i] = reader[i].ToString();
            }
            dt.Rows.Add(row);
        }

        sw.Stop();
        textBox1.Text += "While() : " + sw.ElapsedMilliseconds / 1000.0F + Environment.NewLine;
        
        dataGridView1.DataSource = dt;
    }
}
[손님]
2018-05-23 10시08분
다른 코드는 다 떼어내고, 그러니까 정리하면 다음의 코드에서 느린거죠?

while (reader.Read())
{
    for (int i = 0; i < reader.FieldCount; i++)
    {
        reader[i].ToString();
    }
}
정성태
2018-05-23 11시59분
[guest] 네 그렇습니다
[손님]
2018-05-23 01시50분
혹시, 그럼 Java/VB6.0으로 했을 때는 빠르다고 했는데 C#으로 했을 때와 정확히 동일한 SQL 쿼리임에도 그런 속도차이가 나는 건가요?
정성태
2020-11-05 11시18분
[q] 오래 되었습니다만
당시에 클러이언트 PC에 ODBC를 Sybase 6버전이 아닌 12버전으로 설치해서 사용하니
속도 문제가 해결되었습니다.
[손님]
2020-11-05 12시24분
정리해 보면, Sybase 6 버전에서 Java, VB6, 델파이는 괜찮았지만 닷넷만 느렸다는 건가요?
정성태
2021-04-05 03시47분
[손님] 상황을 정리해보면 서버에 Sybase Adaptive Server Anywhere 6.0 버전이 설치가 되어 있습니다.
클라이언트에서 접속할 때 클라이언트 PC에 ODBC 드라이버를 서버와 동일하게 Adaptive Server Anywhere 6.0 버전으로 설치 후 접근하면
자바, VB 6.0에서는 속도가 이슈가 없었지만 닷넷에서는 속도가 현저히 떨어졌습니다.

그러나 서버에는 여전히 Sybase Adaptive Server Anywhere 6.0 를 유지한채
클라이언트 PC에는 SQL Anywhere 12 버전의 ODBC 드라이버를 설치하여 접근하니
닷넷에서도 속도가 해결되었습니다.
그리고 서버에 설치된 DBMS는 Sybase 6버전이지만 ODBC 드라이버는 12 임에도 하위버전 호환이 되어서인지
현재까지 호환성의 문제는 없었습니다.
[손님]
2021-04-05 04시18분
경험 공유 감사합니다. (이렇게 정리하는 것도 시간이 은근 소비되었을 텐데... 수고 많으셨습니다. ^^)
정성태

... 16  17  18  19  20  21  22  23  24  25  26  27  [28]  29  30  ...
NoWriterDateCnt.TitleFile(s)
4816부우3/15/20177581C++ DLL함수 사용 질문드립니다 [10]
4815김지용3/14/20174582.net core linux 오류 [2]
4814김솔지3/13/20175683인쇄 시 , 출력화면을 이미지 파일로 저장하고 싶습니다. [1]파일 다운로드1
4813spowner3/8/20176845멀티 스레드 환경에서 처리하여야 할 목록을 효율적으로 사용하는 기법 질문 드립니다 [2]
4812popo2/23/20176587.NET Window ClassName 변경 질문 드립니다. [1]
4809힘찬도약2/15/20178764C# 가상 시리얼 [4]
4808이길용2/9/20178171WCF 외부 접속 관련해서 질문드립니다ㅠ [1]
4807헬조선식스웨그2/8/201713868WPF의 속도에 대해서 궁금합니다. [3]
4803헬조선식스웨그2/7/20178388WPF로 메신져 메세지 박스 구현 문의 [2]
4802spowner2/6/20175897특정 범위의 값을 다른 값으로 치환하는 메소드를 만들어야 할 때 가장 빠른 방법은? [7]
4804spowner2/7/20175943    답변글 [답변]: 특정 범위의 값을 다른 값으로 치환하는 메소드를 만들어야 할 때 가장 빠른 방법은?
4805spowner2/7/20175598    답변글 [답변]: 특정 범위의 값을 다른 값으로 치환하는 메소드를 만들어야 할 때 가장 빠른 방법은? (글삭제가 안돼 재첨부합니다)파일 다운로드1
4801spowner2/3/20175800C#의 참조 동작관련하여 아이디어 문의 드립니다 [4]
4800오세운2/1/20178896C# 에서 C++ DLL임포트 질문입니다. [2]
4798손님1/29/20176670picturebox의 image.dispose [1]
4797김철환1/13/20176989책에 관한 질문입니다 [3]
4796Beren Ko1/13/20176495++ 후위연산자와 = 을 함께 사용할 때 생성되는 IL 코드 관련... [2]
4795김철환1/11/20177934이벤트 부분을 읽고 있는데 이해가 안되서 질문합니다.. [11]
4794김철환1/10/20175539안녕하세요 c# 6.0 책을 구매한 사람인데요 [3]
4793장준영1/7/20177288안녕하세요 c언어 처음 공부해보는 학생입니다 [4]파일 다운로드1
4792김재영1/4/20177099소스코드 공개 전 성태님의 의견을 듣고싶습니다 [3]
4791C#초보12/28/20167320비동기 소켓 close시 ObjectDisposedException 문제점 질문 있습니다.. [1]
4790미나리12/24/20167527파워포인트 쇼 제어 SimpleHttpServer.cs 작동문제 [4]파일 다운로드1
4789김솔지12/21/20167386프린트 시, 프린트하는 파일의 파일명 구하는 부분에 대해서 질문드립니다. [1]
4788짜두12/19/20166680Visual Studio 2015 에서 msbuild 12 사용 [5]
4787손님12/18/20167927VLC라이브러리에 대해 아시나요? [3]파일 다운로드1
... 16  17  18  19  20  21  22  23  24  25  26  27  [28]  29  30  ...