将一个表的数据加载到驻留在不同数据库中的另一个表中 - Netezza
Posted
技术标签:
【中文标题】将一个表的数据加载到驻留在不同数据库中的另一个表中 - Netezza【英文标题】:Loading data of one table into another residing on different databases - Netezza 【发布时间】:2014-02-26 04:14:49 【问题描述】:我有一个大文件,我使用 ETL 工具将它加载到 netezza 数据库的表中,我们将此数据库称为 Staging_DB
。现在,发布一些验证,该表的内容需要插入到位于另一个 netezza DB 中的类似结构化表中,我们称之为PROD_DB
。将数据从staging_DB
传输到PROD_DB
的最快方法是什么?
-
我应该使用 ETL 工具将数据加载到
PROD_DB
吗?或者,
是否应使用外部表概念进行传输?
【问题讨论】:
如果在将数据插入 PROD_DB 之前不需要进行任何转换,您绝对应该取消使用 ETL 工具的选项。 【参考方案1】:如果不需要进行转换,那么更好的传输方式是跨数据库数据传输。如 Netezza 文档中所述,Netezza 支持跨数据库支持,其中用户对两个数据库都具有对象级权限。
您可以使用以下命令检查权限 -
dbname.schemaname(loggenin_username)=> \dpu username
请在下面找到工作示例 -
INSERT INTO Staging_DB..TBL1 SELECT * FROM PROD_DB..TBL1
如果你想做一些转换,然后你需要插入另一个数据库,那么你可以编写 UDT 过程(也称为结果集过程)。
希望这会有所帮助。
【讨论】:
【参考方案2】:移动数据的一种方法是使用Transient External Tables
。首先从源表/db 创建一个平面文件。因为您是从Netezza
移动到Netezza
,所以您可以通过打开压缩和使用internal
格式来节省时间和空间。
CREATE EXTERNAL TABLE 'C:\FileName.dat'
USING (
delim 167
datestyle 'MDY'
datedelim '/'
maxerrors 2
encoding 'internal'
Compress True
REMOTESOURCE 'ODBC'
logDir 'c:\' ) AS
SELECT * FROM source_table;
然后使用源中相同的DDL
在目标数据库中创建表并加载它。
INSERT INTO target SELECT * FROM external 'C:\FileName.dat'
USING (
delim 167
datestyle 'MDY'
datedelim '/'
maxerrors 2
encoding 'internal'
Compress True
REMOTESOURCE 'ODBC'
logDir 'c:\' );
【讨论】:
【参考方案3】:我会在生产数据库上编写一个 SP,并从阶段到生产数据库进行 CTAS。 SP 的美妙之处在于您也可以添加转换。 另一种选择是 Netezza 提供的 NZ migrate 实用程序,这是我认为最快的路线。
【讨论】:
【参考方案4】:一个简单的 SQL 查询,如
INSERT INTO Staging_DB..TBL1 SELECT * FROM PROD_DB..TBL1
如果您只需要这样做,效果很好。
请注意,执行查询时必须连接到目标数据库,否则会收到错误代码
HY0000:“这种类型的命令不支持跨数据库访问”
即使您对数据库和表都有读/写访问权限。
【讨论】:
【参考方案5】:在大多数情况下,您可以使用“设置目录”命令简单地更改目录
https://www-304.ibm.com/support/knowledgecenter/SSULQD_7.0.3/com.ibm.nz.dbu.doc/r_dbuser_set_catalog.html
【讨论】:
【参考方案6】:set catalog='database_name';
insert into target_db.target_schema.target_table select source_db.source_schema.source_table;
【讨论】:
以上是关于将一个表的数据加载到驻留在不同数据库中的另一个表中 - Netezza的主要内容,如果未能解决你的问题,请参考以下文章
在 MySQL 中,如何将一张表的内容复制到同一个数据库中的另一张表中?