2012-02-19 7 views
3

데이터 로그 파일에 다음 형식의 데이터가 있습니다.효율적인 대량 데이터 삽입

각 행은 데이터베이스의 행을 나타내며 한 번에 500-1000 행이 삽입됩니다.

직접 저장 프로 시저를 호출하여 데이터베이스에 데이터를 삽입하는 것이 좋습니다되어

또는

이는 그것을 구문 분석하는 것이 좋습니다 (절차는 로그 파일과 데이터를 삽입 호출하는 로직을 포함) 응용 프로그램 및 데이터 삽입

29 2011-02-01 11:00:40 1 0 1 0 
    30 2011-02-01 11:00:44 1 0 1 0 
    32 2011-02-01 11:00:49 1 0 1 0 
+0

참조 HTTP 로우 암호 -t는 ","-r "\ n"

당신은 다른 방법 대신 -c의 ... -t -n 지정할 수 있습니다 /msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx – Phil

답변

0

은 대량의 데이터 삽입 (성능) 더 나은 (에서 LOAD를 사용하거나 거래를. 내가 뭔가 비슷한는 않습니다 저장소를 가정하고), 이상이 행 당 쿼리를 한 번에 하나씩 삽입 .

+0

클래스를 만들고 데이터베이스 대신 응용 프로그램에서 전처리 논리를 유지하는 것이 더 바람직하지 않다고 생각하십니까? – arjun

+0

SQL ser ver에는 사전 처리를 위해 작성한 코드만큼이나 최적화 된 기능이있을 가능성이 높습니다. 또한 서버와 스크립트 사이의 왕복 시간을 절약합니다. 파일 시스템의 절대 경로를 사용하여 파일에 액세스 할 수 있습니다 (동일한 서버에 있고 적절한 권한이 있다고 가정). 결국에는 트랜잭션을 사용하는 한 작동하며 500-1000 행의 경우 db를 직접 사용하거나 구문 분석 스크립트에서 쿼리를 수행 할 때 성능 차이가 최소화됩니다. – AlexanderZ

+0

그러나 온라인으로 호스팅하는 경우 파일 시스템에서 절대 경로를 어떻게 사용합니까? – arjun

1

아마도 .tsv 형식 (탭 구분 값) 일 것입니다.

LOAD DATA LOCAL INFILE 'uniq.csv' INTO TABLE tbl 
    FIELDS TERMINATED BY '\t' 
    ENCLOSED BY '' 
    LINES TERMINATED BY '\n' 
(column1, column2, column3) 

\ t는 탭 문자입니다. 그것이 작동하지 않으면 공간을 위해 그것을 변경하십시오.

행을 수동으로 읽는 행을 효율적으로 처리하지 못할 수 있습니다. 행 단위로 읽을 때 하드 디스크가 여러 번 액세스되기 때문입니다. LOAD 명령은 한 번에 전체 파일을 읽어야합니다.

인덱스는 이러한 삽입을 심각하게 느리게 할 수 있음을 기억해야합니다. 많은 데이터 (예 : 100000 행)를 읽어야하는 경우 - 삽입 후 인덱스를 삭제하고, 삽입하고, 다시 작성하는 것이 더 나은 경우가 있습니다.

+0

또 다른 문제는 데이터베이스와 응용 프로그램이 모두 온라인으로 호스팅되는 경우 데이터베이스에서 파일에 액세스하는 방법입니다. – arjun

+0

클래스를 만들고 데이터베이스 대신 응용 프로그램에서 사전 처리 논리를 유지하는 것이 더 좋다고 생각하지 않습니까? – arjun

1

BCP (대량 복사) 명령을 대신 사용할 수도 있습니다.

Excel에서이 로그 파일을 가져 와서 별도의 열 이름을 사용하여 csv로 저장하십시오. cmd 프롬프트에서 테이블로 가져 오려면 다음 구문을 사용하십시오.

는 $ \ 프로그램 Files \ Microsoft SQL Server에 \ 100 개 \ 도구 TABLENAME에 cmd 프롬프트

BCP에 BINN을 \ 가서 "D : \ 로그 \ log.csv"-c -S 서버 이름 -U 사용자 이름 -P 쉼표로 구분, -r : - : - :/터미네이터