2017-10-20 36 views
3

我在寻找一种可以提高csv文件SQL Server数据库加载过程性能的技术。我尝试了各种方法,但我没有做任何事似乎能够打破5.5小时的障碍。这只是测试加载一年约200万条记录的数据。我有20年的数据最终加载,所以连续4天加载数据不会奏效。使用Python和SQL Server进行ETL过程需要很长时间才能加载

挑战在于,数据必须在负载上得到丰富。我必须添加一些列,因为这些信息不是本地文件。到目前为止,我尝试过:

  1. 使用petl将列追加到数据,然后将其刷新到数据库。
  2. 使用“熊猫”将列附加到数据,然后将数据框刷新到数据库。
  3. 使用批量加载来加载中间临时表,然后使用T-SQL来填充额外的列,然后将其推送到最终的临时表。

大容量装载工作非常快速,但随后我必须为额外的列添加数据,我们又回到了行级操作,我认为这是瓶颈。我准备尝试:

  1. 将数据附加到熊猫。
  2. 将数据写回CSV。
  3. 批量加载CSV。

这使我困扰,因为我现在有两个I/O操作。将文件读入熊猫并将文件重新写回。

我在某处读到Pandas是用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

从五小时到三分钟!哈哈哈! NICE! FTW!谢谢!从来没有想过在该特定用例中使用MERGE。 –

+0

@BobWakefield优秀。我很高兴能够帮助我:) – lad2025

相关问题