SQL Server 데이터베이스로드 프로세스의 CSV 파일 성능을 향상시키는 기법을 찾고 있습니다. 나는 다양한 접근법을 시도해 왔지만 나는 아무것도하지 않아서 5.5 시간의 장벽을 무너 뜨릴 수있을 것 같다. 그것은 단지 약 200 만 건의 데이터를로드하는 테스트입니다. 결국로드 할 데이터가 20 년이므로 결국 4 일 동안 데이터를로드하면 작업하지 않을 것입니다.Python과 SQL Server를 사용하는 ETL 프로세스는로드하는 데 오랜 시간이 걸립니다.
도전 과제는 데이터가로드시에 풍부 해져야한다는 것입니다. 해당 정보가 파일에 고유하지 않기 때문에 일부 열을 추가해야합니다. 지금까지 시도 :
- petl을 사용하여 데이터에 열을 추가 한 다음 데이터베이스로 플러시합니다.
- 팬더를 사용하여 데이터에 열을 추가 한 다음 데이터 프레임을 데이터베이스로 플러시합니다.
- 중간로드 준비를 사용하여 중간 준비 테이블을로드 한 다음 T-SQL을 사용하여 추가 열을 채운 다음 최종 준비 테이블로 밀어 넣습니다.
대량로드가 작동하지만 실제로 여분의 열에 대한 데이터를 추가해야하며 여기서 병목 현상이라고 생각되는 행 수준의 작업으로 돌아갑니다. 시도 할 준비가되었습니다.
- 데이터를 팬더에 첨부합니다.
- 데이터를 CSV에 다시 쓰는 중입니다.
- 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
내가 제대로 이해한다면, 나는 무대에서 전 단계로 플러시 할 때 행을 한 줄씩 삽입하는 간단한 삽입 작업을하고 있습니다. 내가 너의 제안을 시도하자. –
5 시간에서 3 분까지 !! 하하하 !! 좋은! FTW! 감사! 특정 사용 사례에서 MERGE를 사용하지 않았을 것입니다. –
@BobWakefield 우수. 내가 정말 도와 줘서 기뻐. :) – lad2025