Microsoft MVP성태의 닷넷 이야기
Sybase Adaptive Server Anywhere 6 버전에 대한 질문입니다. [링크 복사], [링크+제목 복사]
조회: 9156
글쓴 사람
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)
5932EK4/12/2024556다음 제네릭에서 널익셉션이 뜨는 이유를 알수있을까요? [1]
5931이대희4/2/2024892Windows 앱 SDK C# 템플릿의 용도가 무엇인지요? [1]
5930vict...2/22/20241766ef core, FromSqlRaw 맵핑 질문입니다. [4]
5929a2/17/20241836.Net 8 에서 디버거 변경 [1]
5928vict...2/5/20241997wpf에서 대량 데이터 보여주는 방법 추천 부탁드립니다. [1]
5926엄태영1/12/20241980잘못된 Task 사용으로 인한 데드락 관련 질문 입니다. [3]
5925Euni...12/22/20231908Visual Studio에서 nodejs 사용시 npm install -g @vue/cli 실행시 오류 [1]
5924Euni...12/21/20231975Visual Studio에서 nodejs 사용시 C:\Program Files\nodejs\\node.exe" "C:\Program Files\nodejs\\node_modules\npm\bin\npm-cli.js" prefix -g 를 찾지 못하는 설치 오류 [2]
5923정두호12/4/20232431MSSQL 데이터 전송과 공유폴더의 데이터 전송 차이점 [1]
5922Heeg...10/27/20234628C++의 double pointer를 C#에서 구현하는 방법이 잘 안됩니다. [3]
5921한예지 donator10/3/20234417마샬링 정의 및 목적이 궁금합니다. [5]
5920한예지 donator10/3/20233249C#과 WIN32 API 관계 질문드립니다. [4]
5919이건우9/27/20232939WinForm의 로딩속도 관련 질문입니다 [2]
5917한예지 donator9/14/20233021동기화 도구 질문 있습니다. [4]
5916한예지 donator9/3/20233188Thread.Sleep(500), await Task.Delay(500), Task.Delay(500) 차이점이 궁금합니다. [2]
5915한예지 donator8/30/20233084비동기 코드를 for 문 안에 작성한 경우 제어 변수가 올바르게 동작하지 않는 이유가 궁금합니다. [3]
5914한상욱8/11/20232931.net wpf에서 skiasharp 의 skelement 를 canvas로 사용 하고 있습니다. [1]
5913김태우8/10/20233014지역변수로 이해하는 메서드매개변수 게시글 댓글 [3]
5912guest4/25/20235288[참고 - 초보용] Sqlite 디비는 double이 없고 Real이 대신합니다 [3]
5911guest4/24/20233524Form1.cs와 외부 class.cs와 통신 (static async method포함) [4]파일 다운로드1
5910guest4/24/20233373Async 메서드와 try~catch [1]
5909guest4/22/20233769Visual Studio 구매 시(1인 개발자) [4]
5908guest4/22/20233630텅빈 원그리기 [5]
5907민성4/21/20233256안녕하세요 서버 백업 문제에 대해서 [2]
5906guest4/21/20233387Dispatcher 서비스 구현 질문 [1]
[1]  2  3  4  5  6  7  8  9  10  11  12  13  14  15  ...