c# 셀렉트 반복시 속도

안녕하세요 현재 프로그램 컨버전중에 있는데

이게 이해가 안되서 질문드립니다.
혀냊 컨버전프로그램 소스를 제가 볼수 없습니다… 기능 을 보고 새로 만들어야됩니다. .;;

프로그램 기능 자체는 매우 단순합니다.

반복적으로 데이터를 읽어와서 그리드에 뿌리기만 하면 됩니다.

그런데 VB 프로그램은 만약 300건의 항목의 정보를 가져온다고 했을때
300번 반복할 때 한번 셀렉트 할때 마다 거의 0.01 초 정도 걸릴더라구요
서버 프로파일러 통해서 확인했습니다.

그런대 제가 만든 c# 소스는 한번 셀렉트 할때마다 0.1 초 정도 걸립니다.
이러니 … 항목이 200건 300건 넘어가면 20초 30초씩 걸려버리는데… 환장하겄네요.
제가 사용한 소스 입니다. 혹시 빠르게 할수 있는 방법이 없을까요…?

///


/// 쿼리를 읽어서 DataTable 형태로 줌
///

/// 참조형식 데이터 테이블
/// 쿼리
/// 입력시 변경
/// 조회된 데이터테이블의 로우 수
public static int OpenDataTable(ref DataTable dt, string strSql, string strCon = constring)
{

        int iRowCnt = 0;
        dt.Clear();

        dt = new DataTable();

        try
        {
            SqlConnection SQLConnection = new SqlConnection(strCon);
            SqlCommand SQLCommand = new SqlCommand(strSql, SQLConnection);
            SQLCommand.CommandTimeout = 1800;


            SQLConnection.Open();
            SqlDataReader SQLDataReader = SQLCommand.ExecuteReader();

            if (SQLDataReader.HasRows)
            {
                dt.Load(SQLDataReader);
                iRowCnt = dt.Rows.Count;
            }
            else
            {
                SQLDataReader.Close();
            }
        }
        catch (Exception ex)
        {
            iRowCnt = 0;
            throw new Exception("OpenDataTable Error" + Environment.NewLine + ex.ToString());
        }

        return iRowCnt;
    }
좋아요 1

300건의 데이터가 20~30초가 걸리는 것은 개선할 여지가 상당해 보이는데요,
쿼리문으로 질의를 하시고 결과를 DTO 객체로 담으세요.

Dapper를 이용하면 어렵지 않게 하실 수 있습니다.

특별한 경우가 아니라면 300건 정도의 경우 0.1초 미만으로 결과를 얻어 오실 수 있고요, 이것을 필요로 하는 컬럼명으로 속성으로 해서 클래스로 만든 후 받으면 됩니다.

좋아요 2

일단 그냥 SSMS에서 쿼리만 날려봤을 때 똑같이 오래 걸리는 건 아닌지 확인해보시고요…(서버 또는 쿼리의 문제)
그게 아니라면 @dimohy 님 말씀대로 Dapper를 사용해 보시는게 좋을 것 같네요.
아래와 같이 또 다른 방법도 있고요…

방법은 무지무지 많습니다…

좋아요 3

StopWatch로 먼저 구간별로 수행시간을 분석해보시는게 어떨까 싶은데요.

  • 쿼리 수행 시간
  • DataTable 로드 완료 시간
  • 로드된 DataTable을 화면에 보여주기까지의 시간

그 다음에 오래 걸리시는 구간에 성능 개선을 위한 노력을 하는게 좋을 것 같습니다.

좋아요 3