C \ # 대량의 데 이 터 를 순식간에 데이터베이스 에 삽입 하 는 방법

C \ # 대량의 데 이 터 를 순식간에 데이터베이스 에 삽입 하 는 방법
우리 가 데이터베이스 에 대량의 데 이 터 를 추가 할 때, 데이터 의 양 이 너무 많아 서 자주 고민 하지 않 습 니까?
이른바 대량의 데이터 라 는 것 은 일반적으로 수만 개의 데이터 이다. 예 를 들 어 우리 가 백만 개의 데 이 터 를 추가 하려 면 어떻게 그것 의 효율 을 높 여야 합 니까?
Oracle 데이터베이스: 일반 쿠션 식 은 대량 삽입 이 무엇 입 니까? 바로 한꺼번에 데 이 터 를 삽입 하 는 것 입 니 다. 우 리 는 이 데 이 터 를 큰 배열 로 이해 할 수 있 습 니 다. 이런 것들 은 모두 하나의 SQL 로 만 이 루어 집 니 다. 전통 적 인 방식 에서 여러 번 의 SQL 을 호출 해 야 완성 할 수 있 습 니 다. 이것 이 바로 유명한 '배열 바 인 딩' 기능 입 니 다.우 리 는 먼저 전통 적 인 방식 에서 여러 줄 의 기록 을 삽입 하 는 조작 방식 을 살 펴 보 자.
//           ,
string connectStr = "User Id=scott;Password=tiger;Data Source=";
OracleConnection conn = new OracleConnection(connectStr);
OracleCommand command = new OracleCommand();
command.Connection = conn;
conn.Open();
//           ,         
for (int i = 0; i < recc; i++)
{
    string sql = "insert into dept values(" + i.ToString() + "," + i.ToString() + "," + i.ToString() + ")";
    command.CommandText = sql;
    command.ExecuteNonQuery();
} 


ODP 기능 사용
//           
string connectStr = "User Id=scott;Password=tiger;Data Source=";
OracleConnection conn = new OracleConnection(connectStr);
OracleCommand command = new OracleCommand();
command.Connection = conn;
//    ,          ,       
//                 
command.ArrayBindCount = recc;
//       ,     ,       ,            
//      ,       ,         
command.CommandText = "insert into dept values(:deptno, :deptname, :loc)";
conn.Open();
//        ,        ,            
int[] deptNo = new int[recc];
string[] dname = new string[recc];
string[] loc = new string[recc];
//       ,          ,         
//                 ,       
OracleParameter deptNoParam = new OracleParameter("deptno", OracleDbType.Int32);
deptNoParam.Direction = ParameterDirection.Input;
deptNoParam.Value = deptNo;
command.Parameters.Add(deptNoParam);
OracleParameter deptNameParam = new OracleParameter("deptname", OracleDbType.Varchar2);
deptNameParam.Direction = ParameterDirection.Input;
deptNameParam.Value = dname; command.Parameters.Add(deptNameParam);
OracleParameter deptLocParam = new OracleParameter("loc", OracleDbType.Varchar2);
deptLocParam.Direction = ParameterDirection.Input;
deptLocParam.Value = loc;
command.Parameters.Add(deptLocParam);
//       ,       ,            SQL
for (int i = 0; i < recc; i++)
{
    deptNo[i] = i;
    dname[i] = i.ToString();
    loc[i] = i.ToString();
}
//            SQL,       
command.ExecuteNonQuery();

자, 지금까지 두 가지 방식 의 삽입 작업 프로그램 이 완성 되 었 고 비교 만 남 았 습 니 다.저 는 주 함수 에 작은 함 수 를 썼 습 니 다. 두 가지 방법 을 여러 번 반복 해서 호출 하고 시간 을 기록 하 며 비교 함 수 는 다음 과 같 습 니 다.
for (int i = 1; i <= 50; i++)
{
    OrdinaryInsert(i * 1000);

    BatchInsert(i * 1000);
} 
데이터 양 이 100 만 단계 에 달 했 을 때 사용 하 는 시간 은 여전히 만 족 스 럽 고 빠 르 면 890 밀리초 에 달 하 며 보통 1 초 정도 이다.
  시험 을 통 해 한 조 의 데 이 터 를 얻 으 면 두 가지 방식 이 효율 에 있어 놀 라 운 차이 (시간 을 차지 하 는 단 위 는 밀리초) 를 알 수 있다.
SqlServer 데이터베이스: Oracle 이 이렇게 시원 할 수 있다 면 SqlServer 에서 도 이렇게 할 수 있 습 니까?그러나 SqlServer 에는 Array BindCount 와 같은 조작 속성 이 없습니다.그러나 우 리 는 BULK INSERT 를 통 해 대량의 데이터 추가 에 들 어 갈 수 있다.코드:
//           
            string connectStr = "……";
            SqlConnection conn = new SqlConnection(connectStr);
            SqlCommand command = new SqlCommand();
            command.CommandTimeout = 0;
            command.Connection = conn;
            /*  :
             * “c:\\sql.txt”          100      
             *          “,”  
             *       “|”    
             *  10        。
             */
            command.CommandText = "BULK INSERT TableB FROM 'c:\\sql.txt' WITH (FIELDTERMINATOR = ',',ROWTERMINATOR ='|',BATCHSIZE = 100000)";
            conn.Open();
            //System.Data.SqlClient.SqlBulkCopy sqlBC
            command.ExecuteNonQuery();

            conn.Close();
Oracle 만큼 변태 적 이지 않 지만 백만 개의 데 이 터 를 삽입 하 는 데 몇 초 밖 에 걸 리 지 않 았 습 니 다. 우리 가 평소에 추가 하 는 속도 보다 훨씬 흥분 되 었 을 것 입 니 다. 하하.
여러분 빨리 안 해 보 세 요?
그래.....................................................................

좋은 웹페이지 즐겨찾기