在Oracle数据库中的大表联合查询速度慢的问题

wangwolue 2008-03-28 06:18:41

在Oracle数据库中的大表联合查询速度慢的问题

表A 有 6个字段, 共1000万条数据

TableA(c1,c2,c3,c4,c5,c6)

表B有30个字段, 共20万条数据
TableB(b1,b2,b3,b4,...b30)

c1,a1为自动增长ID
c2与b1是相关联的
b1,c2已经建了索引

现在要对表A与表B联合查询。分页显示

SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (
select c1,c2,b1,b3,b4 from
TableA INNER JOIN TableB
ON TableA.c2= TableB.b1
) A
WHERE ROWNUM <= 20
)
WHERE RN >= 1

发现速度很慢,应该怎么样优化?
...全文
1010 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
codearts 2008-04-03
  • 打赏
  • 举报
回复
楼主问题解决了吗,速度满意了不?

NESTED LOOPS 取前面的几条记录果然比HASH JOIN 快。

因为我不会用 TOAD ,所以看不出你的执行计划走的是CBO还是RBO。
如果你现在的是走RBO,可改再改变一下表的顺序,试试速度还能不能快一些


SELECT /*+FIRST_ROWS*/ * FROM
(
SELECT A.*, ROWNUM RN
FROM (
select c1,c2,b1,b3,b4 from
TableB INNER JOIN TableA --注:这里B和A换了顺序
ON TableB.b1 = TableA.c2
) A
WHERE ROWNUM <= 20
)
WHERE RN >= 1
wangwolue 2008-04-02
  • 打赏
  • 举报
回复
TOAD 中的 Explain Plan 结果是
Operation Object Name Rows Bytes Cost TQ In/Out PStart PStop

SELECT STATEMENT 3 53200.2735894507
VIEW 3 264 53200.2735894507
COUNT STOPKEY
HASH JOIN 10 M 504 M 53200.2735894507
TABLE ACCESS FULL TABLEA 229 K 4 M 2435.62515704857
TABLE ACCESS FULL TABLEB 10 M 298 M 19145.2123743017
wangwolue 2008-04-02
  • 打赏
  • 举报
回复
Operation Object Name Rows Bytes Cost TQ In/Out PStart PStop

SELECT STATEMENT 3 10 M
VIEW 3 264 10 M
COUNT STOPKEY
NESTED LOOPS 10 M 504 M 10 M
TABLE ACCESS FULL TABLEA 10 M 298 M 19145.2123743017
TABLE ACCESS BY INDEX ROWID TABLEB 1 20 1.00142957293938
INDEX UNIQUE SCAN IDX_TABLEB_B1 1 .000752545242876267
wangwolue 2008-04-02
  • 打赏
  • 举报
回复
加了/*+FIRST_ROWS*/ 就快了,谢谢codearts .
codearts 2008-04-02
  • 打赏
  • 举报
回复
没走索引,加个 /*+FIRST_ROWS*/ 提示看看

SELECT /*+FIRST_ROWS*/ * FROM
(
SELECT A.*, ROWNUM RN
FROM (
select c1,c2,b1,b3,b4 from
TableA INNER JOIN TableB
ON TableA.c2= TableB.b1
) A
WHERE ROWNUM <= 20
)
WHERE RN >= 1

另外就是,你的索引建好了没有?分析了吗?
codearts 2008-04-01
  • 打赏
  • 举报
回复
分析表,分析索引!

ANALYZE table tableA COMPUTE STATISTICS
ANALYZE table tableB COMPUTE STATISTICS

sqlplus的话,用set autotrace on 显示执行计划
codearts 2008-03-31
  • 打赏
  • 举报
回复
楼主的这个sql应该不慢吧?只取前20条记录,不会慢到哪里去

表有分析过么?走的是CBO还是RBO?

请帖出执行计划
wangwolue 2008-03-31
  • 打赏
  • 举报
回复
SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (
select c1,c2 from
TableA ) A
WHERE ROWNUM <= 20
)
WHERE RN >= 1

不联合查询是不用1秒的,

SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (
select c1,c2,b1,b3,b4 from
TableA INNER JOIN TableB
ON TableA.c2= TableB.b1
) A
WHERE ROWNUM <= 20
)
WHERE RN >= 1
联合查询要3到4分钟
mellonqin 2008-03-30
  • 打赏
  • 举报
回复
把INNER JOIN 改为left join.
fosjos 2008-03-28
  • 打赏
  • 举报
回复
先看看解释计划
再加入hint试试
如果允许的话,试试c2,c1建索引,b1,b3,b4建索引
内容概要:本文针对高渗透率分布式光伏与储能变流器接入配电网所带来的运行挑战,深入研究了传统跟网型(GFL)逆变器在电网故障、弱电网及孤岛工况下易失稳脱网,以及构网型(GFM)虚拟同步发电机(VSG)逆变器在并网状态下缺乏同步调节能力的技术瓶颈,提出了一种可实现GFL与GFM双向平滑切换的先进控制策略。研究首先构建了GFL与GFM共用的硬件平台与内环控制基础,继而系统性地设计了基于关键电气量实时监测的切换判据、精确的双向切换时序逻辑,并创新性地引入了过渡过程的平滑抑制策略,以有效抑制切换瞬间的有功功率冲击、电压闪变与频率突变。全文在Matlab/Simulink环境搭建了完整的仿真模型,通过对并网转孤岛、孤岛转并网等多种工况的动态仿真,全面验证了所提策略的有效性,结果表明该方法能确保系统在模式切换过程电压、电流与频率的平稳过渡,显著提升了微电网在复杂运行条件下的韧性、稳定性与供电可靠性。; 适合人群:从事电力电子、新能源并网、微电网控制、智能配电网等领域的高校研究生、科研院所研究人员及电力系统相关企业的工程技术人员。; 使用场景及目标:① 解决高比例可再生能源接入引发的电网稳定性与电能质量问题;② 实现微电网在并网与孤岛两种运行模式间的无缝、可靠切换,保障重要负荷的不间断供电;③ 为构网型与跟网型逆变器的协同运行、新型电力系统构建提供先进的控制理论依据与可落地的技术解决方案。; 阅读建议:建议结合文提供的Simulink仿真模型进行深入学习,重点剖析切换逻辑模块的设计原理与参数整定方法,通过反复观察和分析不同工况下的仿真波形,深刻理解平滑切换过程的动态响应机理与控制思想。

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧