在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

发现速度很慢,应该怎么样优化?
...全文
942 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建索引

17,377

社区成员

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

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