??xml version="1.0" encoding="utf-8" standalone="yes"?>caoprom在线,欧美蜜桃一区二区三区,亚洲va久久久噜噜噜久久http://www.aygfsteel.com/tojava/category/13334.htmlzh-cnWed, 12 Mar 2008 18:34:06 GMTWed, 12 Mar 2008 18:34:06 GMT60sqlhttp://www.aygfsteel.com/tojava/archive/2008/03/12/sq.htmll like life i like javal like life i like javaWed, 12 Mar 2008 07:58:00 GMThttp://www.aygfsteel.com/tojava/archive/2008/03/12/sq.htmlhttp://www.aygfsteel.com/tojava/comments/185718.htmlhttp://www.aygfsteel.com/tojava/archive/2008/03/12/sq.html#Feedback0http://www.aygfsteel.com/tojava/comments/commentRss/185718.htmlhttp://www.aygfsteel.com/tojava/services/trackbacks/185718.html

]]>
ACEGI 1.03 mysql sqlhttp://www.aygfsteel.com/tojava/archive/2007/04/13/acegi.htmll like life i like javal like life i like javaFri, 13 Apr 2007 09:58:00 GMThttp://www.aygfsteel.com/tojava/archive/2007/04/13/acegi.htmlhttp://www.aygfsteel.com/tojava/comments/110509.htmlhttp://www.aygfsteel.com/tojava/archive/2007/04/13/acegi.html#Feedback2http://www.aygfsteel.com/tojava/comments/commentRss/110509.htmlhttp://www.aygfsteel.com/tojava/services/trackbacks/110509.htmlCREATE TABLE ACL_SID(ID bigint(20)  NOT NULL auto_increment,
PRINCIPAL tinyint(1) NOT NULL,
SID varchar(45) NOT NULL,
constraint UNIQUE_UK_1 unique key(SID,PRINCIPAL)
PRIMARY KEY  (`id`)
)

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`)
)


       



]]>
ORACE DDhttp://www.aygfsteel.com/tojava/archive/2006/07/22/DD.htmll like life i like javal like life i like javaSat, 22 Jul 2006 08:17:00 GMThttp://www.aygfsteel.com/tojava/archive/2006/07/22/DD.htmlhttp://www.aygfsteel.com/tojava/comments/59549.htmlhttp://www.aygfsteel.com/tojava/archive/2006/07/22/DD.html#Feedback0http://www.aygfsteel.com/tojava/comments/commentRss/59549.htmlhttp://www.aygfsteel.com/tojava/services/trackbacks/59549.htmlpseudocolumns, such as the ROWNUM, SYSDATE, and USER
SELECT ROWNUM, SYSDATE, and USER FROM DUAL;
TRUNC(A,B)
UPPER(last_name), LOWER(A) ,INITCAP(first_name), INITCAP(last_name)
RTRIM(first_name)  LTRIM(last_name)  TRIM(last_name)  TRIM(first_name),RPAD(last_name, 30, ' ')
SUBSTR(last_name, 1, 10),REPLACE()
TO_CHAR(SYSDATE, 'DD-MON-YYYY AD')
EXTRACT(MONTH FROM SYSDATE),TO_NUMBER('1234.99'),TO_DATE('27-OCT-98', 'DD-MON-RR')
TO_TIMESTAMP('10-Sep-05 14:10:10.123000', 'DD-Mon-RR HH24:MI:SS.FF')
MONTHS_BETWEEN(SYSDATE, HIRE_DATE)),     ADD_MONTHS(hire_date, 3),LAST_DAY(hire_date),SYSTIMESTAMP
Aggregate functions include AVG, COUNT, DENSE_RANK, MAX, MIN, PERCENT_RANK, RANK, STDDEV, and SUM 
DISTINCT  COMMIT   ROLLBACK
DDL statements include CREATE, ALTER, and DROP
DML statements include SELECT, INSERT, and UPDATE
ALTER TABLE tablen ADD/MODIFY/DROP ....
 
ALTER TABLE personal_info
  ADD CONSTRAINT personal_info_pkey
  PRIMARY KEY (employee_id);
-- disable a constraint
ALTER TABLE personal_info
  DISABLE CONSTRAINT personal_info_check_con;
ALTER TABLE personal_info
  ADD CONSTRAINT personal_info_fkey
  FOREIGN KEY (employee_id) REFERENCES employees (employee_id)
  ON DELETE CASCADE;

-- 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 />     分区索引
     本地和全局索引



]]>
վ֩ģ壺 ԰| | | ī| ؼ| | | | | | | | Դ| | | ֯| Ž| Դ| ɽ| | | ˳| ɽ| | ̷| | Ϊ| ̨| | ض| ʯ| | ײ| ˮ| ͼ| ǹ| ƽ| | | Ϫ| ӳ|