以下是小编帮大家整理的oracle里的常用命令数据库教程,本文共8篇,仅供参考,希望能够帮助到大家。
篇1:oracle里的常用命令数据库教程
oracle
第一章:日志管理1.forcing log switches
sql>alter system switch logfile;
2.forcing checkpoints
sql>alter system checkpoint;
3.adding online redo log groups
sql>alter database add logfile [group 4]
sql>('/disk3/log4a.rdo','/disk4/log4b.rdo') size 1m;
4.adding online redo log members
sql>alter database add logfile member
sql>'/disk3/log1b.rdo' to group 1,
sql>'/disk4/log2b.rdo' to group 2;
5.changes the name of the online redo logfile
sql>alter database rename file 'c:/oracle/oradata/oradb/redo01.log'
sql>to 'c:/oracle/oradata/redo01.log';
6.drop online redo log groups
sql>alter database drop logfile group 3;
7.drop online redo log members
sql>alter database drop logfile member 'c:/oracle/oradata/redo01.log';
8.clearing online redo log files
sql>alter database clear [unarchived] logfile 'c:/oracle/log2a.rdo';
9.using logminer analyzing redo logfiles
a. in the init.ora specify utl_file_dir = ' '
b. sql>execute dbms_logmnr_d.build('oradb.ora','c:\oracle\oradb\log');
c. sql>execute dbms_logmnr_add_logfile('c:\oracle\oradata\oradb\redo01.log',
sql>dbms_logmnr.new);
d. sql>execute dbms_logmnr.add_logfile('c:\oracle\oradata\oradb\redo02.log',
sql>dbms_logmnr.addfile);
e. sql>execute dbms_logmnr.start_logmnr(dictfilename=>'c:\oracle\oradb\log\oradb.ora');
f. sql>select * from v$logmnr_contents(v$logmnr_dictionary,v$logmnr_parameters
sql>v$logmnr_logs);
g. sql>execute dbms_logmnr.end_logmnr;
第二章:表空间管理
1.create tablespaces
sql>create tablespace tablespace_name datafile 'c:\oracle\oradata\file1.dbf' size 100m,
sql>'c:\oracle\oradata\file2.dbf' size 100m minimum extent 550k [logging/nologging]
sql>default storage (initial 500k next 500k maxextents 500 pctinccease 0)
sql>[online/offline] [permanent/temporary] [extent_management_clause]
2.locally managed tablespace
sql>create tablespace user_data datafile 'c:\oracle\oradata\user_data01.dbf'
sql>size 500m extent management local uniform. size 10m;
3.temporary tablespace
sql>create temporary tablespace temp tempfile 'c:\oracle\oradata\temp01.dbf'
sql>size 500m extent management local uniform. size 10m;
4.change the storage setting
sql>alter tablespace app_data minimum extent 2m;
sql>alter tablespace app_data default storage(initial 2m next 2m maxextents 999);
5.taking tablespace offline or online
sql>alter tablespace app_data offline;
sql>alter tablespace app_data online;
6.read_only tablespace
sql>alter tablespace app_data read only|write;
7.droping tablespace
sql>drop tablespace app_data including contents;
8.enableing automatic extension of data files
sql>alter tablespace app_data add datafile 'c:\oracle\oradata\app_data01.dbf' size 200m
sql>autoextend on next 10m maxsize 500m;
9.change the size fo data files manually
sql>alter database datafile 'c:\oracle\oradata\app_data.dbf' resize 200m;
10.Moving data files: alter tablespace
sql>alter tablespace app_data rename datafile 'c:\oracle\oradata\app_data.dbf'
sql>to 'c:\oracle\app_data.dbf';
11.moving data files:alter database
sql>alter database rename file 'c:\oracle\oradata\app_data.dbf'
sql>to 'c:\oracle\app_data.dbf';
第三章:表
1.create a table
sql>create table table_name (column datatype,column datatype]....)
sql>tablespace tablespace_name [pctfree integer] [pctused integer]
sql>[initrans integer] [maxtrans integer]
sql>storage(initial 200k next 200k pctincrease 0 maxextents 50)
sql>[logging|nologging] [cache|nocache]
2.copy an existing table
sql>create table table_name [logging|nologging] as subquery
3.create temporary table
sql>create global temporary table xay_temp as select * from xay;
on commit preserve rows/on commit delete rows
4.pctfree = (average row size - initial row size) *100 /average row size
pctused = 100-pctfree- (average row size*100/available data space)
5.change storage and block utilization parameter
sql>alter table table_name pctfree=30 pctused=50 storage(next 500k
sql>minextents 2 maxextents 100);
6.manually allocating extents
sql>alter table table_name allocate extent(size 500k datafile 'c:/oracle/data.dbf');
7.move tablespace
sql>alter table employee move tablespace users;
8.deallocate of unused space
sql>alter table table_name deallocate unused [keep integer]
9.truncate a table
sql>truncate table table_name;
10.drop a table
sql>drop table table_name [cascade constraints];
11.drop a column
sql>alter table table_name drop column comments cascade constraints checkpoint 1000;
alter table table_name drop columns continue;
12.mark a column as unused
sql>alter table table_name set unused column comments cascade constraints;
alter table table_name drop unused columns checkpoint 1000;
alter table orders drop columns continue checkpoint 1000
data_dictionary : dba_unused_col_tabs
第四章:索引
1.creating function-based indexes
sql>create index summit.item_quantity on summit.item(quantity-quantity_shipped);
2.create a B-tree index
sql>create [unique] index index_name on table_name(column,.. asc/desc) tablespace
sql>tablespace_name [pctfree integer] [initrans integer] [maxtrans integer]
sql>[logging | nologging] [nosort] storage(initial 200k next 200k pctincrease 0
sql>maxextents 50);
3.pctfree(index)=(maximum number of rows-initial number of rows)*100/maximum number of rows
4.creating reverse key indexes
sql>create unique index xay_id on xay(a) reverse pctfree 30 storage(initial 200k
sql>next 200k pctincrease 0 maxextents 50) tablespace indx;
5.create bitmap index
sql>create bitmap index xay_id on xay(a) pctfree 30 storage( initial 200k next 200k
sql>pctincrease 0 maxextents 50) tablespace indx;
6.change storage parameter of index
sql>alter index xay_id storage (next 400k maxextents 100);
7.allocating index space
sql>alter index xay_id allocate extent(size 200k datafile 'c:/oracle/index.dbf');
8.alter index xay_id deallocate unused;
第五章:约束
1.define constraints as immediate or deferred
sql>alter session set constraint[s] = immediate/deferred/default;
set constraint[s] constraint_name/all immediate/deferred;
2. sql>drop table table_name cascade constraints
sql>drop tablespace tablespace_name including contents cascade constraints
3. define constraints while create a table
sql>create table xay(id number(7) constraint xay_id primary key deferrable
sql>using index storage(initial 100k next 100k) tablespace indx);
primary key/unique/references table(column)/check
4.enable constraints
sql>alter table xay enable novalidate constraint xay_id;
5.enable constraints
sql>alter table xay enable validate constraint xay_id;
第六章:LOAD数据
1.loading data using direct_load insert
sql>insert /*+append */ into emp nologging
sql>select * from emp_old;
2.parallel direct-load insert
sql>alter session enable parallel dml;
sql>insert /*+parallel(emp,2) */ into emp nologging
sql>select * from emp_old;
3.using sql*loader
sql>sqlldr scott/tiger \
sql>control = ulcase6.ctl \
sql>log = ulcase6.log direct=true
第七章:reorganizing data
1.using expoty
$exp scott/tiger tables(dept,emp) file=c:\emp.dmp log=exp.log compress=n direct=y
2.using import
$imp scott/tiger tables(dept,emp) file=emp.dmp log=imp.log ignore=y
3.transporting a tablespace
sql>alter tablespace sales_ts read only;
$exp sys/.. file=xay.dmp transport_tablespace=y tablespace=sales_ts
triggers=n constraints=n
$copy datafile
$imp sys/.. file=xay.dmp transport_tablespace=y datafiles=(/disk1/sles01.dbf,/disk2
/sles02.dbf)
sql>alter tablespace sales_ts read write;
4.checking transport set
sql>DBMS_tts.transport_set_check(ts_list =>'sales_ts' ..,incl_constraints=>true);
在表transport_set_violations 中查看
sql>dbms_tts.isselfcontained 为true 是, 表示自包含
第八章: managing password security and resources
1.controlling account lock and password
sql>alter user juncky identified by oracle account unlock;
2.user_provided password function
sql>function_name(userid in varchar2(30),password in varchar2(30),
old_password in varchar2(30)) return boolean
3.create a profile : password setting
sql>create profile grace_5 limit failed_login_attempts 3
sql>password_lock_time unlimited password_life_time 30
sql>password_reuse_time 30 password_verify_function verify_function
sql>password_grace_time 5;
4.altering a profile
sql>alter profile default failed_login_attempts 3
sql>password_life_time 60 password_grace_time 10;
5.drop a profile
sql>drop profile grace_5 [cascade];
6.create a profile : resource limit
sql>create profile developer_prof limit sessions_per_user 2
sql>cpu_per_session 10000 idle_time 60 connect_time 480;
7. view =>resource_cost : alter resource cost
dba_Users,dba_profiles
8. enable resource limits
sql>alter system set resource_limit=true;
第九章:Managing users
1.create a user: database authentication
sql>create user juncky identified by oracle default tablespace users
sql>temporary tablespace temp quota 10m on data password expire
sql>[account lock|unlock] [profile profilename|default];
2.change user quota on tablespace
sql>alter user juncky quota 0 on users;
3.drop a user
sql>drop user juncky [cascade];
4. monitor user
view: dba_users , dba_ts_quotas
第十章:managing privileges
1.system privileges: view =>system_privilege_map ,dba_sys_privs,session_privs
2.grant system privilege
sql>grant create session,create table to managers;
sql>grant create session to scott with admin option;
with admin option can grant or revoke privilege from any user or role;
3.sysdba and sysoper privileges:
sysoper: startup,shutdown,alter database open|mount,alter database backup controlfile,
alter tablespace begin/end backup,recover database
alter database archivelog,restricted session
sysdba: sysoper privileges with admin option,create database,recover database until
4.password file members: view:=>v$pwfile_users
5.O7_dictionary_accessibility =true restriction access to view or tables in other schema
6.revoke system privilege
sql>revoke create table from karen;
sql>revoke create session from scott;
7.grant object privilege
sql>grant execute on dbms_pipe to public;
sql>grant update(first_name,salary) on employee to karen with grant option;
8.display object privilege : view =>dba_tab_privs, dba_col_privs
9.revoke object privilege
sql>revoke execute on dbms_pipe from scott [cascade constraints];
10.audit record view :=>sys.aud$
11. protecting the audit trail
sql>audit delete on sys.aud$ by access;
12.statement auditing
sql>audit user;
13.privilege auditing
sql>audit select any table by summit by access;
14.schema object auditing
sql>audit lock on summit.employee by access whenever successful;
15.view audit option : view=>all_def_audit_opts,dba_stmt_audit_opts,dba_priv_audit_opts,dba_obj_audit_opts
16.view audit result: view=>dba_audit_trail,dba_audit_exists,dba_audit_object,dba_audit_session,dba_audit_statement
第十一章: manager role
1.create roles
sql>create role sales_clerk;
sql>create role hr_clerk identified by bonus;
sql>create role hr_manager identified externally;
2.modify role
sql>alter role sales_clerk identified by commission;
sql>alter role hr_clerk identified externally;
sql>alter role hr_manager not identified;
3.assigning roles
sql>grant sales_clerk to scott;
sql>grant hr_clerk to hr_manager;
sql>grant hr_manager to scott with admin option;
4.establish default role
sql>alter user scott default role hr_clerk,sales_clerk;
sql>alter user scott default role all;
sql>alter user scott default role all except hr_clerk;
sql>alter user scott default role none;
5.enable and disable roles
sql>set role hr_clerk;
sql>set role sales_clerk identified by commission;
sql>set role all except sales_clerk;
sql>set role none;
6.remove role from user
sql>revoke sales_clerk from scott;
sql>revoke hr_manager from public;
7.remove role
sql>drop role hr_manager;
8.display role information
view: =>dba_roles,dba_role_privs,role_role_privs,dba_sys_privs,role_sys_privs,role_tab_privs,session_roles
第十二章: BACKUP and RECOVERY
1. v$sga,v$instance,v$process,v$bgprocess,v$database,v$datafile,v$sgastat
2. Rman need set dbwr_IO_slaves or backup_tape_IO_slaves and large_pool_size
3. Monitoring Parallel Rollback
>v$fast_start_servers , v$fast_start_transactions
4.perform. a closed database backup (noarchivelog)
>shutdown immediate
>cp files /backup/
>startup
5.restore to a different location
>connect system/manager as sysdba
>startup mount
>alter database rename file '/disk1/../user.dbf' to '/disk2/../user.dbf';
>alter database open;
6.recover syntax
--recover a mounted database
>recover database;
>recover datafile '/disk1/data/df2.dbf';
>alter database recover database;
--recover an opened database
>recover tablespace user_data;
>recover datafile 2;
>alter database recover datafile 2;
7.how to apply redo log files automatically
>set autorecovery on
>recover automatic datafile 4;
8plete recovery:
--method 1(mounted databae)
>copy c:\backup\user.dbf c:\oradata\user.dbf
>startup mount
>recover datafile 'c:\oradata\user.dbf;
>alter database open;
--method 2(opened database,initially opened,not system or rollback datafile)
>copy c:\backup\user.dbf c:\oradata\user.dbf (alter tablespace offline)
>recover datafile 'c:\oradata\user.dbf' or
>recover tablespace user_data;
>alter database datafile 'c:\oradata\user.dbf' online or
>alter tablespace user_data online;
--method 3(opened database,initially closed not system or rollback datafile)
>startup mount
>alter database datafile 'c:\oradata\user.dbf' offline;
>alter database open
>copy c:\backup\user.dbf d:\oradata\user.dbf
>alter database rename file 'c:\oradata\user.dbf' to 'd:\oradata\user.dbf'
>recover datafile 'e:\oradata\user.dbf' or recover tablespace user_data;
>alter tablespace user_data online;
--method 4(loss of data file with no backup and have all archive log)
>alter tablespace user_data offline immediate;
>alter database create datafile 'd:\oradata\user.dbf' as 'c:\oradata\user.dbf''
>recover tablespace user_data;
>alter tablespace user_data online
5.perform. an open database backup
>alter tablespace user_data begin backup;
>copy files /backup/
>alter database datafile '/c:/../data.dbf' end backup;
>alter system switch logfile;
6.backup a control file
>alter database backup controlfile to 'control1.bkp';
>alter database backup controlfile to trace;
7.recovery (noarchivelog mode)
>shutdown abort
>cp files
>startup
8.recovery of file in backup mode
>alter database datafile 2 end backup;
9.clearing redo log file
>alter database clear unarchived logfile group 1;
>alter database clear unarchived logfile group 1 unrecoverable datafile;
10.redo log recovery
>alter database add logfile group 3 'c:\oradata\redo03.log' size 1000k;
>alter database drop logfile group 1;
>alter database open;
or >cp c:\oradata\redo02.log' c:\oradata\redo01.log
>alter database clear logfile 'c:\oradata\log01.log';
篇2:Oracle 9i 约束条件数据库教程
约束条件就是Oracle数据库系统提供的对数据的完整性进行制约的机制,
Oracle 9i 约束条件数据库教程
。Oracle 9i允许创建5种约束条件。参见表7.8。创建检查约束条件
(1)在【管理目标导航器】中按照7.6节修改数据表结构的步骤进行操作。
(2)切换到图7.61所示的编辑表的【约束条件】选项卡。
(3)上述创建检查约束条件的SQL码如下?br> DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
ALTER TABLE “SCOTT”.“STUDENT”
ADD (CONSTRAINT “研究生编号检查约束条件”
CHECK(student_id>= and student_id<=0909))
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
【参见光盘文件】:\第7章\ createcheck.sql。
(4)读者也可以直接在【SQLPlus Worksheet】中执行createcheck.sql 文件完成检查约束条件的创建,如图7.62所示,
测试检查约束条件
(1)在7.63所示的【表数据编辑器】界面中按照图示内容输入,单击“应用(P)”按钮。
(2)上述输入数据的SQL代码如下。
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
INSERT INTO “SCOTT”.“STUDENT”
(“STUDENT_ID” ,“NAME” ,“PROFESSIONAL” ,“BIRTHDAY” ,“DIRECTOR_ID” )
VALUES (20010101 ,'纪晓芙' ,'软件工程' ,TO_DATE('15-7月 -1971', 'dd-Mon-yyyy HH:MI:SS AM') ,01)
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
【参见光盘文件】:\第7章\ testcheck.sql。
(3)出现如图7.64所示界面。
(4)读者也可以直接在【SQLPlus Worksheet】中执行testcheck.sql 文件完成检查约束条件的测试,结果如图7.65所示。
篇3:删除Oracle 9i数据库数据库教程
(1)启动【数据库配置助手】,一直到出现如图6.44所示的【操作】界面,
删除Oracle 9i数据库数据库教程
。(2)出现如图6.45所示的【数据库】界面,
(3)出现如图6.46所示的【概要】界面。
(4)出现如图6.47所示的【删除确认】界面。
(5)成功删除数据库后出现如图6.48所示的【成功境】界面。单击“否”按钮?br>
篇4:ORACLE NUMBER类型详解数据库教程
1>.NUMBER类型细讲:
Oracle number datatype 语法:NUMBER[(precision [, scale])]
简称:precision -->p
scale -->s
NUMBER(p, s)
范围: 1 <= p <=38, -84 <= s <= 127
保存数据范围:-1.0e-130 <= number value < 1.0e+126
保存在机器内部的范围: 1 ~ 22 bytes
有效为:从左边第一个不为0的数算起的位数,
s的情况:
s >0
精确到小数点右边s位,并四舍五入。然后检验有效位是否 <= p。
s < 0
精确到小数点左边s位,并四舍五入。然后检验有效位是否 <= p + s。
s = 0
此时NUMBER表示整数。
eg:
Actual Data Specified As Stored As
----------------------------------------
123.89 NUMBER 123.89
123.89 NUMBER(3) 124
123.89 NUMBER(6,2) 123.89
123.89 NUMBER(6,1) 123.9
123.89 NUMBER(4,2) exceeds precision (有效位为5, 5 >4)
123.89 NUMBER(6,-2) 100
.01234 NUMBER(4,5) .01234 (有效位为4)
.00012 NUMBER(4,5) .00012
.000127 NUMBER(4,5) .00013
.0000012 NUMBER(2,7) .0000012
.00000123 NUMBER(2,7) .0000012
1.2e-4 NUMBER(2,5) 0.00012
1.2e-5 NUMBER(2,5) 0.00001
123.2564 NUMBER 123.2564
1234.9876 NUMBER(6,2) 1234.99
12345.12345 NUMBER(6,2) Error (有效位为5+2 >6)
1234.9876 NUMBER(6) 1235 (s没有表示s=0)
12345.345 NUMBER(5,-2) 12300
1234567 NUMBER(5,-2) 1234600
12345678 NUMBER(5,-2) Error (有效位为8 >7)
123456789 NUMBER(5,-4) 123460000
1234567890 NUMBER(5,-4) Error (有效位为10 >9)
12345.58 NUMBER(*, 1) 12345.6
0.1 NUMBER(4,5) Error (0.10000, 有效位为5 >4)
0.01234567 NUMBER(4,5) 0.01235
0.09999 NUMBER(4,5) 0.09999
篇5:Oracle 9i的数据类型数据库教程
Oracle 9i共提供了16种标量数据类型,如表7.4所示,
Oracle 9i的数据类型数据库教程
。表7.4 Oracle 9i的标量数据类型名称含义Char用于描述定长的字符型数据,长度<=字节varchar2用于描述变长的字符型数据,长度<=4000字节nchar用来存储Unicode字符集的定长字符型数据,长度<=1000字节nvarchar2用来存储Unicode字符集的变长字符型数据,长度<=1000字节number用来存储整型或者浮点型数值Date用来存储日期数据Long用来存储最大长度为2GB的变长字符数据Raw用来存储非结构化数据的变长字符数据,长度<=2000字节Long raw用来存储非结构化数据的变长字符数据,长度<=2GBrowid用来存储表中列的物理地址的二进制数据,占用固定的10个字节Blob用来存储多达4GB的非结构化的二进制数据Clob用来存储多达4GB的字符数据nclob用来存储多达4GB的Unicode字符数据Bfile用来把非结构化的二进制数据存储在数据库以外的操作系统文件中urowid用来存储表示任何类型列地址的二进制数据float用来存储浮点数
篇6:创建交叉报表(oracle)数据库教程
oracle|创建
创建交叉报表
create table t1(
goodid number(10) not null,
saledate date not null,
salesum number(10)
);
要求生成本年度每个月的产品销售状况表
m1 m2 m3 ... m12
g1
g2
.
.
.
gn
下面是生成报表的sql
SELECT goodid,
SUM(decode(to_char(saledate,'mm'),'01',salesum)) “01”,
SUM(decode(to_char(saledate,'mm'),'02',salesum)) “02”,
SUM(decode(to_char(saledate,'mm'),'03',salesum)) “03”,
SUM(decode(to_char(saledate,'mm'),'04',salesum)) “04”,
SUM(decode(to_char(saledate,'mm'),'05',salesum)) “05”,
SUM(decode(to_char(saledate,'mm'),'06',salesum)) “06”,
SUM(decode(to_char(saledate,'mm'),'07',salesum)) “07”,
SUM(decode(to_char(saledate,'mm'),'08',salesum)) “08”,
SUM(decode(to_char(saledate,'mm'),'09',salesum)) “09”,
SUM(decode(to_char(saledate,'mm'),'10',salesum)) “10”,
SUM(decode(to_char(saledate,'mm'),'11',salesum)) “11”,
SUM(decode(to_char(saledate,'mm'),'12',salesum)) “12”
from t1
where to_char(saledate,'yyyy') = ''
group by goodid
order by goodid;
篇7:输出oracle 对象源码数据库教程
oracle|对象
way 1:
通过spool输出到文件:
set serveroutput on
spool 'c:\log.txt'
DECLARE
v_text VARCHAR2(1000);
--i number(3):=0;
CURSOR cur IS
SELECT text
FROM sys.DBA_SOURCE
WHERE WNER = 'SCOTT'
AND NAME = 'TESTCCB';
BEGIN
OPEN cur;
LOOP
FETCH cur
INTO v_text;
--DBMS_OUTPUT.PUT_LINE(' cityname = ' ||v_name||' count='|| i);
DBMS_OUTPUT.put_line(v_text);
--i := i+ 1;
EXIT WHEN cur%NOTFOUND;
END LOOP;
CLOSE cur;
END;
/
spool off
way2:
利用 utl_file 包直接写出到文件
要求oracle用户对os文件系统有操作权限
DECLARE
v_text VARCHAR2(1000);
v_dir VARCHAR2(256);
v_owner VARCHAR2(128);
v_obj VARCHAR2(128);
l_output utl_file.file_type;
CURSOR cur IS
SELECT text
FROM dba_source
WHERE WNER = v_owner
AND NAME = v_obj;
BEGIN
v_owner := 'SCOTT';
v_obj := 'EMP';
SELECT t.directory_path INTO v_dir FROM all_directories t;
l_output := utl_file.fopen(v_dir, 'tab.txt', 'w');
utl_file.new_line(l_output);
utl_file.put_line(l_output,
'-- output owner :' || v_owner || ' object: ' ||
v_obj);
OPEN cur;
LOOP
FETCH cur
INTO v_text;
EXIT WHEN cur%NOTFOUND;
utl_file.new_line(l_output);
utl_file.put_line(l_output, v_text);
END LOOP;
utl_file.new_line(l_output);
utl_file.put_line(l_output, '-- output finished! ');
utl_file.fclose(l_output);
CLOSE cur;
END;
/
篇8:Oracle常}集(三)数据库教程
oracle
151. 如何O控 SGA 中字典n^的命中率?
select parameter, gets,Getmisses , getmisses/(gets+getmisses)*100
“miss ratio”,
(1-(sum(getmisses)/ (sum(gets)+sum(getmisses))))*100 “Hit ratio”
from v$rowcache
where gets+getmisses 0
group by parameter, gets, getmisses;
152. 如何O控 SGA 中共用存^的命中率,小於1% ?
select sum(pins) “Total Pins”, sum(reloads) “Total Reloads”,
sum(reloads)/sum(pins) *100 libcache
from v$librarycache;
select sum(pinhits-reloads)/sum(pins) “hit
radio”,sum(reloads)/sum(pins) “reload percent”
from v$librarycache;
153. 如何@示所有Y料煳锛的e和大小?
select count(name) num_instances ,type ,sum(source_size)
source_size ,
sum(parsed_size) parsed_size ,sum(code_size) code_size
,sum(error_size) error_size,
sum(source_size) +sum(parsed_size) +sum(code_size)
+sum(error_size) size_required
from dba_object_size
group by type order by 2;
154. O控 SGA 中重做日I存^的命中率,小於1%
SELECT name, gets, misses, immediate_gets, immediate_misses,
Decode(gets,0,0,misses/gets*100) ratio1,
Decode(immediate_gets+immediate_misses,0,0,
immediate_misses/(immediate_gets+immediate_misses)*100) ratio2
FROM v$latch WHERE name IN ('redo allocation', 'redo copy');
155. O控w和硬碟的排序比率,最好使它小於 .10,增加 sort_area_size
SELECT name, value FROM v$sysstat WHERE name IN ('sorts (memory)',
'sorts (disk)');
156. 如何O控前Y料煺l在\行什麽SQLZ句?
SELECT osuser, username, sql_text from v$session a, v$sqltext b
where a.sql_address =b.address order by address, piece;
157. 如何O控字典n^?
SELECT (SUM(PINS - RELOADS)) / SUM(PINS) “LIB CACHE” FROM
V$LIBRARYCACHE;
SELECT (SUM(GETS - GETMISSES - USAGE - FIXED)) / SUM(GETS) “ROW
CACHE” FROM V$ROWCACHE;
SELECT SUM(PINS) “EXECUTIONS”, SUM(RELOADS) “CACHE MISSES WHILE
EXECUTING” FROM V$LIBRARYCACHE;
後者除以前者,此比率小於1%,接近0%好,
SELECT SUM(GETS) “DICTIONARY GETS”,SUM(GETMISSES) “DICTIONARY
CACHE GET MISSES”
FROM V$ROWCACHE
158. O控 MTS
select busy/(busy+idle) “shared servers busy” from v$dispatcher;
此值大於0.5r,敌杓哟
select sum(wait)/sum(totalq) “dispatcher waits” from v$queue where
type='dispatcher';
select count(*) from v$dispatcher;
select servers_highwater from v$mts;
servers_highwater接近mts_max_serversr,敌杓哟
159. 如何知道前用舻ID
SQL>SHOW USER;
OR
SQL>select user from dual;
160. 如何查看碎片程度高的表
SELECT segment_name table_name , COUNT(*) extents
FROM dba_segments WHERE owner NOT IN ('SYS', 'SYSTEM') GROUP BY
segment_name
HAVING COUNT(*) = (SELECT MAX( COUNT(*) ) FROM dba_segments GROUP
BY segment_name);
162. 如何知道表在表空g中的存ηr
select segment_name,sum(bytes),count(*) ext_quan from dba_extents
where
tablespace_name='&tablespace_name' and segment_type='TABLE' group
by tablespace_name,segment_name;
163. 如何知道索引在表空g中的存ηr
select segment_name,count(*) from dba_extents where
segment_type='INDEX' and wner='&owner'
group by segment_name;
164、如何知道使用CPU多的用session
11是cpu used by this session
select a.sid,spid,status,substr(a.program,1,40)
prog,a.terminal,osuser,value/60/100 value
from v$session a,v$process b,v$sesstat c
where c.statistic#=11 and c.sid=a.sid and a.paddr=b.addr order by
value desc;
165. 如何知道O器日I文件
以8I例
$ORACLE_HOME/NETWORK/LOG/LISTENER.LOG
166. 如何知道O器滴募
以8I例
$ORACLE_HOME/NETWORK/ADMIN/LISTENER.ORA
167. 如何知道TNS B接文件
以8I例
$ORACLE_HOME/NETWORK/ADMIN/TNSNAMES.ORA
168. 如何知道Sql*Net h境文件
以8I例
$ORACLE_HOME/NETWORK/ADMIN/SQLNET.ORA
169. 如何知道警告日I文件
以8I例
$ORACLE_HOME/ADMIN/SID/BDUMP/SIDALRT.LOG
170. 如何知道基本Y
以8I例
$ORACLE_HOME/RDBMS/ADMIN/STANDARD.SQL
171. 如何知道建立Y料字典D
以8I例
$ORACLE_HOME/RDBMS/ADMIN/CATALOG.SQL
172. 如何知道建立用Y料字典D
以8I例
$ORACLE_HOME/RDBMS/ADMIN/CATAUDIT.SQL
173. 如何知道建立快照用Y料字典D
以8I例
$ORACLE_HOME/RDBMS/ADMIN/CATSNAP.SQL
本v主要v的是SQLZ句的化方法! 主要基於ORACLE9I的.
174. /*+ALL_ROWS*/
表明φZ句Kx窕於_N的化方法,K@得最佳吞吐量,使Y源消耗最小化.
例如:
SELECT /*+ALL+_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE
EMP_NO='CCBZZP';
175. /*+FIRST_ROWS*/
表明φZ句Kx窕於_N的化方法,K@得最佳回rg,使Y源消耗最小化.
例如:
SELECT /*+FIRST_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE
EMP_NO='CCBZZP';
176. /*+CHOOSE*/
表明如果Y料字典中有L表的yY,⒒於_N的化方法,K@得最佳的吞吐量;
表明如果Y料字典中]有L表的yY,⒒於t_N的化方法;
例如:
SELECT /*+CHOOSE*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE
EMP_NO='CCBZZP';
177. /*+RULE*/
表明φZ句Kx窕於t的化方法.
例如:
SELECT /*+ RULE */ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE
EMP_NO='CCBZZP';
178. /*+FULL(TABLE)*/
表明Ρ磉x袢局呙璧姆椒.
例如:
SELECT /*+FULL(A)*/ EMP_NO,EMP_NAM FROM BSEMPMS A WHERE
EMP_NO='CCBZZP';
179. /*+ROWID(TABLE)*/
提示明_表明χ付ū砀ROWIDM行L.
例如:
SELECT /*+ROWID(BSEMPMS)*/ * FROM BSEMPMS WHERE
ROWID>='AAAAAAAAAAAAAA'
AND EMP_NO='CCBZZP';
180. /*+CLUSTER(TABLE)*/
提示明_表明χ付ū磉x翊呙璧脑L方法,它只Υ匚锛有效.
例如:
SELECT /*+CLUSTER */ BSEMPMS.EMP_NO,DPT_NO FROM BSEMPMS,BSDPTMS
WHERE DPT_NO='TEC304' AND BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;
181. /*+INDEX(TABLE INDEX_NAME)*/
表明Ρ磉x袼饕的呙璺椒.
例如:
SELECT /*+INDEX(BSEMPMS SEX_INDEX) USE SEX_INDEX BECAUSE THERE ARE
FEWMALE BSEMPMS */ FROM BSEMPMS WHERE SEX='M';
182. /*+INDEX_ASC(TABLE INDEX_NAME)*/
表明Ρ磉x袼饕N绲呙璺椒.
例如:
SELECT /*+INDEX_ASC(BSEMPMS PK_BSEMPMS) */ FROM BSEMPMS WHERE
DPT_NO='CCBZZP';
183. /*+INDEX_COMBINE*/
指定表x顸cDL路,如果INDEX_COMBINE中]有提供作档乃饕,⑦x癯鳇cD索引的
布林M合方式.
例如:
SELECT /*+INDEX_COMBINE(BSEMPMS SAL_BMI HIREDATE_BMI)*/ * FROM
BSEMPMS
WHERE SAL<5000000 AND HIREDATE
184. /*+INDEX_JOIN(TABLE INDEX_NAME)*/
提示明_命令化器使用索引作L路.
例如:
SELECT /*+INDEX_JOIN(BSEMPMS SAL_HMI HIREDATE_BMI)*/ SAL,HIREDATE
FROM BSEMPMS WHERE SAL<60000;
185. /*+INDEX_DESC(TABLE INDEX_NAME)*/
表明Ρ磉x袼饕降绲呙璺椒.
例如:
SELECT /*+INDEX_DESC(BSEMPMS PK_BSEMPMS) */ FROM BSEMPMS WHERE
DPT_NO='CCBZZP';
186. /*+INDEX_FFS(TABLE INDEX_NAME)*/
χ付ǖ谋绦锌焖偃索引呙,而不是全表呙璧霓k法.
例如:
SELECT /*+INDEX_FFS(BSEMPMS IN_EMPNAM)*/ * FROM BSEMPMS WHERE
DPT_NO='TEC305';
187. /*+ADD_EQUAL TABLE INDEX_NAM1,INDEX_NAM2,...*/
提示明_M行绦幸的x,瘟兴饕的呙韬掀.
例如:
SELECT /*+INDEX_FFS(BSEMPMS IN_DPTNO,IN_EMPNO,IN_SEX)*/ * FROM
BSEMPMS WHERE EMP_NO='CCBZZP' AND DPT_NO='TDC306';
188. /*+USE_CONCAT*/
Σ樵中的WHERE後面的ORl件M行DQUNION ALL的M合查.
例如:
SELECT /*+USE_CONCAT*/ * FROM BSEMPMS WHERE DPT_NO='TDC506' AND
SEX='M';
189. /*+NO_EXPAND*/
於WHERE後面的OR 或者IN-LIST的查Z句,NO_EXPAND⒆柚蛊浠於化器ζ溥M行U展.
例如:
SELECT /*+NO_EXPAND*/ * FROM BSEMPMS WHERE DPT_NO='TDC506' AND
SEX='M';
190. /*+NOWRITE*/
禁止Σ樵K的查重操作.
191. /*+REWRITE*/
可以⒁D作.
192. /*+MERGE(TABLE)*/
能σD的各查M行相的合.
例如:
SELECT /*+MERGE(V) */ A.EMP_NO,A.EMP_NAM,B.DPT_NO FROM BSEMPMS A
(SELET DPT_NO
,AVG(SAL) AS AVG_SAL FROM BSEMPMS B GROUP BY DPT_NO) V WHERE
A.DPT_NO=V.DPT_NO
AND A.SAL>V.AVG_SAL;
193. /*+NO_MERGE(TABLE)*/
於有可合愕囊D不再合.
例如:
SELECT /*+NO_MERGE(V) */ A.EMP_NO,A.EMP_NAM,B.DPT_NO FROM BSEMPMS
A (SELET DPT_NO
,AVG(SAL) AS AVG_SAL FROM BSEMPMS B GROUP BY DPT_NO) V WHERE
A.DPT_NO=V.DPT_NO
AND A.SAL>V.AVG_SAL;
194. /*+ORDERED*/
根表出F在FROM中的序,ORDERED使ORACLE依此序ζ溥B接.
例如:
SELECT /*+ORDERED*/ A.COL1,B.COL2,C.COL3 FROM TABLE1 A,TABLE2
B,TABLE3 C
WHERE A.COL1=B.COL1 AND B.COL1=C.COL1;
195. /*+USE_NL(TABLE)*/
⒅付ū砼c嵌套的B接的行源M行B接,K把指定表作炔勘.
例如:
SELECT /*+ORDERED USE_NL(BSEMPMS)*/
BSDPTMS.DPT_NO,BSEMPMS.EMP_NO,BSEMPMS.EMP_NAM FROM BSEMPMS,BSDPTMS
WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;
196. /*+USE_MERGE(TABLE)*/
⒅付ǖ谋砼c其他行源通^合闩判蜻B接方式B接起.
例如:
SELECT /*+USE_MERGE(BSEMPMS,BSDPTMS)*/ * FROM BSEMPMS,BSDPTMS
WHERE
BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;
197. /*+USE_HASH(TABLE)*/
⒅付ǖ谋砼c其他行源通^哈希B接方式B接起.
例如:
SELECT /*+USE_HASH(BSEMPMS,BSDPTMS)*/ * FROM BSEMPMS,BSDPTMS WHERE
BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;
198. /*+DRIVING_SITE(TABLE)*/
制cORACLE所x竦奈恢貌煌的表M行查绦.
例如:
SELECT /*+DRIVING_SITE(DEPT)*/ * FROM BSEMPMS,DEPT@BSDPTMS WHERE
BSEMPMS.DPT_NO=DEPT.DPT_NO;
199. /*+LEADING(TABLE)*/
⒅付ǖ谋碜B接次序中的首表.
200. /*+CACHE(TABLE)*/
M行全表呙r,CACHE提示能⒈淼z索K放置在n^存中最近最少列表LRU的最近使用端
例如:
SELECT /*+FULL(BSEMPMS) CAHE(BSEMPMS) */ EMP_NAM FROM BSEMPMS;
201. /*+NOCACHE(TABLE)*/
M行全表呙r,CACHE提示能⒈淼z索K放置在n^存中最近最少列表LRU的最近使用端
例如:
SELECT /*+FULL(BSEMPMS) NOCAHE(BSEMPMS) */ EMP_NAM FROM BSEMPMS;
202. /*+APPEND*/
直接插入到表的最後,可以提高速度.
insert /*+append*/ into test1 select * from test4 ;
203. /*+NOAPPEND*/
通^在插入Z句生存期韧VK行模式映R插入.
insert /*+noappend*/ into test1 select * from test4 ;
ORACLE化器
. x用m合的ORACLE化器
ORACLE的化器共有3N:
a. RULE (基於t) b. COST (基於成本) c. CHOOSE (x裥)
O置缺省的化器,可以通^init.ora文件中OPTIMIZER_MODE档母鞣N明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS
. 你然也在SQL句或是(session)ζ溥M行覆w.
了使用基於成本的化器(CBO, Cost-Based Optimizer) , 你必常\行analyze
命令,以增加Y料熘械奈锛yY(object statistics)的蚀_性.
如果Y料斓化器模式O置x裥(CHOOSE),那麽H的化器模式⒑褪欠襁\行^analyze命令有P.
如果table已被analyze^, 化器模式⒆映CBO , 反之,Y料裼RULE形式的化器.
在缺省情r下,ORACLE裼CHOOSE化器, 了避免那些不必要的全表呙(full table scan) ,
你必量避免使用CHOOSE化器,而直接裼没於t或者基於成本的化器.
2. LTable的方式
ORACLE 裼煞NL表中的方式:
a. 全表呙
全表呙杈褪琼序地L表中每l. ORACLE裼靡淮巫x入多Y料K(database block)的方式化全表呙.
b. 通^ROWIDL表
你可以裼没於ROWID的L方式情r,提高L表的效率, ,
ROWID包含了表中的物理位置Y..ORACLE裼盟饕(INDEX)F了Y料和存放Y料的物理位置(ROWID)之g的M.
通常索引提供了快速LROWID的方法,因此那些基於索引列的查就可以得到性能上的提高.
3. 共用SQLZ句
了不重徒馕鱿嗤的SQLZ句,在第一次解析之後, ORACLESQLZ句存放在w中.@K位於系y全局^域SGA(system
global area)的共用池(shared buffer pool)中的w可以被所有的Y料煊艄灿.
因此,你绦幸SQLZ句(有r被Q一游)r,如果它
和之前的绦羞^的Z句完全相同, ORACLE就能很快@得已被解析的Z句以及最好的
绦新. ORACLE的@功能大大地提高了SQL的绦行阅K省了w的使用.
可惜的是ORACLE只蔚谋硖峁└咚倬n(cache buffering) ,@功能K不m用於多表B接查.
Y料管理T必在init.ora中@^域O置合m的,@w^域越大,就可以保留更多的Z句,然被共用的可能性也就越大了.
你向ORACLE 提交一SQLZ句,ORACLE首先在@Kw中查找相同的Z句.
@Y需要注明的是,ORACLE烧袢〉氖且环N栏衿ヅ,要_成共用,SQLZ句必
完全相同(包括空格,Q行等).
共用的Z句必M足三l件:
A. 字元的比^:
前被绦械恼Z句和共用池中的Z句必完全相同.
例如:
SELECT * FROM EMP;
和下列每一都不同
SELECT * from EMP;
Select * From Emp;
SELECT * FROM EMP;
B. Z句所指的物件必完全相同:
例如:
用 物件名 如何L
Jack sal_limit private synonym
Work_city public synonym
Plant_detail public synonym
Jill sal_limit private synonym
Work_city public synonym
Plant_detail table owner
考]一下下列SQLZ句能否在@用糁g共用.
SQL
能否共用
原因
select max(sal_cap) from sal_limit;
不能
每用舳加幸private synonym - sal_limit , 它是不同的物件
select count(*0 from work_city where sdesc like 'NEW%';
能
用粼L相同的物件public synonym - work_city
select a.sdesc,b.location from work_city a , plant_detail b where
a.city_id = b.city_id
不能
用jack 通^private synonymLplant_detail 而jill 是表的所有者,物件不同.
C. SQLZ句中必使用相同的名字的定(bind variables)
例如:
第一M的SQLZ句是相同的(可以共用),而第二M中的Z句是不同的(即使在\行r,x於不同的定迪嗤的值)
a.
select pin , name from people where pin = :blk1.pin;
select pin , name from people where pin = :blk1.pin;
b.
select pin , name from people where pin = :blk1.ot_ind;
select pin , name from people where pin = :blk1.ov_ind;
4. x褡钣行率的表名序(只在基於t的化器中有效)
ORACLE的解析器按照挠业阶蟮捻序理FROM子句中的表名,因此FROM子句中在最後的表(基A表 driving
table)⒈蛔钕忍理. 在FROM子句中包含多表的情r下,你必x裼l底钌俚谋碜基A表.ORACLE理多表r,
\用排序及合愕姆绞竭B接它.首先,呙璧谝表(FROM子句中最後的那表)KτM行派序,然後呙璧诙表(FROM子句中最後第二表),最後⑺有牡诙表中z索出的c第一表中合mM行合.
例如:
表 TAB1 16,384 l
表 TAB2 1 l
xTAB2作基A表 (最好的方法)
select count(*) from tab1,tab2 绦rg0.96秒
xTAB2作基A表 (不佳的方法)
select count(*) from tab2,tab1 绦rg26.09秒
如果有3以上的表B接查, 那就需要x窠徊姹(intersection table)作基A表,
交叉表是指那被其他表所引用的表.
例如:
EMP表描述了LOCATION表和CATEGORY表的交集.
SELECT *
FROM LOCATION L ,
CATEGORY C,
EMP E
WHERE E.EMP_NO BETWEEN 1000 AND 2000
AND E.CAT_NO = C.CAT_NO
AND E.LOCN = L.LOCN
⒈认铝SQL更有效率
SELECT *
FROM EMP E ,
LOCATION L ,
CATEGORY C
WHERE E.CAT_NO = C.CAT_NO
AND E.LOCN = L.LOCN
AND E.EMP_NO BETWEEN 1000 AND 2000
5. WHERE子句中的B接序.
ORACLE裼米韵露上的序解析WHERE子句,根@原理,表之g的B接必在其他WHEREl件之前,
那些可以^V掉最大盗坑的l件必在WHERE子句的末尾.
例如:
(低效,绦rg156.3秒)
SELECT …
FROM EMP E
WHERE SAL >50000
AND JOB = ‘MANAGER’
AND 25 < (SELECT COUNT(*) FROM EMP
WHERE MGR=E.EMPNO);
(高效,绦rg10.6秒)
SELECT …
FROM EMP E
WHERE 25 < (SELECT COUNT(*) FROM EMP
WHERE MGR=E.EMPNO)
AND SAL >50000
AND JOB = ‘MANAGER’;
6. SELECT子句中避免使用 ‘ * ‘
你想在SELECT子句中列出所有的COLUMNr,使用BSQL列引用 ‘*’
是一方便的方法.不幸的是,@是一非常低效的方法. H上,ORACLE在解析的^程中, ’*’ 依次DQ成所有的列名,
@工作是通^查Y料字典完成的, @意味著⒑馁M更多的rg.
7. p少LY料斓拇
绦忻lSQLZ句r, ORACLE在炔绦辛嗽S多工作: 解析SQLZ句, 估算索引的利用率, 定 , xY料K等等.
由此可, p少LY料斓拇 , 就能H上p少ORACLE的工作量.
例如,
以下有三N方法可以z索出雇T等於0342或0291的T.
方法1 (最低效)
SELECT EMP_NAME , SALARY , GRADE
FROM EMP
WHERE EMP_NO = 342;
SELECT EMP_NAME , SALARY , GRADE
FROM EMP
WHERE EMP_NO = 291;
方法2 (次低效)
DECLARE
CURSOR C1 (E_NO NUMBER) IS
SELECT EMP_NAME,SALARY,GRADE
FROM EMP
WHERE EMP_NO = E_NO;
BEGIN
OPEN C1(342);
FETCH C1 INTO …,..,.. ;
…..
OPEN C1(291);
FETCH C1 INTO …,..,.. ;
CLOSE C1;
END;
方法3 (高效)
SELECT A.EMP_NAME , A.SALARY , A.GRADE,
B.EMP_NAME , B.SALARY , B.GRADE
FROM EMP A,EMP B
WHERE A.EMP_NO = 342
AND B.EMP_NO = 291;
注意:
在SQL*Plus , SQL*Forms和Pro*C中重新O置ARRAYSIZE, 可以增加每次Y料煸L的z索Y料量
,建h值200
8. 使用DECODE函p少理rg
使用DECODE函悼梢员苊庵呙柘嗤或重瓦B接相同的表.
例如:
SELECT COUNT(*),SUM(SAL)
FROM EMP
WHERE DEPT_NO = 0020
AND ENAME LIKE ‘SMITH%’;
SELECT COUNT(*),SUM(SAL)
FROM EMP
WHERE DEPT_NO = 0030
AND ENAME LIKE ‘SMITH%’;
你可以用DECODE函蹈咝У氐玫较嗤Y果
SELECT COUNT(DECODE(DEPT_NO,0020,’X’,NULL)) D0020_COUNT,
COUNT(DECODE(DEPT_NO,0030,’X’,NULL)) D0030_COUNT,
SUM(DECODE(DEPT_NO,0020,SAL,NULL)) D0020_SAL,
SUM(DECODE(DEPT_NO,0030,SAL,NULL)) D0030_SAL
FROM EMP WHERE ENAME LIKE ‘SMITH%’;
似的,DECODE函狄部梢赃\用於GROUP BY 和ORDER BY子句中.
9. 整合,oP的Y料煸L
如果你有蔚馁Y料觳樵Z句,你可以把它整合到一查中(即使它之g]有PS)
例如:
SELECT NAME
FROM EMP
WHERE EMP_NO = 1234;
SELECT NAME
FROM DPT
WHERE DPT_NO = 10 ;
SELECT NAME
FROM CAT
WHERE CAT_TYPE = ‘RD’;
上面的3查可以被合愠梢:
SELECT E.NAME , D.NAME , C.NAME
FROM CAT C , DPT D , EMP E,DUAL X
WHERE NVL(‘X’,X.DUMMY) = NVL(‘X’,E.ROWID(+))
AND NVL(‘X’,X.DUMMY) = NVL(‘X’,D.ROWID(+))
AND NVL(‘X’,X.DUMMY) = NVL(‘X’,C.ROWID(+))
AND E.EMP_NO(+) = 1234
AND D.DEPT_NO(+) = 10
AND C.CAT_TYPE(+) = ‘RD’;
(g者按: m然袢∵@N方法,效率得到提高,但是程式的可x性大大降低,所以x者 是要嗪庵g的利弊)
10. h除重陀
最高效的h除重陀方法 ( 因使用了ROWID)
DELETE FROM EMP E
WHERE E.ROWID >(SELECT MIN(X.ROWID)
FROM EMP X
WHERE X.EMP_NO = E.EMP_NO);
11. 用TRUNCATE替代DELETE
h除表中的r,在通常情r下, 回L段(rollback segments ) 用泶娣趴梢员换偷馁Y.
如果你]有COMMIT事,ORACLE①Y料恢偷h除之前的B(蚀_地f是
恢偷绦h除命令之前的r)
而\用TRUNCATEr,
回L段不再存放任何可被恢偷馁Y.命令\行後,Y料不能被恢.因此很少的Y源被{用,绦rg也很短.
(g者按: TRUNCATE只在h除全表m用,TRUNCATE是DDL不是DML)
12. 量多使用COMMIT
只要有可能,在程式中量多使用COMMIT, @映淌降男阅艿玫教岣,需求也因COMMIT所放的Y源而p少:
COMMIT所放的Y源:
a. 回L段上用於恢唾Y料的Y.
b. 被程式Z句@得的i
c. redo log buffer 中的空g
d. ORACLE管理上述3NY源中的炔炕ㄙM
(g者按: 在使用COMMITr必要注意到事盏耐暾性,F中效率和事胀暾性往往是~和熊掌不可得兼)
13. 算l
和一般的^c相反, count(*) 比count(1)稍快 , 然如果可以通^索引z索,λ饕列的等耘f是最快的. 例如
COUNT(EMPNO)
(g者按: 在CSDN中,曾Υ擞羞^相崃业挠,
作者的^cK不十分蚀_,通^H的y,上述三N方法K]有@著的性能差e)
14. 用Where子句替QHAVING子句
避免使用HAVING子句, HAVING 只在z索出所有之後才Y果集M行^V. @理需要排序,等操作.
如果能通^WHERE子句限制的的,那就能p少@方面的_N.
例如:
低效:
SELECT REGION,AVG(LOG_SIZE)
FROM LOCATION
GROUP BY REGION
HAVING REGION REGION != ‘SYDNEY’
AND REGION != ‘PERTH’
高效
SELECT REGION,AVG(LOG_SIZE)
FROM LOCATION
WHERE REGION REGION != ‘SYDNEY’
AND REGION != ‘PERTH’
GROUP BY REGION
(g者按: HAVING 中的l件一般用於σ恍┘合函档谋容^,如COUNT() 等等.
除此而外,一般的l件在WHERE子句中)
15. p少Ρ淼牟樵
在含有子查的SQLZ句中,要特e注意p少Ρ淼牟樵.
例如:
低效
SELECT TAB_NAME
FROM TABLES
WHERE TAB_NAME = ( SELECT TAB_NAME
FROM TAB_COLUMNS
WHERE VERSION = 604)
AND DB_VER= ( SELECT DB_VER
FROM TAB_COLUMNS
WHERE VERSION = 604)
高效
SELECT TAB_NAME
FROM TABLES
WHERE (TAB_NAME,DB_VER)
= ( SELECT TAB_NAME,DB_VER)
FROM TAB_COLUMNS
WHERE VERSION = 604)
Update 多Column 例子:
低效:
UPDATE EMP
SET EMP_CAT = (SELECT MAX(CATEGORY) FROM EMP_CATEGORIES),
SAL_RANGE = (SELECT MAX(SAL_RANGE) FROM EMP_CATEGORIES)
WHERE EMP_DEPT = 0020;
高效:
UPDATE EMP
SET (EMP_CAT, SAL_RANGE)
= (SELECT MAX(CATEGORY) , MAX(SAL_RANGE)
FROM EMP_CATEGORIES)
WHERE EMP_DEPT = 0020;
16. 通^炔亢堤岣SQL效率.
SELECT H.EMPNO,E.ENAME,H.HIST_TYPE,T.TYPE_DESC,COUNT(*)
FROM HISTORY_TYPE T,EMP E,EMP_HISTORY H
WHERE H.EMPNO = E.EMPNO
AND H.HIST_TYPE = T.HIST_TYPE
GROUP BY H.EMPNO,E.ENAME,H.HIST_TYPE,T.TYPE_DESC;
通^{用下面的函悼梢蕴岣咝率.
FUNCTION LOOKUP_HIST_TYPE(TYP IN NUMBER) RETURN VARCHAR2
AS
TDESC VARCHAR2(30);
CURSOR C1 IS
SELECT TYPE_DESC
FROM HISTORY_TYPE
WHERE HIST_TYPE = TYP;
BEGIN
OPEN C1;
FETCH C1 INTO TDESC;
CLOSE C1;
RETURN (NVL(TDESC,’ ’));
END;
FUNCTION LOOKUP_EMP(EMP IN NUMBER) RETURN VARCHAR2
AS
ENAME VARCHAR2(30);
CURSOR C1 IS
SELECT ENAME
FROM EMP
WHERE EMPNO=EMP;
BEGIN
OPEN C1;
FETCH C1 INTO ENAME;
CLOSE C1;
RETURN (NVL(ENAME,’ ’));
END;
SELECT H.EMPNO,LOOKUP_EMP(H.EMPNO),
H.HIST_TYPE,LOOKUP_HIST_TYPE(H.HIST_TYPE),COUNT(*)
FROM EMP_HISTORY H
GROUP BY H.EMPNO , H.HIST_TYPE;
(g者按: 常在中看到如 ’能不能用一SQL出….’ 的N子, 殊不知}s的SQL往往奚了绦行率.
能蛘莆丈厦娴倪\用函到Q}的方法在H工作中是非常有意x的)
17. 使用表的e名(Alias)
在SQLZ句中B接多表r,
使用表的e名K把e名字首於每Column上.@右,就可以p少解析的rgKp少那些由Column歧x引起的Z法e`.
(g者注:
Column歧x指的是由於SQL中不同的表具有相同的Column名,SQLZ句中出F@Columnr,SQL解析器o法判噙@Column的w)
18. 用EXISTS替代IN
在S多基於基A表的查中,了M足一l件,往往需要α硪表M行接.在@N情r下, 使用EXISTS(或NOT
EXISTS)通常⑻岣卟樵的效率.
低效:
SELECT *
FROM EMP (基A表)
WHERE EMPNO >0
AND DEPTNO IN (SELECT DEPTNO
FROM DEPT
WHERE LOC = ‘MELB’)
高效:
SELECT *
FROM EMP (基A表)
WHERE EMPNO >0
AND EXISTS (SELECT ‘X’
FROM DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
AND LOC = ‘MELB’)
(g者按: 相碚f,用NOT EXISTS替QNOT IN ⒏@著地提高效率,下一中⒅赋)
19. 用NOT EXISTS替代NOT IN
在子查中,NOT IN子句绦幸炔康呐判蚝秃. o在哪N情r下,NOT IN都是最低效的
(因它ψ硬樵中的表绦辛艘全表遍). 了避免使用NOT IN ,我可以把它改成外B接(Outer Joins)或NOT
EXISTS.
例如:
SELECT …
FROM EMP
WHERE DEPT_NO NOT IN (SELECT DEPT_NO
FROM DEPT
WHERE DEPT_CAT=’A’);
了提高效率.改:
(方法一: 高效)
SELECT ….
FROM EMP A,DEPT B
WHERE A.DEPT_NO = B.DEPT(+)
AND B.DEPT_NO IS NULL
AND B.DEPT_CAT(+) = ‘A’
(方法二: 最高效)
SELECT ….
FROM EMP E
WHERE NOT EXISTS (SELECT ‘X’
FROM DEPT D
WHERE D.DEPT_NO = E.DEPT_NO
AND DEPT_CAT = ‘A’);
20. 用表B接替QEXISTS
通常碚f , 裼帽磉B接的方式比EXISTS更有效率
SELECT ENAME
FROM EMP E
WHERE EXISTS (SELECT ‘X’
FROM DEPT
WHERE DEPT_NO = E.DEPT_NO
AND DEPT_CAT = ‘A’);
(更高效)
SELECT ENAME
FROM DEPT D,EMP E
WHERE E.DEPT_NO = D.DEPT_NO
AND DEPT_CAT = ‘A’ ;
(g者按: 在RBO的情r下,前者的绦新桨括FILTER,後者使用NESTED LOOP)
更多推荐
oracle里的常用命令数据库教程
发布评论