2

我不得不将数据从 oracle 表复制到文件中。

我有一个获取 800k 记录的连接查询,所以我使用 row_number() 函数和 order by 子句生成 4 个文件,每个文件包含 200k。

询问 :

SELECT * FROM (
    SELECT  ROW_NUMBER() OVER ( order by FILE_KEY desc ) rn,
        FILE_KEY, ROUTING_NO, INTLROUT_TYPE, ABBR_COUNTRY_CODE_2D, HO_CATALOG_NO 
    FROM BANK_INTL_ROUT_TBL rout, BANK_INTL_LOC_TBL loc 
    WHERE loc.CATALOG_NO = rout.FILE_KEY) 
WHERE rn BETWEEN start AND end;

参数:

For 1st File  : start =1 ,end = 200000
For 2nd File  : start =200001 ,end = 400000
For 3rd File  : start =400001 ,end = 600000
For 4th File  : start =600001 ,end = 800000

但是,当我在 sql 查询浏览器中使用此查询检查最后 10 行并且文件的最后 10 行不同时,文件和 sql 查询浏览器中的序列不同。

SELECT * FROM (
    SELECT  ROW_NUMBER() OVER(  order by FILE_KEY desc ) rn,
        FILE_KEY,ROUTING_NO,INTLROUT_TYPE,ABBR_COUNTRY_CODE_2D,HO_CATALOG_NO 
    FROM BANK_INTL_ROUT_TBL rout, BANK_INTL_LOC_TBL loc 
    WHERE loc.CATALOG_NO=rout.FILE_KEY) 
WHERE rn BETWEEN 709990 AND 80000;
4

3 回答 3

1

这可能是因为你有这样的东西

row_number file_key 
799998     same_number
799999     same_number
800000     same_number
800001     same_number
800002     same_number
800003     same_number
800004     same_number

因为您按 file_key 订购。

您如何观察到不同的数据?从你的其他专栏。因此,您可以使用:

SELECT  ROW_NUMBER() OVER(order by FILE_KEY desc, ROUTING_NO, INTLROUT_TYPE, ABBR_COUNTRY_CODE_2D, HO_CATALOG_NO ) rn

或者(第二个原因),您的基表在您的查询之间已更改。

UDPDATE:您可以使用use_hash提示来加快查询速度。5 小时对于这个查询来说太多了。

SELECT * FROM (
    SELECT  /*+use_hash(rout loc)*/
        ROW_NUMBER() OVER(order by FILE_KEY desc, ROUTING_NO, INTLROUT_TYPE, ABBR_COUNTRY_CODE_2D, HO_CATALOG_NO ) rn,
        FILE_KEY, ROUTING_NO, INTLROUT_TYPE, ABBR_COUNTRY_CODE_2D, HO_CATALOG_NO 
    FROM BANK_INTL_ROUT_TBL rout, BANK_INTL_LOC_TBL loc 
    WHERE loc.CATALOG_NO = rout.FILE_KEY) 
WHERE rn BETWEEN start AND end;
于 2012-01-04T09:15:01.240 回答
1

在 over 子句中,按 BANK_INTL_LOC_TBL 中的唯一字段排序:

SELECT * FROM (
    SELECT  ROW_NUMBER() OVER ( order by loc.**LOC_KEY** desc ) rn,
        FILE_KEY, ROUTING_NO, INTLROUT_TYPE, ABBR_COUNTRY_CODE_2D, HO_CATALOG_NO 
    FROM BANK_INTL_ROUT_TBL rout, BANK_INTL_LOC_TBL loc 
    WHERE loc.CATALOG_NO = rout.FILE_KEY) 
WHERE rn BETWEEN start AND end
ORDER BY rn;

更新:根据@Shannon Severance 评论
添加 order by 子句

于 2012-01-04T09:20:15.357 回答
0

如果您在安装 Oracle 时有空闲磁盘(您应该这样做!),那么与其运行内部查询 4 ​​次,不如执行以下操作可能会更快

CREATE TABLE bank_data
NOLOGGING
PARALLEL 4
AS SELECT  ROW_NUMBER() OVER ( order by FILE_KEY desc ) rn,
    FILE_KEY, ROUTING_NO, INTLROUT_TYPE, ABBR_COUNTRY_CODE_2D, HO_CATALOG_NO 
FROM BANK_INTL_ROUT_TBL rout, BANK_INTL_LOC_TBL loc 
WHERE loc.CATALOG_NO = rout.FILE_KEY);

要使用的并行量(4我的示例中的数量)将取决于您的数据库可以处理多少并发工作,主要取决于 CPU 的数量。

完成之后,(这应该花费不到 5 个小时!)然后您可以在bank_dump表格上运行简单的选择以提取您想要的记录

SELECT *
FROM bank_dump
where rn < 200000

例如,对于您的第一个数据集。

于 2012-01-04T16:38:35.957 回答