??xml version="1.0" encoding="utf-8" standalone="yes"?>
http://www-128.ibm.com/developerworks/cn/java/j-ajax3/
http://wiki.hoodong.com/wiki/wUEYACAMERUdNXBNY
linuxq_?l名wasadmin,用户名wasadmin;windowsq_?l名为wasadmins,用户?wasadmin; websphere v6 安装完成?d到管理控制台 http://localhost:9060(安装时控制台监听端口)/admin/, 此时可以用Q何名U?包括I?而且不用输入密码)q陆到理控制台进?理操作.此时首页提示 未启用安全? 如果想锁定管理控制台,只允许某个用戯?理权限.可以登陆到控制台(http://localhost:9060/ibm/console) 开启安全性设|?
(1)登陆到管理控制台,q入 "pȝ理--控制台设|?-控制台组",d控制台组, 是安装前创建的llinux上ؓ wasadmin,windows上ؓwasadmins; 记得要保存设|呀.
(2)q入"pȝ理--控制台设|?-控制台用?,d控制台用? 是前面创徏得websphere用户.linux上ؓwasadmin,windows上ؓwasadmin.保存讄.
(3)?安全?-全局安全?里进行安全性设|? 扑ֈ"用户注册?-本地OS"q行用户注册.
服务器用h?wasadmin(和第二步中设|得用户名要一?.服务器用户密? pȝ中创建wasadmin用户时指定的用户密码.保存讄. (4)现在要启用全局安全性了.选中"启用全局安全?复选框,切记:一定要?强制Java2安全? l勾掉即不选中.(pȝ默认 启用全局安全??nbsp;启用 强制Java2安全?.如果你没有设|?java2安全?jvm授权),q里?启用了强制java2安全?服务可能会启动不了呀. zd协议默认:CSI和SAS;zd认证机制:我用的默认的"单WebSphere认证机制". 如果用LTPA的话,q需要再讄一ơ用户密?能不能用我可没试. zd用户注册?默认选中"本地OS".定制好像需要自己去写认证类?
至于LDAP好像需要指定的用户名是LDAP中的用户名和密码(2000中的AD,其他的不清楚) 至于"使用联邦信息处理标准QFIPSQ?q个选项我可没选中. 我是q么配置?重新启动服务器后,再登陆控制台时会弹出一?
认证???. 控制台让输入用户名和密码. 刚开始几ơ配|时没有执行1,2?W?步中q选中?强制Java2安全??"使用联邦信息处理标准QFIPSQ?.?启动服务都不能了.不知道是哪步出的问题.
CREATE TABLE ACL_OBJECT_IDENTITY(ID bigint(20) NOT NULL auto_increment,
OBJECT_ID_CLASS bigint(20) NOT NULL,
OBJECT_ID_IDENTITY bigint(20) NOT NULL,
PARENT_OBJECT bigint(20),
OWNER_SID bigint(20),
ENTRIES_INHERITING tinyint(1) NOT NULL,
CONSTRAINT UNIQUE_UK_3 unique key(OBJECT_ID_CLASS,OBJECT_ID_IDENTITY),
CONSTRAINT FOREIGN_FK_1 FOREIGN KEY(PARENT_OBJECT)REFERENCES ACL_OBJECT_IDENTITY(ID),
CONSTRAINT FOREIGN_FK_2 FOREIGN KEY(OBJECT_ID_CLASS)REFERENCES ACL_CLASS(ID),
CONSTRAINT FOREIGN_FK_3 FOREIGN KEY(OWNER_SID)REFERENCES ACL_SID(ID)
PRIMARY KEY (`id`)
)
CREATE TABLE ACL_ENTRY(ID bigint(20) NOT NULL auto_increment,
ACL_OBJECT_IDENTITY BIGINT(20) NOT NULL,
ACE_ORDER INT(11) NOT NULL,
SID BIGINT(20) NOT NULL,
MASK INTEGER NOT NULL,
GRANTING BOOLEAN NOT NULL,AUDIT_SUCCESS BOOLEAN NOT NULL,
AUDIT_FAILURE BOOLEAN NOT NULL,
CONSTRAINT UNIQUE_UK_4 UNIQUE(ACL_OBJECT_IDENTITY,ACE_ORDER),
CONSTRAINT FOREIGN_FK_4 FOREIGN KEY(ACL_OBJECT_IDENTITY) REFERENCES ACL_OBJECT_IDENTITY(ID),
CONSTRAINT FOREIGN_FK_5 FOREIGN KEY(SID) REFERENCES ACL_SID(ID)
PRIMARY KEY (`id`)
)
CREATE TABLE USERS(USERNAME varchar(50) NOT NULL ,
PASSWORD varchar(50) NOT NULL,
ENABLED BOOLEAN NOT NULL
PRIMARY KEY (USERNAME)
)
CREATE TABLE AUTHORITIES(USERNAME varchar(50) NOT NULL,
AUTHORITY varchar(50) NOT NULL,
CONSTRAINT FK_AUTHORITIES_USERS FOREIGN KEY(USERNAME) REFERENCES USERS(USERNAME));
CREATE UNIQUE INDEX IX_AUTH_USERNAME ON AUTHORITIES(USERNAME,AUTHORITY
)
CREATE TABLE CONTACTS(ID BIGINT(20) NOT NULL PRIMARY KEY, CONTACT_NAME varchar(50) NOT NULL,
EMAIL varchar(50) NOT NULL)
PRIMARY KEY (`id`)
CREATE TABLE Productions(ID BIGINT(20) NOT NULL ,
contactid BIGINT(20) NOT NULL,
production_NAME varchar(50) NOT NULL,
EMAIL varchar(50) NOT NULL
PRIMARY KEY (`id`)
)
-- add a unique constraint
ALTER TABLE personal_info
ADD CONSTRAINT personal_info_unique_con
UNIQUE (social_security_id);
-- add a check constraint
ALTER TABLE personal_info
ADD CONSTRAINT personal_info_check_con
CHECK ( dependents_claimed > 0);
-- enable a constraint
ALTER TABLE personal_info
ENABLE CONSTRAINT personal_info_check_con;
-- drop a constraint
ALTER TABLE personal_info
DROP CONSTRAINT personal_info_check_con;
NVL2 NVL
ALTER TABLE my_birthdays RENAME to birthdays;
-- create an index on a single column to make queries faster on that column
CREATE INDEX emp_hiredate_idx ON employees (hire_date);
-- rename the index
ALTER INDEX emp_hiredate_idx
RENAME TO emp_hire_date_idx;
-- drop the index
DROP INDEX emp_hire_date_idx;
-- create an index on two columns to make queries faster on the first column
-- or both columns
CREATE INDEX emp_mgr_id_ix ON employees (employee_id, manager_id);
DROP INDEX emp_mgr_id_ix;
-- a function-based index precalculates the result and speeds up queries that
-- use the function for searching or sorting, in this case UPPER(last_name)
CREATE INDEX emp_upper_last_name_ix ON employees (UPPER(last_name));
DROP INDEX emp_upper_last_name_ix;
CREATE OR REPLACE VIEW my_emp_view AS
SELECT d.department_id, d.department_name, d.manager_id,
e.employee_id, e.first_name, e.last_name
FROM employees e, departments d
WHERE d.manager_id = e.employee_id;
CURRVAL and NEXTVAL
CREATE SEQUENCE new_employees_seq START WITH 1000 INCREMENT BY 1;
DECODE(job_id, 'PU_CLERK', salary*1.05,--IF THEN ELSE
salary) "Revised Salary" FROM employees;
CREATE SYNONYM emps for HR.employees;
PL/SQL:anonymous blocks, stored functions, stored procedures, and packages
DBMS_OUTPUT.PUT_LINE
DECLARE
monthly_salary NUMBER(6);
number_of_days_worked NUMBER(2);
pay_per_day NUMBER(6,2);
-- the following is the executable part, from BEGIN to END
BEGIN
monthly_salary := 2290;
number_of_days_worked := 21;
pay_per_day := monthly_salary/number_of_days_worked;
-- the following displays output from the PL/SQL block
DBMS_OUTPUT.PUT_LINE('The pay per day is ' || TO_CHAR(pay_per_day));
-- the following is an optional exception part that handles errors
EXCEPTION
WHEN ZERO_DIVIDE THEN
pay_per_day := 0;
END;
/
CONSTANT :=
use the special qualifiers %TYPE and %ROWTYPE to declare variables that hold table columns or table rows.
IF-THEN, IF-THEN-ELSE, or IF-THEN-ELSEIF-ELSE
EXIT-WHEN
-- use WHILE LOOP to process data
WHILE i <= 10 LOOP
i_cubed := i**3;
DBMS_OUTPUT.PUT_LINE('Number: ' || TO_CHAR(i)
|| ' Cube: ' || TO_CHAR(i_cubed));
i := i + 1;
END LOOP;
FOR loop_counter IN 1..10 LOOP
DBMS_OUTPUT.PUT_LINE('Number: ' || TO_CHAR(loop_counter)
|| ' Square: ' || TO_CHAR(loop_counter**2));
END LOOP;
GOTO print_now;
END IF;
END LOOP;
p := ' is a prime number';
<<print_now>>
IN OUT IN OUT
A
ALL, ALTER, AND, ANY, ARRAY, ARROW, AS, ASC, AT
B
BEGIN, BETWEEN, BY
C
CASE, CHECK, CLUSTERS, CLUSTER, COLAUTH, COLUMNS, COMPRESS, CONNECT, CRASH, CREATE, CURRENT
D
DECIMAL, DECLARE, DEFAULT, DELETE, DESC, DISTINCT, DROP
E
ELSE, END, EXCEPTION, EXCLUSIVE, EXISTS
F
FETCH, FORM, FOR, FROM
G
GOTO, GRANT, GROUP
H
HAVING
I
IDENTIFIED, IF, IN, INDEXES, INDEX, INSERT, INTERSECT, INTO, IS
L
LIKE, LOCK
M
MINUS, MODE
N
NOCOMPRESS, NOT, NOWAIT, NULL
O
OF, ON, OPTION, OR, ORDER,OVERLAPS
P
PRIOR, PROCEDURE, PUBLIC
R
RANGE, RECORD, RESOURCE, REVOKE
S
SELECT, SHARE, SIZE, SQL, START, SUBTYPE
T
TABAUTH, TABLE, THEN, TO, TYPE
U
UNION, UNIQUE, UPDATE, USE
V
VALUES, VIEW, VIEWS
W
WHEN, WHERE, WITH
A
ACCESS, ADD*, ALL*, ALTER*, AND*, ANY*, AS*, ASC*, AUDIT
B
BETWEEN*, BY*
C
CHAR*, CHECK*, CLUSTER, COLUMN, COMMENT, COMPRESS, CONNECT*, CREATE*, CURRENT*
D
DATE*, DECIMAL*, DEFAULT*, DELETE*, DESC*, DISTINCT*, DROP*
E
ELSE*, EXCLUSIVE, EXISTS
F
FILE, FLOAT*, FOR*, FROM*
G
GRANT*, GROUP*
H
HAVING*
I
IDENTIFIED, IMMEDIATE*, IN*, INCREMENT, INDEX, INITIAL, INSERT*, INTERSECT*, INTO*, IS*
L
LEVEL*, LIKE*, LOCK, LONG
M
MAXEXTENTS, MINUS, MLSLABEL, MODE, MODIFY
N
NOAUDIT, NOCOMPRESS, NOT*, NOWAIT, NULL*, NUMBER
O
OF*, OFFLINE, ON*, ONLINE, OPTION*, OR*, ORDER*
P
PCTREE, PRIOR*, PRIVLEGES*, PUBLIC*
R
RAW, RENAME, RESOURCE, REVOKE*, ROW, ROWID, ROWNUM, ROWS*
S
SELECT*, SESSION*, SET*, SHARE, SIZE*, SMALLINT*, START, SUCCESSFUL, SYNONYM, SYSDATE
T
TABLE*, THEN*, TO*, TRIGGER
U
UID, UNION*, UNIQUE*, UPDATE*, USER*
V
VALIDATE, VALUES*, VARCHAR*, VARCHAR2, VIEW*
W
WHENEVER*, WHERE, WITH*
&my_variable &&my_variable DEFINE &my_variable="aaa"
V$RESERVED_WORDS
SELECT * FROM USER_OBJECTS
DESCRIBE wordcount
GRANT/REVOKE EXECUTE ON wordcount TO/FROM scoot
SELECT table_name, grantee,privilege FROM USER_TAB_PRIVS_MADE ;
EXEC DBMS_OUTPUT.PUT_LINE(booktitle('00-908-77889-0'))
HEADER
IS
Declaration Section
BEGIN
Execution Section
EXCEPTION
Exception Section
END;
DESC SYS.STANDARD
SELECT * FROM V$RESERVED_WORDS; GET RESERVED WORDS OF ORACLE
update standarditem set 規格=replace(規格,'','')
什么是索引
索引是徏立在表的一列或多个列上的辅助对象,目的是加快访问表中的数据Q?
Oracle存储索引的数据结构是B*树,位图索引也是如此Q只不过是叶子节点不同B*数烦引;
索引由根节点、分支节点和叶子节点l成Q上U烦引块包含下索引块的索引数据Q叶节点包含索引数据和确定行实际位置的rowid?
使用索引的目?
加快查询速度
减少I/O操作
消除盘排序
何时使用索引
查询q回的记录数
排序?lt;40%
非排序表 <7%
表的片较多Q频J增加、删除)
索引的种c?
非唯一索引Q最常用Q?
唯一索引
位图索引
局部有前缀分区索引
局部无前缀分区索引
全局有前~分区索引
散列分区索引
Z函数的烦?
理索引的准?
在表中插入数据后创徏索引
。在用SQL*Loader或import工具插入或装载数据后Q徏立烦引比较有效;
索引正确的表和列
。经常检索排序大表中40%或非排序?%的行Q徏议徏索引Q?
。ؓ了改善多表关联,索引列用于联l;
。列中的值相Ҏ较唯一Q?
。取D_大:B*树烦引,:位图索引Q;
。Date型列一般适合Z函数的烦引;
。列中有许多I|不适合建立索引
为性能而安排烦引列
。经怸起用多个字D|索记录,l合索引比单索引更有效;
。把最常用的列攑֜最前面Q例Qdx_groupid_serv_id(groupid,serv_id)Q在where条g中用groupid或groupid,serv_idQ查询将使用索引Q若仅用到serv_id字段Q则索引无效Q?
。合q?拆分不必要的索引?
限制每个表烦引的数量
。一个表可以有几百个索引Q你会这样做吗?Q,但是对于频繁插入和更新表Q烦引越多系lCPUQI/O负担p重;
。徏议每张表不超q?个烦引?
删除不再需要的索引
。烦引无效,集中表现在该使用Z函数的烦引或位图索引Q而用了B*树烦引;
。应用中的查询不使用索引Q?
。重建烦引之前必d删除索引Q若用alter index ?rebuild重徏索引Q则不必删除索引?
索引数据块空间?
。创建烦引时指定表空_特别是在建立主键Ӟ应明指定表I间Q?
。合理设定pctfressQ注意:不能l烦引指定pctusedQ?
。估计烦引的大小和合理地讄存储参数Q默认ؓ表空间大,或initial与next讄成一样大?
考虑q行创徏索引
。对大表可以采用q行创徏索引Q在q行创徏索引Ӟ存储参数被每个查询服务器q程分别使用Q例如:initial?MQƈ行度?Q则创徏索引期间臛_要消?MI间Q?
考虑用nologging创徏索引
。对大表创徏索引可以使用nologging来减重做日志;
。节省重做日志文件的I间Q?
。羃短创建烦引的旉Q?
。改善了q行创徏大烦引时的性能?
怎样建立最佳烦?
明确地创建烦?
Code:
create index index_name on table_name(field_name)
tablespace tablespace_name
pctfree 5
initrans 2
maxtrans 255
storage
(
minextents 1
maxextents 16382
pctincrease 0
);
创徏Z函数的烦?
。常用与UPPER、LOWER、TO_CHAR(date){函数分cMQ例Q?
Code:
create index idx_func on emp (UPPER(ename)) tablespace
tablespace_name;
创徏位图索引
。对基数较小Q且基数相对E_的列建立索引Ӟ首先应该考虑位图索引Q例Q?
Code:
create bitmap index idx_bitm on class (classno) tablespace
tablespace_name;
明确地创建唯一索引
。可以用create unique index语句来创建唯一索引Q例Q?
Code:
create unique index dept_unique_idx on dept(dept_no) tablespace
idx_1;
创徏与约束相关的索引
。可以用using index字句Qؓ与unique和primary keyU束相关的烦引,例如Q?
Code:
alter table table_name
add constraint PK_primary_keyname primary key (field_name)
using index tablespace tablespace_nameQ?/p>
如何创徏局部分区烦?
。基表必L分区表;
。分区数量与基础表相同;
。每个烦引分区的子分区数量与相应的基表分区相同;
。基表的子分Z的行的烦引项Q被存储在该索引的相应的子分Z,例如:
Code:
Create Index TG_CDR04_SERV_ID_IDX On TG_CDR04(SERV_ID)
Pctfree 5
Tablespace TBS_AK01_IDX
Storage (
MaxExtents 32768
PctIncrease 0
FreeLists 1
FreeList Groups 1
)
local
/
如何创徏范围分区的全局索引
。基表可以是全局表和分区表?
create index idx_start_date on tg_cdr01(start_date)
global partition by range(start_date)
(partition p01_idx vlaues less than (?106?
partition p01_idx vlaues less than (?111?
?
partition p01_idx vlaues less than (?401?))
/
重徏现存的烦?
重徏现存的烦引的当前时刻不会影响查询Q?
重徏索引可以删除额外的数据块Q?
提高索引查询效率Q?
alter index idx_name rebuild nologging;
对于分区索引Q?
alter index idx_name rebuild partition partiton_name nologging;
要删除烦引的原因
。不再需要的索引Q?
。烦引没有针对其相关的表所发布的查询提供所期望的性能改善Q?
。应用没有用该烦引来查询数据Q?
。该索引无效Q必d重徏之前删除该烦引;
。该索引已经变的太碎了,必须在重Z前删除该索引Q?
。语句:drop index idx_name;drop index idx_name drop partition partition_name;
建立索引的代?
基础表维护时Q系l要同时l护索引Q不合理的烦引将严重影响pȝ资源Q主要表现在CPU和I/O上;
插入、更新、删除数据生大量db file sequential read锁;
SQL优化器简?
Z规则的优化器
。L使用索引
。L从驱动表开始(from子句最双的表Q?
。只有在不可避免的情况下Q才使用全表扫描
。Q何烦引都可以
Z成本的优化器
。需要表、烦引的l计资料
Analyze table customer compute statistics;
Analyze table customer estimate statistics sample 5000 rows;
。表中设|ƈ行度、表分区
优化器模?
rule模式
。d略CBO和统计信息而基于规?
choose模式
。OracleҎ情况选择rule or first_rows or all_rows
first_rows 模式
。基于成本,以最快的速度q回记录Q会造成M查询速度的下降或消耗更多的资源Q們索引扫描Q适合OLTPpȝ
all_rows模式
。基于成本,保M查询旉最短,們q行全表扫描
例如Q?
Select last_name from customer order by last_name;用first_rowsӞq速返回记录,但I/O量大Q用all_rowsӞq回记录慢,但用资源少?
调整SQL表访?
全表扫描
。返回记录:未排序表>40%Q排序表>7%Q徏议采用ƈ行机制来提高讉K速度QDDSQ?
索引讉K
。最常用的方法,包括索引唯一扫描和烦引范围扫描,OLTPQ?
快速完全烦引扫?
。访问烦引中所有数据块Q结果相当于全表扫描Q可以用索引扫描代替全表扫描Q例如:
Select serv_id,count(* ) from tg_cdr01 group by serv_id;
评估全表扫描的合法?
如何实现q行扫描
。永久ƈ行化Q不推荐Q?
alter table customer parallel degree 8;
。单个查询ƈ行化
select /*+ full(emp) parallel(emp,8)*/ * from emp;
分区表效果明?
优化SQL语句排序
排序的操作:
。order by 子句
。group by 子句
。select distinct子句
。创建烦引时
。union或minus
。排序合q连?
如何避免排序
。添加烦?
。在索引中用distinct子句
。避免排序合q连?
使用提示q行调整
使用提示的原?
。语法:/*+ hint */
。用表别名:select /*+ index(e dept_idx)*/ * from emp e
。检验提C?
常用的提C?
。rule
。all_rows
。first_rows
。use_nl
。use_hash
。use_merge
。index
。index_asc
。no_index
。index_descQ常用于使用max内置函数Q?
。index_combine(强制使用位图索引)
。index_ffsQ烦引快速完全扫描)
。use_concat(查询中所有or条g使用union all)
。parallel
。noparallel
。full
。orderedQ基于成本)
调整表连?
表连接的cd
。等q接
where 条g中用{式q接Q?
。外部连接(左、右q接Q?
在where条g子句的等式谓词放|一?+)来实玎ͼ例如Q?
select a.ename,b.comm from emp a,bonus b where a.ename=b.ename(+);
该语句返回所有emp表的记录Q?
。自q接
Select a.value total, B.value hard, (A.value - b.value) soft ,
Round((b.value/a.value)*100,1) perc
From v$sysstat a,v$sysstat b
Where a.statistic# = 179
and B.statistic# = 180;
反连?
反连接常用于not in or not exists中,是指在查询中扑ֈ的Q何记录都不包含在l果集中的子查询Q不使用not in or not exists;
。半q接
查询中用existsQ含义:即在子查询中返回多条重复的记录Q外部查询也只返回一条记录?
嵌套循环q接
。被q接表中存在索引的情况下使用Q?
。用use_nl?
hashq接
。Hashq接驱动表加蝲在内存中Qƈ使用hash技术连接第二个表,提高{连接速度?
。适合于大表和表q接Q?
。用use_hash?
排序合ƈq接
。排序合q连接不使用索引
。用原则:
q接表子D中不存在可用烦引;
查询q回两个表中大部分的数据快;
CBO认ؓ全表扫描比烦引扫描执行的更快?
。用use_merge
使用临时/中间?
多个大表兌Ӟ可以分别把满x件的l果集存攑ֈ中间表,然后用中间表兌Q?
SQL子查询的调整
兌与非兌子查?
。关联:子查询的内部引用的是外部表,每行执行一ơ;
。非兌Q子查询只执行一ơ,存放在内存中?
调整not in 和not exists语句
。可以用外部连接优化not in子句Q例如:
Code:
select ename from emp where dept_no not in
(select dept_no from dept where dept_name =‘Math?;
改ؓQ?
Code:
select ename from emp,dept
where emp.dept_no=dept.dept_no
and dept.dept_name is null;
使用索引调整SQL
Oracle Z么不使用索引
。检查被索引的列或组合烦引的首列是否出现在PL/SQL语句的WHERE子句中,q是“执行计划”能用到相关索引的必要条件?
。看采用了哪U类型的q接方式。ORACLE的共有Sort Merge JoinQSMJQ、Hash JoinQHJQ和Nested Loop JoinQNLQ。在两张表连接,且内表的目标列上建有索引Ӟ只有Nested Loop才能有效地利用到该烦引。SMJ即相关列上建有索引Q最多只能因索引的存在,避免数据排序q程。HJ׃dHASHq算Q烦引的存在Ҏ据查询速度几乎没有影响?
。看q接序是否允许使用相关索引。假设表emp的deptno列上有烦引,表dept的列deptno上无索引QWHERE语句有emp.deptno=dept.deptno条g。在做NLq接Ӟemp做ؓ外表Q先被访问,׃q接机制原因Q外表的数据讉K方式是全表扫描,emp.deptno上的索引昄是用不上Q最多在其上做烦引全扫描或烦引快速全扫描?
。是否用到系l数据字典表或视图。由于系l数据字典表都未被分析过Q可能导致极差的“执行计划”。但是不要擅自对数据字典表做分析Q否则可能导致死锁,或系l性能下降?
。烦引列是否函数的参数。如是,索引在查询时用不上?
。是否存在潜在的数据cd转换。如字W型数据与数值型数据比较QORACLE会自动将字符型用to_number()函数q行转换Q从而导致上一U现象的发生?
。是否ؓ表和相关的烦引搜集够的l计数据。对数据l常有增、删、改的表最好定期对表和索引q行分析Q可用SQL语句“analyze table xxxx compute statistics for all indexes;”。ORACLE掌握了充分反映实际的l计数据Q才有可能做出正的选择?
。烦引列的选择性不高? 我们假设典型情况Q有表empQ共有一百万行数据,但其中的emp.deptno列,数据只有4U不同的|?0?0?0?0。虽然emp数据行有很多QORACLE~省认定表中列的值是在所有数据行均匀分布的,也就是说每种deptno值各?5万数据行与之对应。假设SQL搜烦条gDEPTNO=10Q利用deptno列上的烦引进行数据搜索效率,往往不比全表扫描的高?
。烦引列值是否可为空QNULLQ。如果烦引列值可以是I|在SQL语句中那些要q回NULL值的操作Q将不会用到索引Q如COUNTQ?Q,而是用全表扫描。这是因为烦引中存储g能ؓ全空?
。看是否有用到ƈ行查询(PQOQ。ƈ行查询将不会用到索引?
。如果从以上几个斚w都查不出原因的话Q我们只好用采用在语句中加hint的方式强制ORACLE使用最优的“执行计划”? hint采用注释的方式,有行注释和段注释两种方式? 如我们想要用到A表的IND_COL1索引的话Q可采用以下方式Q? “SELECT /*+ INDEXQA IND_COL1Q?/ * FROM A WHERE COL1 = XXX;"
如何屏蔽索引
语句的执行计划中有不良烦引时Q可以h为地屏蔽该烦引,ҎQ?
。数值型Q在索引字段上加0Q例?
Code:
select * from emp where emp_no+0 = v_emp_no;
。字W型Q在索引字段上加‘’,例如
Code:
select * from tg_cdr01 where msisdn||’?v_msisdn;
[1] 基本的烦引概?br /> 查询DBA_INDEXES视图可得到表中所有烦引的列表Q注意只能通过USER_INDEXES的方法来索模?schema)的烦引。访问USER_IND_COLUMNS视图可得C个给定表中被索引的特定列?/p>
[2] l合索引
当某个烦引包含有多个已烦引的列时Q称q个索引为组合(concatentedQ烦引。在 Oracle9i引入跌式扫描的索引讉KҎ之前Q查询只能在有限条g下用该索引。比如:表emp有一个组合烦引键Q该索引包含了empno、ename和deptno。在Oracle9i之前除非在where之句中对W一列(empnoQ指定一个|否则׃能用这个烦引键q行一ơ范围扫描?br /> 特别注意Q在Oracle9i之前Q只有在使用到烦引的前导索引时才可以使用l合索引Q?/p>
[3] ORACLE ROWID
通过每个行的ROWIDQ烦引Oracle提供了访问单行数据的能力。ROWID其实是直接指向单独行的U\图。如果想查重复值或是其他对ROWID本n的引用,可以在Q何表中用和指定rowid列。 ?
[4] 限制索引
限制索引是一些没有经验的开发h员经常犯的错误之一。在SQL中有很多陷阱会一些烦引无法用。下面讨Z些常见的问题Q?br />
4.1 使用不等于操作符Q?lt;>?=Q?br /> 下面的查询即使在cust_rating列有一个烦引,查询语句仍然执行一ơ全表扫描?br /> select cust_Id,cust_name
from customers
where cust_rating <> 'aa';
把上面的语句Ҏ如下的查询语句,q样Q在采用Z规则的优化器而不是基于代L优化器(更智能)Ӟ会使用索引?br /> select cust_Id,cust_name
from customers
where cust_rating < 'aa' or cust_rating > 'aa';
特别注意Q通过把不{于操作W改成OR条gQ就可以使用索引Q以避免全表扫描?br />
4.2 使用IS NULL 或IS NOT NULL
使用IS NULL 或IS NOT NULL同样会限制烦引的使用。因为NULL值ƈ没有被定义。在SQL语句中用NULL会有很多的麻烦。因此徏议开 发h员在Ӟ把需要烦引的列设成NOT NULL。如果被索引的列在某些行中存在NULL|׃会用这个烦引(除非索引是一个位囄 引,关于位图索引在稍后在详细讨论Q?/p>
4.3 使用函数
如果不用基于函数的索引Q那么在SQL语句的WHERE子句中对存在索引的列使用函数Ӟ会优化器忽略掉q些索引?br /> 下面的查询不会用烦引(只要它不是基于函数的索引Q?br /> select empno,ename,deptno
from emp
where trunc(hiredate)='01-MAY-81';
把上面的语句Ҏ下面的语句,q样可以通过索引q行查找?br /> select empno,ename,deptno
from emp
where hiredate<(to_date('01-MAY-81')+0.9999);
4.4 比较不匹配的数据cd
比较不匹配的数据cd也是比较难于发现的性能问题之一?br /> 注意下面查询的例子,account_number是一个VARCHAR2cdQ在account_number字段上有索引。下面的语句执行全表扫描?br /> select bank_name,address,city,state,zip
from banks
where account_number = 990354;
Oracle可以自动把where子句变成to_number(account_number)=990354Q这样就限制了烦引的使用,Ҏ下面的查询就可以使用索引Q?br /> select bank_name,address,city,state,zip
from banks
where account_number ='990354';
特别注意Q不匚w的数据类型之间比较会让Oracle自动限制索引的用,即便对这个查询执行Explain Plan也不能让您明白ؓ什么做了一 ơ“全表扫描”?/p>
[5] 选择?br /> 使用USER_INDEXES视图Q该视图中显CZ一个distinct_keys列。比较一下唯一键的数量和表中的行数Q就可以判断索引的选择性。选择性越高,索引q回的数据就少?/p>
[6] 集因子(Clustering Factor)
Clustering Factor位于USER_INDEXES视图中。该列反映了数据相对于已索引的列是否昑־有序。如果Clustering Factor列的值接q于索引中的树叶?leaf block)的数目,表中的数据就有序。如果它的值接q于表中的行敎ͼ则表中的数据׃是很有序?br />
[7] 二元高度(Binary height)
索引的二元高度对把ROWIDq回l用戯E时所要求的I/O量v到关键作用。在对一个烦引进行分析后Q可以通过查询DBA_INDEXES的B-level列查看它的二元高度。二元高度主要随着表的大小以及被烦引的列中值的范围的狭H程度而变化。烦引上如果有大量被删除的行Q它的二元高度也会增加。更新烦引列也类g删除操作Q因为它增加了已删除键的数目。重建烦引可能会降低二元高度?/p>
[8] 快速全局扫描
在Oracle7.3后就可以使用快速全局扫描(Fast Full Scan)q个选项。这个选项允许Oracle执行一个全局索引扫描操作。快速全局扫描dB-树烦引上所有树叶块。初始化文g中的DB_FILE_MULTIBLOCK_READ_COUNT参数可以控制同时被读取的块的数目?/p>
[9] 跌式扫?br /> 从Oracle9i开始,索引跌式扫描特性可以允怼化器使用l合索引Q即便烦引的前导列没有出现在WHERE子句中。烦引蟩跃式扫描比全索引扫描要快的多。下面的E序清单昄出性能的差别:
create index skip1 on emp5(job,empno);
index created.
select count(*)
from emp5
where empno=7900;
Elapsed:00:00:03.13
Execution Plan
0 SELECT STATEMENT Optimizer=CHOOSE(Cost=4 Card=1 Bytes=5)
1 0 SORT(AGGREGATE)
2 1 INDEX(FAST FULL SCAN) OF 'SKIP1'(NON-UNIQUE)
Statistics
6826 consistent gets
6819 physical reads
select /*+ index(emp5 skip1)*/ count(*)
from emp5
where empno=7900;
Elapsed:00:00:00.56
Execution Plan
0 SELECT STATEMENT Optimizer=CHOOSE(Cost=6 Card=1 Bytes=5)
1 0 SORT(AGGREGATE)
2 1 INDEX(SKIP SCAN) OF 'SKIP1'(NON-UNIQUE)
Statistics
21 consistent gets
17 physical reads
[10] 索引的类?br /> B-树烦?br /> 位图索引
HASH索引
索引~排?br /> 反{键烦?br /> Z函数的烦?br /> 分区索引
本地和全局索引
dom4j 是一U解?XML 文档的开放源代码 XML 框架。本文介l如何用包含在 dom4j 中的解析器创建ƈ修改 XML 文档?/P>
dom4j API 包含一个解?XML 文的工兗本文中用这个解析器创徏一个示?XML 文。清?1 昄了这个示?XML 文Qcatalog.xml?/P>清单 1. CZ XML 文档Qcatalog.xmlQ?/B>
|
然后使用同一个解析器修改 catalog.xmlQ清?2 是修改后?XML 文Qcatalog-modified.xml?/P>清单 2. 修改后的 XML 文Qcatalog-modified.xmlQ?/B>
|
?W3C DOM API 相比Q?dom4j 所包含的解析器的好处是 dom4j 拥有本地?XPath 支持。DOM 解析器不支持使用 XPath 选择节点?/P>
本文包括以下几个部分Q?/P>
预先讄
q个解析器可以从 http://dom4j.org/ 获取。通过讄?dom4j-1.4/dom4j-full.jar
能够?classpath 中访问,该文件中包括 dom4j cRXPath 引擎以及 SAX ?DOM 接口。如果已l用了 JAXP 解析器中包含?SAX ?DOM 接口Q向 classpath 中增?dom4j-1.4/dom4j.jar
?CODE>dom4j.jar 包括 dom4j cd XPath 引擎Q但是不?SAX ?DOM 接口?/P>
创徏文
本节讨论使用 dom4j API 创徏 XML 文的过E,q创建示?XML 文 catalog.xml?/P>
使用 import 语句导入 dom4j API c:
|
使用 DocumentHelper
cdZ个文实例?CODE>DocumentHelper 是生?XML 文档节点?dom4j API 工厂cR?/P>
|
使用 addElement()
Ҏ创徏根元?catalog
?CODE> addElement() 用于?XML 文中增加元素?/P>
|
?catalog
元素中?addComment()
Ҏd注释“An XML catalog”?/P>
|
?catalog
元素中?addProcessingInstruction()
Ҏ增加一个处理指令?/P>
|
?catalog
元素中?addElement()
Ҏ增加 journal
元素?/P>
|
使用 addAttribute()
Ҏ?journal
元素d title
?publisher
属性?/P>
|
?article
元素中添?journal
元素?/P>
|
?article
元素增加 level
?date
属性?/P>
|
?article
元素中增?title
元素?/P>
|
使用 setText()
Ҏ讄 article
元素的文本?/P>
|
?article
元素中增?author
元素?/P>
|
?author
元素中增?firstname
元素q设|该元素的文本?/P>
|
?author
元素中增?lastname
元素q设|该元素的文本?/P>
|
q样向 XML 文中增加文类型说明:
|
如果文要用文档类型定义(DTDQ文档验证则必须?Doctype?/P>
XML 声明 <?xml version="1.0" encoding="UTF-8"?>
自动d?XML 文档中?/P>
清单 3 所C的例子E序 XmlDom4J.java 用于创徏 XML 文 catalog.xml?/P>清单 3. 生成 XML 文 catalog.xml 的程序(XmlDom4J.javaQ?/B>
|
q一节讨Z创徏 XML 文档的过E,下一节将介绍使用 dom4j API 修改q里创徏?XML 文档?/P>
修改文档
q一节说明如何?dom4j API 修改CZ XML 文 catalog.xml?/P>
使用 SAXReader 解析 XML 文 catalog.xmlQ?/P>
|
SAXReader
包含?org.dom4j.io 包中?/P>
inputXml
是从 c:/catalog/catalog.xml 创徏?java.io.File。?XPath 表达式从 article
元素中获?level
节点列表。如?level
属性值是“Intermediate”则改ؓ“Introductory”?/P>
|
获取 article
元素列表Q从 article
元素中的 title
元素得到一个P代器Qƈ修改 title
元素的文本?/P>
|
通过?title
元素cM的过E修?author
元素?/P>
清单 4 所C的CZE序 Dom4JParser.java 用于?catalog.xml 文档修改?catalog-modified.xml 文档?/P>清单 4. 用于修改 catalog.xml 的程序(Dom4Jparser.javaQ?/B>
|
q一节说明了如何使用 dom4j 中的解析器修改示?XML 文档。这个解析器不?DTD 或者模式验?XML 文档。如?XML 文需要验证,可以解释?dom4j ?JAXP SAX 解析器?/P>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>
4.从ECLIPSE 3.1.1SDK IMPORT PROJECT UNDER compiere-all;