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 更新一个表中的值以匹配 Oracle SQL Developer 中另一个表的值
oracle 客户端 sql developer 如何修改jdk版本