分类: Oracle
2008-04-23 11:23:28
SQL> ALTER TABLE T ADD PRIMARY KEY (ID);
表已更改。
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'T')
PL/SQL 过程已成功完成。
SQL> CREATE DATABASE LINK YTK102 CONNECT TO YANGTK IDENTIFIED BY YANGTK USING 'YTK102';
数据库链接已创建。
在这个例子中,需要更新YTK102数据库中T表的TYPE字段,如果T表中一条记录的ID可以在远端T1、T2、T3表的联合查询中查询到,则这条记录的TYPE应该更新为1,如果查询不到对应的记录,则需要更新TYPE的值为O,如果当前的TYPE的值已经满足要求,则不需要进行更新。
最简单的方法莫过于更新两次,每次只更新一部分数据:
PL/SQL 过程已成功完成。
已用时间: 00: 00: 44.28
SQL> ROLLBACK;
回退已完成。
已用时间: 00: 00: 01.10
当然,也可以通过一个UPDATE来实现更新,只不过逻辑略微复杂了一点:
|
SQL> ROLLBACK;
回退已完成。
已用时间: 00: 00: 00.15
有的时候,一个复杂的SQL并不比两个简单的SQL效率要高,上面就是一个例子。这里的主要原因是,无论是两次更新,还是一个UPDATE语句,对远端的两个表访问两次是无法避免的,而一个UPDATE的逻辑更加复杂,选择执行计划更加困难。
由于访问远端对象的代价是相对比较大的,下面通过PL/SQL的方式来避免对远端对象的多次访问:
|