有外连接的情况下的SQL优化问题?

[复制链接]
查看11 | 回复9 | 2006-5-9 18:02:12 | 显示全部楼层 |阅读模式
在一些SQL上加上外连接后执行速度将会变快,执行情况如下
SQL> select dequeue.id from dequeue,clients where dequeue.cstid = clients.cstid;
已选择81125行。
已用时间:00: 00: 05.32
Execution Plan
----------------------------------------------------------
0SELECT STATEMENT Optimizer=CHOOSE (Cost=961 Card=10900537 By

tes=305215036)
10 NESTED LOOPS (Cost=961 Card=10900537 Bytes=305215036)
21 TABLE ACCESS (FULL) OF 'DEQUEUE' (Cost=961 Card=84461 By

tes=1942603)
31 INDEX (UNIQUE SCAN) OF 'PK_CLIENTS' (UNIQUE)


Statistics
----------------------------------------------------------

0recursive calls

4db block gets
171159consistent gets
5957physical reads

0redo size
2640034bytes sent via SQL*Net to client
600713bytes received via SQL*Net from client
5410SQL*Net roundtrips to/from client

2sorts (memory)

0sorts (disk)
81125rows processed
SQL> select dequeue.id from dequeue,clientswhere dequeue.cstid = clients.cstid(+);
已选择84560行。
已用时间:00: 00: 05.19
Execution Plan
----------------------------------------------------------
0SELECT STATEMENT Optimizer=CHOOSE (Cost=961 Card=10900537 By

tes=305215036)
10 NESTED LOOPS (OUTER) (Cost=961 Card=10900537 Bytes=3052150

36)
21 TABLE ACCESS (FULL) OF 'DEQUEUE' (Cost=961 Card=84461 By

tes=1942603)
31 INDEX (UNIQUE SCAN) OF 'PK_CLIENTS' (UNIQUE)


Statistics
----------------------------------------------------------

0recursive calls

4db block gets
171362consistent gets
5959physical reads

0redo size
2751786bytes sent via SQL*Net to client
626132bytes received via SQL*Net from client
5639SQL*Net roundtrips to/from client

2sorts (memory)

0sorts (disk)
84560rows processed
时间上是用了外连接的快,虽然看上去没有多少时间,但其他的查询中就出现了明显的差别。
不知道改如何进行理解呢?
回复

使用道具 举报

千问 | 2006-5-9 18:02:12 | 显示全部楼层
up
帮帮忙,谢谢!
回复

使用道具 举报

千问 | 2006-5-9 18:02:12 | 显示全部楼层
如果内连接都不快,外连接可能更加不会快了。
其他查询跟这个什么关系?
回复

使用道具 举报

千问 | 2006-5-9 18:02:12 | 显示全部楼层
但我上面不是把时间给出来了吗,就是在外连接时候要时间少啊
其中有两个执行计划相差
内:
2640034 bytes sent via SQL*Net to client
81125 rows processed
外:
2751786 bytes sent via SQL*Net to client
84560 rows processed
不知道SQL内部执行是如何都那?
回复

使用道具 举报

千问 | 2006-5-9 18:02:12 | 显示全部楼层
秒以下的时间差 能说明什么问题?
再说,第一次执行与第二次执行,服务器的负载完全一样么?
回复

使用道具 举报

千问 | 2006-5-9 18:02:12 | 显示全部楼层
不只是这个SQL,还有其他的,和这个有类似的问题,在加了外连接以后数据的检索速度就快了,我只是拿出一个来看,时间上相差还是比较大的,所有不知道为啥啊
回复

使用道具 举报

千问 | 2006-5-9 18:02:12 | 显示全部楼层
1. 首先:使用外连接是否完全符合你的业务需要 ?
2. 查询计划中的一些时间指标是不精确的,你应该启用
sql trace, 然后去看tkprof解析后生成的文件.
最初由 mark_liao 发布
[B]不只是这个SQL,还有其他的,和这个有类似的问题,在加了外连接以后数据的检索速度就快了,我只是拿出一个来看,时间上相差还是比较大的,所有不知道为啥啊 [/B]

回复

使用道具 举报

千问 | 2006-5-9 18:02:12 | 显示全部楼层
1、业务上呢确实如此,主表中的字段在子表中确实没有的时候
2、我也知道通过set autotrance方式出来的时间确实不是实际的执行时间,因为插入到了plan_table和生成具体表格的时间都在内了,但在查询中确实是由于加了外连接速度就上去好多了,这个明天到公司我可以将具体的SQL及其解析文件放上来。
现在想知道的各位有没有出现过同样的问题,然后又如何理解呢?
回复

使用道具 举报

千问 | 2006-5-9 18:02:12 | 显示全部楼层
我和你遇到的正相反,不加外联接的时候用100ms,加上外联接用3m,这又怎么解释呢?
回复

使用道具 举报

千问 | 2006-5-9 18:02:12 | 显示全部楼层
最初由 yanchang 发布
[B]我和你遇到的正相反,不加外联接的时候用100ms,加上外联接用3m,这又怎么解释呢? [/B]

我的也是加了外连接也快啊,所以才问为什么啊?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行