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 만큼 변태 적 이지 않 지만 백만 개의 데 이 터 를 삽입 하 는 데 몇 초 밖 에 걸 리 지 않 았 습 니 다. 우리 가 평소에 추가 하 는 속도 보다 훨씬 흥분 되 었 을 것 입 니 다. 하하.여러분 빨리 안 해 보 세 요?
그래.....................................................................
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
nginx websocket ip_해시 규칙프로젝트 를 다운로드 한 후 서로 다른 네트워크 에 각각 이 demo 프로젝트 를 배치 합 니 다. 프로젝트 에서 환경 변수 에 따라 시스템 변 수 를 설정 합 니 다. spring.profiles.active=de...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.