2017-10-20 1 views
3

SQL Server 데이터베이스로드 프로세스의 CSV 파일 성능을 향상시키는 기법을 찾고 있습니다. 나는 다양한 접근법을 시도해 왔지만 나는 아무것도하지 않아서 5.5 시간의 장벽을 무너 뜨릴 수있을 것 같다. 그것은 단지 약 200 만 건의 데이터를로드하는 테스트입니다. 결국로드 할 데이터가 20 년이므로 결국 4 일 동안 데이터를로드하면 작업하지 않을 것입니다.Python과 SQL Server를 사용하는 ETL 프로세스는로드하는 데 오랜 시간이 걸립니다.

도전 과제는 데이터가로드시에 풍부 해져야한다는 것입니다. 해당 정보가 파일에 고유하지 않기 때문에 일부 열을 추가해야합니다. 지금까지 시도 :

  1. petl을 사용하여 데이터에 열을 추가 한 다음 데이터베이스로 플러시합니다.
  2. 팬더를 사용하여 데이터에 열을 추가 한 다음 데이터 프레임을 데이터베이스로 플러시합니다.
  3. 중간로드 준비를 사용하여 중간 준비 테이블을로드 한 다음 T-SQL을 사용하여 추가 열을 채운 다음 최종 준비 테이블로 밀어 넣습니다.

대량로드가 작동하지만 실제로 여분의 열에 대한 데이터를 추가해야하며 여기서 병목 현상이라고 생각되는 행 수준의 작업으로 돌아갑니다. 시도 할 준비가되었습니다.

  1. 데이터를 팬더에 첨부합니다.
  2. 데이터를 CSV에 다시 쓰는 중입니다.
  3. CSV 대량로드.

두 가지 I/O 작업이 있기 때문에이 작업이 번거롭습니다. 파일을 판다로 읽고 파일을 다시 작성하십시오.

나는 팬더가 C로 작성되었거나 무엇인가가 정말 빨라야한다고 읽었습니다. 데이터 프레임을 데이터베이스로 플러시하는 것은 그다지 빠르지 않았습니다. 이 시점에서, 나는 누군가가 현실 세계에서 사용하는 더 빠른 접근법을 가지고 있는지 묻고있다.

import pypyodbc 
conn_str = "DSN=[dsn name];" 
cnxn = pypyodbc.connect(conn_str) 
crsr = cnxn.cursor() 
sql = "BULK INSERT pre_stage_view FROM '[file path]' WITH (FIELDTERMINATOR = ',',ROWTERMINATOR = '\n')" 
crsr.execute(sql) 
cnxn.commit() 
crsr.close() 
cnxn.close() 

이이 저장 프로 시저가 헤더를 제거한다 : 지금까지 내가 가지고있는 다음과 같습니다

DELETE FROM pre_stage_table WHERE Symbol = 'Symbol' 


INSERT INTO stage_table(
[Symbol], 
[Exchange], 
[Date], 
[Open], 
[High], 
[Low], 
[Close], 
[Volume], 
[SourceSystem], 
[RunDate] 
) 
SELECT 
[Symbol], 
@exchange, --passed in proc parameter 
[Date], 
[Open], 
[High], 
[Low], 
[Close], 
[Volume], 
'EODData', 
CURRENT_TIMESTAMP 
FROM pre_stage_table 


TRUNCATE TABLE pre_stage_table 

답변

2

대량로드가 정말 빠르게 작동하지만 나는 여분의 데이터를 추가해야 우리는 여기서 병목 현상이라고 생각하는 행 수준의 작업으로 되돌아갑니다.

미안하지만 왜 행 수준의 작업이 있는지 이해할 수 없습니다. 시도 :

1) 대량로드를 당신은 여전히 ​​아마도 괜찮은 성능을 가진 접근 방법을 설정 기반 얻을 것이다

목표 테이블과 테이블을

2) MERGE 단계 테이블을 무대. 가능한 경우 대상에서 트리거를 사용하지 않도록 설정하고 인덱스를 삭제하고 데이터를로드 한 다음 다시 작성할 수 있습니다.

+0

내가 제대로 이해한다면, 나는 무대에서 전 단계로 플러시 할 때 행을 한 줄씩 삽입하는 간단한 삽입 작업을하고 있습니다. 내가 너의 제안을 시도하자. –

+1

5 시간에서 3 분까지 !! 하하하 !! 좋은! FTW! 감사! 특정 사용 사례에서 MERGE를 사용하지 않았을 것입니다. –

+0

@BobWakefield 우수. 내가 정말 도와 줘서 기뻐. :) – lad2025

관련 문제