Microsoft MVP성태의 닷넷 이야기
Sybase Adaptive Server Anywhere 6 버전에 대한 질문입니다. [링크 복사], [링크+제목 복사],
조회: 15283
글쓴 사람
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가 아닌 다른 방법으로 연결할 수 있는 방법이 있을까요?

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








[최초 등록일: ]
[최종 수정일: 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;
    }
}
[guest]
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] 네 그렇습니다
[guest]
2018-05-23 01시50분
혹시, 그럼 Java/VB6.0으로 했을 때는 빠르다고 했는데 C#으로 했을 때와 정확히 동일한 SQL 쿼리임에도 그런 속도차이가 나는 건가요?
정성태
2020-11-05 11시18분
[q] 오래 되었습니다만
당시에 클러이언트 PC에 ODBC를 Sybase 6버전이 아닌 12버전으로 설치해서 사용하니
속도 문제가 해결되었습니다.
[guest]
2020-11-05 12시24분
정리해 보면, Sybase 6 버전에서 Java, VB6, 델파이는 괜찮았지만 닷넷만 느렸다는 건가요?
정성태
2021-04-05 03시47분
[guest] 상황을 정리해보면 서버에 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 임에도 하위버전 호환이 되어서인지
현재까지 호환성의 문제는 없었습니다.
[guest]
2021-04-05 04시18분
경험 공유 감사합니다. (이렇게 정리하는 것도 시간이 은근 소비되었을 텐데... 수고 많으셨습니다. ^^)
정성태

[1]  2  3  4  5  6  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
5968orion4/30/2025233winform DataSet.xsd의 암호화 된 ConnectionString 사용 질문 [2]
5966GM B4/30/2025255C#과 python 연동 질문 [1]
5962SunN...4/21/2025555Contextmenu margin 조절 [1]파일 다운로드2
5961GM B4/10/2025951winform => wpf 마이그레이션 방법 질문 [4]파일 다운로드1
5960Kim ...4/9/20251209안녕하세요.. 혹 AI & C# 에 대해서도 다루시나요? [1]
5959vict...2/10/20251900비주얼 스투디오 CLR 코드 탑색 질문입니다. [1]
5958Supe...1/18/20252886C#으로 DLL을 만들때 WebVeiw2을 이용하여 Vb6에서 사용할수 있는지 문의드립니다. [2]
5956fc1/11/20252889한국투자증권 KIS Developers OpenAPI의 C# 래퍼 버전 - eFriendOpenAPI NuGet 패키지 [1]
5955tree...11/8/20244513C#12 책 179 페이지 문의 사항 [2]
5954SunN...10/10/20244987textbox에서 글자입력후 textBox1_KeyUp함수에서listBox1_SelectedIndexChanged 강제호출방법 [1]
5953Roya10/4/20244975c# com host dll을 c++에서 사용할 때, sdk 관련 runtime 을 설치 안하고 제공할수 있을까요?? [1]
5952우광현9/5/20246086서버용 소켓 포트 동적포트 적용시 클라이언트가 호출하는 방법? [2]
5951Kun ...8/21/20245698c++에서 복합데이터 Struct를 .NET Framework에서 구현할 수 있는 방법이 있을까요? [2]
5950SunN...8/18/20246269정석대로 한다면 response.Close() 해야되는지요? [4]
5949SunN...8/16/20246365SqlConnection Open()에서 에러가나면 Close()하는 시점 [3]
5948SunN...8/14/20246226WebRequestMethods.Ftp.MakeDirectory 해제 [3]
5947Roya8/7/20247003c# dll을 cpp lib에서 사용을 할려고 하는데요. CoCreateInstance 에서 지정된 파일을 찾을수 없다고 나오는대요. [4]
5946SunN...8/5/20247111TaskDefinition 에서 사용저가로그온상관없이실행 [3]파일 다운로드1
5945SunN...8/3/20246985윈도우 작업스케줄러 [1]
5944roya8/1/20246926C# dll을 C++ 프로젝트에서 사용을 하고 싶은데, 레지스트리 등록 없이 가능한걸까요?? [2]
5943SunN...8/1/20246805윈도우C#에서 리눅스FTP로 업로드 및 리눅스에 폴더생성(WindowsOS에서C#으로) [3]
5942vict...7/24/20246837dll 을 c#에서 쓰고 싶습니다 [1]
5941vict...7/17/20248335DependencyObject와 같은 스레드에서 DependencySource를 만들어야 합니다. 오류 [2]
5940ckm7/16/20248751선생님 안녕하세요 async await 교착 관련 질문입니다 [1]
5939괴물신인7/9/20248442템플릿 대체할수있는방법이 있을까요? [6]
[1]  2  3  4  5  6  7  8  9  10  11  12  13  14  15  ...