技术开发 频道

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

【IT168技术文档】在Oracle 10G中,SQL Plus这一小小而又强大的DBA工具已经得到了显著的改进,包括十分有用的提示和高级文件操作。

SQLPlus的改进

    哪个工具是DBA每天最常用的?除了很多DBA使用图形界面的工具外,使用最多的就是SQL Plus这个命令行方式的工具了。

    尽管在oracle 10G中由于企业管理器的大大增强可能使SQL Plus的地位有所改变,但这个普遍使用的小工具仍然被保留下来了——它对于初学者和有经验的DBA都适用。我们下面将会探讨一下SQL*Plus 10.1.0.2中一些有用的新特性。但是你必须要有随Oracle 10G软件安装的SQL Plus,而不能使用9i客户端连接10G服务器的9i的SQL Plus。

提示

    我当前是以哪个用户登录的?当前身份是什么?在长时间使用9i的sqlplus后,很多DBA会犯这种“迷糊”。你需要通过查询语句来解决这些迷惑。在10g的sqlplus中,你可以通过设置在SQL>提示标识中增加这些信息了:

SQL> set sqlprompt "_user _privilege> "
通过以上设置,你的sqlplus提示标识就成了以下格式了:

SYS AS SYSDBA>

    这就表明当前的登录帐号是SYS,身份是SYSDBA。请注意在上面语句中使用了两个特殊的预定义道德变量:_user和_privilege,分别定义了当前用户和这个用户的登录

    身份(权限)。现在我们再增加一些其他内容。比如我除了想知道以上信息外,还想知道当前的登录时间:

SQL> set sqlprompt "_user _privilege on _date>" SYS AS SYSDBA on 31-8月 -05>
再增加一个连接信息看,这样就可以指出你登录的是哪个服务器的:

SQL>set sqlprompt "_user on _date at _connect_identifier>" SYS on 31-8月 -05 at teng>
但是前面的当前时间信息只有日期,如果需要精确到当前的确切时间呢:

SYS on 31-8月 -05 at teng>alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
会话已更改。

SYS on 2005-08-31 16:20:15 at teng>

你只要将上面的内容存在$ORACLE_HOME/sqlplus/glogin.sql中,那每次登录的提示信息都是你所需要的了。

不再需要双引号
自从internal的登录方式在9i当中不再被支持后,很多DBA就抱怨:如何可以不输入sys用户的密码来维护系统的安全?答案就是在操作系统提示符下用双引号的方法进入:

$sqlplus “/as sysdba”
需要多输一对双引号也引起了不少抱怨。而在10g当中你就无需再输入双引号了:

$sqlplus / as sysdba
增强的文件管理性

    在9i中,当你在sqlplus进行操作时,你会希望将一些有用的语句存下来以便以后使用,这时你可以使用save命令。Save命令会将从最后一次执行save开始以后的所有脚本存下来,这样就会将你执行过的脚本存成分散的文件。如:

SQL> select 1 ... SQL> save 1 Created file 1.sql SQL> select 2 ... SQL> save 2 Created file 2.sql SQL> select 3 ... SQL> save 3 Created file 3.sql
这样存下来1.sql、2.sql、3.slq三个脚本,三个脚本的内容分别为select 1 …、select 2 …、select 3 …。这样的话你就需要手工将他们再合成一个脚本以便以后使用。 在sqlplus 10.1.0.2中,就不需要这么费劲了,你可以用添加的方式存储:
SQL> select 1 ... SQL> save myscript Created file myscript.sql SQL> select 2 ... SQL> save myscript append Append file myscript sql SQL> select 3 ... SQL> save myscript append Append file myscript.sql
这样,所有的脚本都被存储在myscript.sql这个脚本中了。 

    这一特性对于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表的应用效率更高。

来源:WWW.HelloDBA.COM


0
相关文章