oracle sql developer中的偏移和获取

Posted

技术标签:

【中文标题】oracle sql developer中的偏移和获取【英文标题】:Offset and fetch in oracle sql developer 【发布时间】:2016-03-04 08:26:04 【问题描述】:

我们有数百万的数据(总行 1698393)。以文本形式导出此数据需要 4 小时。我需要知道是否有办法减少使用 SQL Developer 从 Oracle 数据库中导出这些记录的时间。

with cte as (
  select *
  from (
   select distinct
          system_serial_number,
          ( select s.system_status
            from   eim_pr_system s
            where  .system_serial_number=a.system_serial_number
          ) system_status,
          ( select SN.cmat_customer_id
            from   EIM.eim_pr_ib_latest SN
            where  SN.role_id=19
            and    SN.system_serial_number=a.system_serial_number
          ) SN_cmat_customer_id,
          ( select  EC.cmat_customer_id
            from EIM.eim_pr_ib_latest EC
            where EC.role_id=1
            and   a.system_serial_number=EC.system_serial_number
          ) EC_cmat_customer_id
    from  EIM.eim_pr_ib_latest a
    where a.role_id in (1,19)
  ) 
  where nvl(SN_cmat_customer_id,0)!=nvl(EC_cmat_customer_id,0)
)
select system_serial_number,
       system_status,
       SN_CMAT_Customer_ID,
       EC_CMAT_Customer_ID,
       C.Customer_Name SN_Customer_Name,
       D.Customer_Name EC_Customer_Name
from   cte,
       eim.eim_party c,
       eim.eim_party D
where  c.CMAT_Customer_ID=SN_cmat_customer_id
and    D.CMAT_Customer_ID=EC_cmat_customer_id;
offset first 5001 rows fetch next 200000 rows only

【问题讨论】:

用于测试的样本数据...它是原始查询的输出 SYSTEM_SERIAL_NUMBER SYSTEM_STATUS SN_CMAT_CUSTOMER_ID EC_CMAT_CUSTOMER_ID SN_CUSTOMER_NAME EC_CUSTOMER_NAME 0000299DF0053 ACTIVE -999999 5016269 NetApp公司100092756 INACTIVE 5019768 -999999科技系统集成和技术分销AG 100007122 DECOMISSIONED 5007419 6062535哈特福德人寿保险欧力士人寿保险公司100007127 DECOMISSIONED 5016269 -999999 NetApp Inc. 1000511 DECOMISSIONED 6004941 -999999 Strato Rechenzentrum AG 100653517 ACTIVE 5008192 5015642 General Dynamics Corp. Maryland 采购办公室 【参考方案1】:

您可以通过执行以下操作来摆脱大量连接和相关子查询(这将通过减少表扫描次数来加快处理速度):

SELECT a.system_serial_number,
       s.system_status,
       a.SN_cmat_customer_id,
       a.EC_cmat_customer_id,
       a.SN_customer_name,
       a.EC_customer_name
FROM   (
  SELECT l.system_serial_number,
         MAX( CASE l.role_id WHEN 19 THEN l.cmat_customer_id END ) AS SN_cmat_customer_id,
         MAX( CASE l.role_id WHEN  1 THEN l.cmat_customer_id END ) AS EC_cmat_customer_id
         MAX( CASE l.role_id WHEN 19 THEN p.customer_name END ) AS SN_customer_name,
         MAX( CASE l.role_id WHEN  1 THEN p.customer_name END ) AS EC_customer_name
  FROM   EIM.eim_pr_ib_latest l
         INNER JOIN
         EIM.eim_aprty p
         ON ( p.CMAT_Customer_ID= l.cmat_customer_id )
  WHERE  l.role_id IN ( 1, 19 )
  GROUP BY system_serial_number
  HAVING    NVL( MAX( CASE l.role_id WHEN 19 THEN l.cmat_customer_id END ), 0 )
         <> NVL( MAX( CASE l.role_id WHEN  1 THEN l.cmat_customer_id END ), 0 )
) a
LEFT OUTER JOIN
eim_pr_system s
ON ( s.system_serial_number=a.system_serial_number )

由于您的原始查询没有在相关子查询上引发 TOO_MANY_ROWS 异常,我假设您的数据是这样的,即每个相关查询只返回一行,并且上述查询将反映您的输出(虽然没有一些样本数据很难测试)。

【讨论】:

【参考方案2】:

除了“使查询更快”之外,还有一种方法可以使用 SQL Developer 实现更快的导出。

当您使用数据网格时,导出功能 - 这将再次执行查询。唯一不会发生这种情况的情况是,如果您已将所有行提取到网格中。对于非常大的数据集,这样做会在客户端“昂贵”,但您可以避免这种情况。

为了更快地导出,请在您的选择中添加 /*csv*/ 注释,并使用假脱机 c:\my_file.csv 包装语句 - 然后折叠脚本输出面板,并使用 F5 运行它。当我们获取数据时,我们将以 CSV 格式将其写入该文件。

/*csv*/
/*xml*/
/*json*/
/*html*/
/*insert*/

我详细谈谈这个功能here。

【讨论】:

以上是关于oracle sql developer中的偏移和获取的主要内容,如果未能解决你的问题,请参考以下文章

sql developer哪个版本

SQL 更新一个表中的值以匹配 Oracle SQL Developer 中另一个表的值

oracle 客户端 sql developer 如何修改jdk版本

oracle sql developer中的IIF语句

如何避免 Oracle SQL Developer 中的变量替换

为啥 SQL Developer 与 SQL Plus 中的 Oracle PL/SQL 响应时间存在差异?