如何正確地建立SCOTT/TIGER演示模式
執行腳本
(1)cd [ORACLE_HOME]/sqlplus/demo。
(2)以任意用戶身份連接後運行demobld.sql。
注:關於腳本文件的位置和名稱,不同的版本有所不同。
如我的Oracle版本是10G,並運行在Windows操作系統模式下,該腳本的位置和名稱為:D:\oracle\product\10.2.0\db_1\RDBMS\ADMIN\utlsampl.sql
在不使用腳本的情況下創建模式
CREATE TABLE EMP
(EMPNO NUMBER(4) ,
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER(7,2),
DEPTNO NUMBER(2)
);
INSERT INTO EMP VALUES
(7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,NULL,20);
INSERT INTO EMP VALUES
(7499,'ALLEN','SALESMAN',7698,to_date('20-2-1981','dd-mm-yyyy'),1600,300,30);
INSERT INTO EMP VALUES
(7521,'WARD','SALESMAN',7698,to_date('22-2-1981','dd-mm-yyyy'),1250,500,30);
INSERT INTO EMP VALUES
(7566,'JONES','MANAGER',7839,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20);
INSERT INTO EMP VALUES
(7654,'MARTIN','SALESMAN',7698,to_date('28-9-1981','dd-mm-yyyy'),1250,1400,30);
INSERT INTO EMP VALUES
(7698,'BLAKE','MANAGER',7839,to_date('1-5-1981','dd-mm-yyyy'),2850,NULL,30);
INSERT INTO EMP VALUES
(7782,'CLARK','MANAGER',7839,to_date('9-6-1981','dd-mm-yyyy'),2450,NULL,10);
INSERT INTO EMP VALUES
(7788,'SCOTT','ANALYST',7566,to_date('13-7-87','dd-mm-yyyy')-85,3000,NULL,20);
INSERT INTO EMP VALUES
(7839,'KING','PRESIDENT',NULL,to_date('17-11-1981','dd-mm-yyyy'),5000,NULL,10);
INSERT INTO EMP VALUES
(7844,'TURNER','SALESMAN',7698,to_date('8-9-1981','dd-mm-yyyy'),1500,0,30);
INSERT INTO EMP VALUES
(7876,'ADAMS','CLERK',7788,to_date('13-7-87', 'dd-mm-rr')-51,1100,NULL,20);
INSERT INTO EMP VALUES
(7900,'JAMES','CLERK',7698,to_date('3-12-1981','dd-mm-yyyy'),950,NULL,30);
INSERT INTO EMP VALUES
(7902,'FORD','ANALYST',7566,to_date('3-12-1981','dd-mm-yyyy'),3000,NULL,20);
INSERT INTO EMP VALUES
(7934,'MILLER','CLERK',7782,to_date('23-1-1982','dd-mm-yyyy'),1300,NULL,10);
CREATE TABLE DEPT
(DEPTNO NUMBER(2),
DNAME VARCHAR2(14) ,
LOC VARCHAR2(13) ) ;
INSERT INTO DEPT VALUES
(10,'ACCOUNTING','NEW YORK');
INSERT INTO DEPT VALUES
(20,'RESEARCH','DALLAS');
INSERT INTO DEPT VALUES
(30,'SALES','CHICAGO');
INSERT INTO DEPT VALUES
(40,'OPERATIONS','BOSTON');
alter table emp add constraint emp_pk primary key(empno);
alter table dept add constraint dept_pk primary key(deptno);
alter table emp add constraint emp_fk_dept foreign key(deptno) references dept;
alter table emp add constraint emp_fk_emp foreign key(mgr) references emp;
設置環境
SQL*Plus允許建立一個login.sql文件,每次啟動SQL*Plus時都會執行這個腳本。
另外,還允許設置一個環境變量SQLPATH,這樣不論這個login.sql腳本具體在哪個目錄中,SQL*Plus都能找到它。
我是用的login.sql腳本如下:
define_editor= Notepad
set serveroutput on size 1000000
set trimspool on
set long 5000
set linesize 100
set pagesize 9999
column plan_plus_exp format a80
column global_name new_value gname
set termout off
define gname=idle
column global_name new_value gname
select lower(user) || '@' || substr(global_name, 1, decode(dot, 0, length(global_name),
dot-1)) global_name
from (select global_name, instr(global_name, '.') dot from global_name);
set sqlprompt '&gname> '
set termout on
下面對這個腳本做些說明:
define_editor:設置SQL*Plus使用的默認編輯器。可以把它設置你最喜歡的文本編輯器(而不是字處理器),如記事本(Notepad)或emacs或vi。
set setveroutput on size 1000000 :這會默認的打開DBMS_OUTPUT(這樣就不必每次在鍵入這個命令了)。另外,也將默認緩沖區大小設置的盡可能大。
set trimspool on :假脫機輸出文本時,會去除文本行兩端的空格,而且行寬不定。如果設置為OFF(默認設置),假脫機輸出的文本行寬度則等於所設置的linesize。
set long 5000 :設置選擇LONG和CLOB列時顯示的默認字節數。
set linesize 100 :設置SQL*Plus顯示的文本行寬為100個字符。
set pagesize 9999 :pagesize 可以控制SQL*Plus多久打印一次標題,這裡講pagesize 設置成一個很大的值(所以每頁只有一組標題)。
column plan_plus_exp a80 :設置由AUTOTRACE得到的解釋計劃輸出(explain plan output)的默認寬度。a80通常足以放下整個計劃。
login.sql中下面這部分用於建立SQL*Plus提示符:
define gname=idle
column global_name new_value gname
select lower(user) || '@' || substr(global_name, 1, decode(dot, 0, length(global_name),
dot-1)) global_name
from (select global_name, instr(global_name, '.') dot from global_name);
set sqlprompt '&gname> '
column global_name new_value gname 指令告訴SQL*Plus取得global_name列中的最後一個值,並將這個值賦給替換變量gname。接下來我從數據庫中選出global_name,並與我的登錄用戶連接。
這樣得到的SQL*Plus提示符為:
psl@orcl>
這樣一來,我就能知道我是誰,還有我在哪兒。
設置SQL*Plus的AUTOTRACE
AUTOTRACE是SQL*Plus中的一個工具,可以顯示所執行查詢的解釋計劃(explain plan)以及所用的資源。本書大量使用了AUTOTRACE工具。配置AUTOTRACE的方法不止一種。
初始配置
以下是我采用的方法:
(1)cd [ORACLE_HOME]/rdbms/admin;
(2)作為SYSTEM登錄SQL*Plus;
(3)運行@utlxplan;
(4)運行CREATE PUBLIC SYNONYM PLAN_TABLE FOR PLAN_TABLE;
(5)運行GRANT ALL ON PLAN_TABLE TO PUBLIC。
如果願意,可以把GRANT TO PUBLIC中的 PUBLIC替換為某個用戶。
通過將它設置為PUBLIC,任何人都可以使用SQL*Plus進行跟蹤(在我看來並不是件壞事)。
這麼一來,就不需要每個用戶都安裝自己的計劃表。
還有一種做法是,在想要使用AUTOTRACE的每個模式中分別運行@utlxplan。
下一步是創建並授予PLUSTRACE角色:
(1)cd [ORACLE_HOME]/sqlplus/admin;
(2)作為SYS或SYSDBA登錄SQL*Plus;
(3)運行@plustrce;
(4)運行GRANT PLUSTRACE TO PUBLIC。
重申一遍,如果願意,可以把GRANT 命令中的PUBLIC替換為某個用戶。
控制報告
你會自動得到一個AUTOTRACE報告,其中可能列出SQL優化器所用的執行路徑,以及語句的執行統計信息。成功執行SQL DML(即 SELECT、DELETE、UPDATE、MERGE和 INSERT)語句後就會生成這個報告。它對於監視並調優這些語句的性能很有幫助。
通過設置AUTOTRACE系統變量可以控制這個變量。
SET AUTOTRACE OFF :不生成AUTOTRACE報告。這是默認設置。
SET AUTOTRACE ON EXPLAIN :AUTOTRACE只顯示優化器執行路徑。
SET AUTOTRACE ON STATISTICS :AUTOTRACE只顯示SQL語句的執行統計信息。
SET AUTOTRACE ON :報告既包含優化器執行路徑,又包括SQL語句的執行統計信息。
SET AUTOTRACE TRACEONLY :這與 SET AUTOTRACE ON 類似,但是不顯示用戶的查詢輸出(如果有的話)。
附注:
下面是腳本文件utlxplan內容:
create table PLAN_TABLE (
statement_id varchar2(30),
plan_id number,
timestamp date,
remarks varchar2(4000),
operation varchar2(30),
options varchar2(255),
object_node varchar2(128),
object_owner varchar2(30),
object_name varchar2(30),
object_alias varchar2(65),
object_instance numeric,
object_type varchar2(30),
optimizer varchar2(255),
search_columns number,
id numeric,
parent_id numeric,
depth numeric,
position numeric,
cost numeric,
cardinality numeric,
bytes numeric,
other_tag varchar2(255),
partition_start varchar2(255),
partition_stop varchar2(255),
partition_id numeric,
other long,
distribution varchar2(30),
cpu_cost numeric,
io_cost numeric,
temp_space numeric,
access_predicates varchar2(4000),
filter_predicates varchar2(4000),
projection varchar2(4000),
time numeric,
qblock_name varchar2(30),
other_xml clob
);
可以看出,此腳本是用於創建計劃表PLAN_TABLE的。
再來看腳本文件plustrce:
set echo on
drop role plustrace;
create role plustrace;
grant select on v_$sesstat to plustrace;
grant select on v_$statname to plustrace;
grant select on v_$mystat to plustrace;
grant plustrace to dba with admin option;
set echo off
可以看出,這個腳本創建了一個角色plustrace,並把3張動態性能視圖的SELECT授予該角色,再把該角色授予DBA用戶,並使其具有將該系統權限授予其他用戶的權限。