如题,一段SQL中,用到了4张远程表,对其中2张做了DRIVING_SITE
从理论上讲,对性能会有帮助么。
解决方案 »
- ebs不能为更新或删除保留记录
- 运行系统时报错,请各位高手指点
- 使用oracle sql developer定义包,报错误: PLS-00103: 出现符号 "CREATE"
- 安装oracle 10g 时 出现“无法确定主机IP地址”异常
- 关于9i修改表空间存储区设置的问题
- Oracle 出了这样的问题,高手们,乍办?
- 如何查询数据库中是否存在一张表和数据库?
- Oracle 11g DBConsole 登陆时出现证书错误该如何解决????
- 新手再问关于数据比较的问题。这次是VARCHAR2型和date型比较。请进来看看。
- 记录是按怎样的顺序select出来的?
- Curl 怎么使用put和delete方法?
- 各位老大,谁能给个数据库学习资料
DISTINCT t1.itemcode as itemcode
FROM cim03 t1
INNER JOIN cim25 t2 ON t1.itemcode = t2.itemcode
WHERE t1.itemkbn IN ( '01','02','08')
AND t1.itemcode IN ('0011008300','0011009300','0011018100',
'0011020000','0011046000','0011047000')
AND t1.insertdate <= 20130828
AND EXISTS(SELECT 1
FROM ciy80 t3
, ciy81 t4
WHERE t1.itemcode = t4.itemcode) ORDER BY bcode asc , jcode asc , itemcode ascCIM03 CIM25 CIY80 CIY81 都是远程表
其中80,81的数据偏大。
DISTINCT t1.itemcode as itemcode
FROM cim03 t1
INNER JOIN cim25 t2 ON t1.itemcode = t2.itemcode
WHERE t1.itemkbn IN ( '01','02','08')
AND t1.itemcode IN ('0011008300','0011009300','0011018100',
'0011020000','0011046000','0011047000')
AND t1.insertdate <= 20130828
AND EXISTS(SELECT 1
FROM ciy80 t3
, ciy81 t4
WHERE t1.itemcode = t4.itemcode) ORDER BY bcode asc , jcode asc , itemcode asc
后来客户那边数据太大,一跑CPU飚到100%
跪了。
http://blog.sina.com.cn/s/blog_6cea217301019cpn.html
http://blog.sina.com.cn/s/blog_6cea217301019cpn.html
就如同我上面的SQL一样,因为80,81表没有加HINT,所以会不会把这两张表的数据取到本地
DB执行了。
从执行计划中能判断出80,81的执行场所么?
SELECT 1
FROM ciy80 t3, ciy81 t4 WHERE t1.itemcode = t4.itemcode,你的t3表没用到啊
http://blog.sina.com.cn/s/blog_6cea217301019cpn.html
就如同我上面的SQL一样,因为80,81表没有加HINT,所以会不会把这两张表的数据取到本地
DB执行了。
从执行计划中能判断出80,81的执行场所么?driving_site的相关说明:
对于那些存在远程的SQL,ORACLE可以有两种选择:
1,在远端执行SQL
2,在本地执行SQL
至于如果选择SQL的执行地点呢,这完全是由SQL决定的,看在哪端执行的COST低就在哪端执行。但是ORACLE并不总是那么聪明,所以有的时候需要我们自己觉得SQL在哪端执行。我们可以driving_site这个HINT来决定SQL的执行。
看下面的SQL:SELECT /*+driving_site(a)*/
a.column_1,
b.column_2
FROM table_1@dl_remote a,
table_2 b
WHERE a.column_1 = b.column;由于table_1是远端的表,在/*+driving_site(a)*/提示的影响下,oracle会把表table_2发送到dl_remote所指的远端,
然后在远端进行连接,最后把执行的结果在返回给本地。SELECT /*+driving_site(b)*/
a.column_1,
b.column_2
FROM table_1@dl_remote a,
table_2 b
WHERE a.column_1 = b.column;由于table_2是本地的表,在/*+driving_site(b)*/提示的影响下,oracle会把表table_1的数据取到本地,
然后在本地进行连接,最后把执行的结果在返回。如果表table_1和table_2的记录数相差很多的话,选择合适的执行端就显得极其重要了。你可以看执行计划,这个hits有没有用到
这个条件漏掉了
你把执行计划打出来
remote对应的表就是被放到远端执行的表你的这个查询中用到的表都是在远端,因此你加driving_site应该是没有效果的吧?
https://forums.oracle.com/thread/962996收工!