将数据从SQL Server数据库推送到Greenplum数据库的最有效方法?

时间:2013-04-16 14:56:24

标签: sql-server-2008 upload ssis greenplum

Greenplum数据库版本: PostgreSQL 8.2.15(Greenplum Database 4.2.3.0 build 1)

SQL Server数据库版本: Microsoft SQL Server 2008 R2(SP1)

我们目前的做法:

1)将每个表导出到SQL Server的平面文件中

2)使用PSQL Console的psql.exe实用程序将数据加载到带有pgAdmin III的Greenplum中


...带来了好处

  • 速度:好的,但有什么更快的吗?我们在几分钟内加载数百万行数据

  • 自动化:好的,我们使用VB中的Shell脚本从SSIS包中调用此实用程序


...陷阱

  • 可靠性:ETL依赖于文件服务器来保存平面文件

  • 安全性:文件服务器上有很多可能敏感的数据

  • 错误处理:这是一个问题。 psql.exe永远不会引发我们可以捕获的错误,即使它出错并且没有加载任何数据或部分文件


我们还尝试了什么......

.Net Providers \ Odbc Data Provider:我们使用DataDirect 6.0 Greenplum Wire Protocol配置了系统DSN。 DELETE的良好性能。 INSERT的狗很慢

作为参考,这是上面提到的SSIS中的VB脚本......

Public Sub Main()

    Dim v_shell
    Dim v_psql As String


    v_psql = "C:\Program Files\pgAdmin III\1.10\psql.exe -d "MyGPDatabase" -h "MyGPHost" -p "5432" -U "MyServiceAccount" -f \\MyFileLocation\SSIS_load\sql_files\load_MyTable.sql"

    v_shell = Shell(v_psql, AppWinStyle.NormalFocus, True)

End Sub


这是“load_MyTable.sql”文件的内容......

\copy MyTable from '\\MyFileLocation\SSIS_load\txt_files\MyTable.txt' with delimiter as ';' csv header quote as '"'

1 个答案:

答案 0 :(得分:1)

如果您在几分钟内完成数据加载,那么当前的方法可能就足够了。但是,如果您发现自己必须加载更大量的数据(例如太字节),那么批量加载到Greenplum的常用首选方法是通过gpfdist和相应的EXTERNAL TABLE定义。 gpload是一个不错的包装器,它提供了对这个过程的大部分抽象,并且由YAML控制文件驱动。一般的想法是gpfdist实例在您的数据被暂存的位置旋转,最好是CSV文本文件,然后Greenplum中的EXTERNAL TABLE定义被告知gpfdist个实例的URI。在管理指南中,此类外部表的示例定义如下所示:

CREATE READABLE EXTERNAL TABLE students (
name varchar(20), address varchar(30), age int)
LOCATION ('gpfdist://<host>:<portNum>/file/path/')
FORMAT 'CUSTOM' (formatter=fixedwidth_in,
name=20, address=30, age=4,
preserve_blanks='on',null='NULL');

上面的示例希望读取其字段从左到右是20个字符(最多)字符串,30个字符的字符串和整数的文本文件。要将此数据实际加载到GP中的临时表中:

CREATE TABLE staging_table AS SELECT * FROM students;

对于大量数据,这应该是最有效的方法,因为所有段主机都参与并行加载。请记住,上面简化的方法可能会导致随机分布的表,这可能是不可取的。您必须自定义表定义以指定分发键。