WEB开发网
开发学院数据库Oracle Oracle10g新特性——SQL*PLUS的改进 阅读

Oracle10g新特性——SQL*PLUS的改进

 2008-08-30 12:44:26 来源:WEB开发网   
核心提示: 这一特性对于spool同样适用,在9i中,Oracle10g新特性——SQL*PLUS的改进(3),输入spool res后,如果当前目录下不存在res.lst这个文件,与9i中的“TABLE ACCESS (FULL) OF 'DUAL'”完全相反

这一特性对于spool同样适用。在9i中,输入spool res后,如果当前目录下不存在res.lst这个文件,就会创建它,如果已经存在,就会直接覆盖(不会给任何提示),然后将以后直到spool off的所有sqlplus上的信息存储在res.lst中。这样的话,如果原先有一个很重要的res.lst文件可能就无法恢复了。

在10g中,spool命令可以向已经存在的文件中添加内容:

SQL> spool res append

如果忽略掉append子句就和9i中一样,会将已有文件覆盖,或者将append换为replace也会覆盖。而如果使用create子句就会先检查文件是否存在,如果存在,就会报错:

SYS on 2005-08-31 17:25:46 at teng>spool abc create

SP2-0771: 文件 "abc.LST" 已存在。

请使用其它名称或 "SPOOL filename[.ext] REPLACE"

Login.sql

每次登录sqlplus时,会先执行$ORACLE_HOME/sqlplus/glogin.sql或者当前目录的login.sql脚本。但是,会存在各种各样的限制。在9i或以下版本里,假如你的脚本里有如下内容:

set sqlprompt "_connect_identifier >"

当第一次启动并连接到数据库DB1时,提示信息为:

DB1>

然后再连接到另外一个数据库上:

DB1> connect scott/tiger@db2
connected
DB1>

尽管连到了DB2,但提示信息还是DB1。说明这个提示有问题。其实原因很简单,login.sql只是在第一次启动sqlplus时执行,而在每次重新连接时不会执行。所以提示信息没有变。

在10g中,这种限制没有了。脚本不仅在启动sqlplus时执行,还会在每次连接数据库时也会执行:

DB1> connect scott/tiger@db2
connected
DB2>

这样信息就是正确了。

使用原先版本的sqlplus

如果你出于某些原因不想使用这种增强过的sqlplus该怎么办呢?很简单,只要在运行sqlplus时加上-c的选项就可以了:

sqlplus –c 9.2

这样sqlplus的环境就和9.2版本的是一样的了。

轻松使用dual

有多少人经常使用例如以下的语句:

select USER into <some variable> from DUAL

也许有很多。每次调用DUAL都会产生逻辑IO,而这些逻辑IO都可以被数据库避免的。在一些情况下,调用DUAL是为了能达到像“<somevariable> := USER”这样的效果。因为Oracle代码将DUAL看作一张特殊的表,因此一些用于优化普通表的方法可能对它无效。

在10g中,这些担心都不存在了。因为DUAL是一张特殊的表,通过设定10046跟踪事件,”consistent gets”在相当程度上被降低了,查询计划也不一样了。

在9i中:

Rows Execution Plan
------- ---------------------------------------------------
0 SELECT STATEMENT GOAL: CHOOSE
1 TABLE ACCESS (FULL) OF 'DUAL'
在10G中:
Rows Execution Plan
------- ---------------------------------------------------
0 SELECT STATEMENT MODE: ALL_ROWS
0 FAST DUAL

请注意10g中这个新的查询计划:“FAST DUAL”,与9i中的“TABLE ACCESS (FULL) OF 'DUAL'”完全相反。这一改进显著的降低了“consistent reads”,使频繁用到了DUAL表的应用效率更高。

上一页  1 2 3 

Tags:Oracleg 特性 SQL

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接