oracle之回顧二

 

 TCL

1.  事務(Transaction)

事務(Transaction)是一個操做序列。這些操做要麼都作, 要麼都不作, 是一個不可分割的工做單元, 是數據庫環境中的最小工做單元。sql

1.1 事務的特性(ACID)

1.1.1 Atomicity(原子性)

原子性是指事務包含的全部操做要麼所有成功, 要麼所有失敗回滾, 所以事務的操做若是成功就必需要徹底應用到數據庫, 若是操做失敗則不能對數據庫有任何影響.數據庫

1.1.2 Consistency(一致性)

一致性是指事務必須使數據庫從一個一致性狀態變換到另外一個一致性狀態, 也就是說一個事務執行以前和執行以後都必須處於一致性狀態.服務器

1.1.3 Isolation(隔離性)

隔離性是當多個用戶併發訪問數據庫時, 好比操做同一張表時, 數據庫爲每個用戶開啓的事務, 不能被其餘事務的操做所幹擾, 多個併發事務之間要相互隔離.session

1.1.4 Durability(持久性)

持久性是指一個事務一旦被提交了, 那麼對數據庫中的數據的改變就是永久性的, 即使是在數據庫系統遇到故障的狀況下也不會丟失提交事務的操做.併發

1.2 事務的提交和回滾

a) 提交在確保事務執行成功時應該將事務進行提交提交後數據被永久保存不能進行回滾.oracle

commit;ide

b) 回滾當事務執行出現故障時應該進行事務的回滾操做本次事務的全部操做將被還原保證數據庫的一致性.函數

rollback;工具

c)設置回滾點   savepoint 測試

1.3設置回滾點

insert into emp values(2,'dsfs',3000);

savepoint  A;

insert into emp values(3,'oldu',4000);

savepoint B;

 delete from emp;

rollback to A;

commit;

 事務類型

 

顯式事務

須要咱們手動的提交或者回滾

DML語言中的全部操做都是顯示事務。

 

隱式事務

數據庫自動提交不須要咱們作任何處理,同時也不具有回滾性。

DDL、DCL語言都是隱式事務。

 

DDL

 

2.建立表

   create table dept

      ( deptno number(2),

       dname varchar2(14),

      loc varchar2(2) );

2.1Oracle數據庫中的表

  用戶表:

      由用戶建立和維護的表的集合。

      包含用戶信息。

  數據字典:

      由oracle服務器建立和維護的表的集合

      包含數據庫信息

2.1.1常見的數據字典表

    查看本用戶所擁有的表的名稱

      select table_name 

      from  user_tables;

    查看本用戶所擁有的不一樣的對象類型

      select distinct object_type

      from user_objects;

    查看本用戶所擁有的表、視圖、同義詞、和序列

      select * from

      from user_catalog;

2.1.2.根據查詢建立表

 

    create table dept as select employee_id,last_name,salary,hire_date from employees e where  e.department_id=80;

3.alter table 語句

  alter table語句能夠修改表的信息。

    添加一個新列

    修改一個已存在的列

    刪除一個列

3.1添加一個新的列

  alter table table

  add ( column datatype [default expr][,column datatype]....);

 

 

     alter table dept add(salary number(8,2))

 

修改數據數據類型

  alter table dept modify(dname varchar2(40));

修改默認值

  alter table dept modify(salary number(8,2) default 1000);

  alter table dept80 modify location_id not null;

修改列名

  alter table emp rename   column  dname to name;

刪除一個列

  alter table table 

  drop  colum  [ziduan];

 

4修更名稱(Rename)

 

修改表以下

rename dept80 to dept90;

 

5.截斷表(truncate table)

特色:

1.直接將全部的數據刪除,可是表結構是留着的。

2.在截斷表時不能指定條件。

3.截斷表是隱式事務。

 truncate  table dept90

 

6.刪除表(drop table)

 

 drop table dept90;

 

7.數據庫中的約束

非空約束(NOT NULL)

惟一性約束(UNIQUE)

主鍵約束(PRIMARY KEY)

外鍵約束(FOREIGN KEY): 在列和引用表的一個列之間創建而且強制一個外鍵關係

用戶自定義約束(CHECK)

 

7.1定義約束原則

  建立一個約束:在建立表的同時,或者在建立表以後均可以定義約束。能夠給約束起名字,可是約束名不能相同,必須是惟一的。若是沒有爲約束起名字,oracle服務器會將默認格式SYS_Cn產生一個名字,這裏n是一個惟一的整數,因此約束名是惟一的。

 

 

8.定義Not NULL約束

8.1實例

create table dept80(

id number,

name varchar2(20) not null,

salary number constraint dept_80_notn not null);

)

 

9.定義UNIQUE惟一性約束

 

create table(

  employee_id  number(6),

  last_name  varchar2(25) not null,

  email varchar2(25),

  salary  number(8,2),

  commission_pct   number(2,2)

  hire_date date not null,

....

  constraint emp_email_uk unique(email);

)

 

create table dept90(id number constraint dept90_uk  unique, name varchar2(20));

 

修改表定義unique約束

 

alter table dept90 modify(name unique);

 

10.定義primary key約束

  create table department(

  department_id    number(4),

  department_name   varchar2(30),

  CONSTRAINT  dept_name_nn not null,

  manager_id    number(6),

  location_id     number(4),

    CONSTRAINT dept_id_pk  primary key(department id);

);

 

    

create table dept70(id number constraint  dept70_pk primary key);

 

在修改表中定義一個約束

alert table dept60 modify(id constraint dept60_pk primary key);

 

兩個列的主鍵定義方式

 

create table dept50(id number,name varchar2(20),constraint dept50_pk primary key(id,name));

 

 

 

11.定義foreign key 約束

create table employee(

  employee number(6),

  last_name  varchar2(25),

  email  varchar2(25),

  salary number(8,2),

  ......

  department_id number(4),

  constraint emp_dept_fk foreign key (department_id)

  references departments(department_id),

  constrant emp_email_uk unique(email);

)

 

建立表時定義foreignkey

         alter table dept50 add(constraint dept50_fk foreign key(d_id)references dept60(id));

 

12.定義check約束

...salary number(2) 

  constraint emp_salary_min

  check(salary>0)....

12.1建立表時定義check約束

  create table dept30 (id number,salary number(8,2) constraint dept30_ck check(salary>1000));

 

 

12.2修改表時添加check約束

alter table dept50 add(constraint dept50_ck check(d_id>1000));

 

 

13禁用與啓用約束

13.1查看約束

 

  select constraint_name ,cnstraint_type,

    search_condition

  from user_constraints

  where table_name='EMPLOYEES';

13.2禁用約束

alter table employee disable constraint emp_emp_id_pk cascade ;

 

alter table dept40 disable constraint dept40_ck;

 

 

級聯禁用

alter table dept60 disable constraint dept60_pk cascade;

使用級聯操做會使被操參照的外鍵約束也失效;

 

13.3啓用約束

alter table employees 

enable  constraint    emp_emp_id_pk;

 

13.3.1示例

alter table dept40 enable constraint  dept40_ck;

 

14.建立數據庫其餘對象

 

1.視圖

 

  能夠經過建立表的視圖來表現數據的邏輯子集或者數據的組合。視圖是基於表或另外一個視圖的邏輯表,

一個視圖並不包含它本身的數據,它像一個窗口,經過該窗口能夠查看或改變表中的數據。視圖基於其上的表稱爲基表。

  

1.2視圖的優越性

 

視圖限制數據的訪問,由於視圖可以選擇性的顯示錶中的列。

視圖能夠用來構成簡單的查詢以取出複雜查詢的結果。例如,視圖能用於從多表查詢信息,而用戶沒必要知道怎樣寫鏈接語句。

 

視圖對特別的用戶和應用程序提供數據獨立性,一個視圖能夠從表中取回數據。

 

1.3視圖分類

簡單視圖和複雜視圖

特性 簡單視圖 複雜視圖
表的數目 一個 一個或者多個
包含函數
包含數據分組
經過視圖進行DML操做 不容許

 

1.4簡單視圖VS複雜視圖

視圖有兩種分類:簡單和複雜,基本區別涉及DML(insert、update和delete)操做。

 

簡單視圖:

 

  數據僅來自一個表

不包括函數或數據分組

能經過視圖執行DML操做

 

複雜視圖:

 

  數據來自多個表

  包含函數或者數據分組

  不容許經過視圖進行DML操做

 

1.5建立簡單視圖

 

條件

  1. 只能對一個表進行查詢
  2. 在查詢當中不能包含函數
  3. 不能包含數據分組

 

 

create view empvu80

 as select employee_id,last_name,salary

  from employees

  where department_id=80;

 

1.5.1示例

建立一個視圖,視圖中包含部門id爲80的員工的id,名字以及薪水。

create view empvu80

 as select employee_id,last_name,salary

  from employees

  where department_id=80;

 

1.6用子查詢中的列別名建立視圖

若是在建立視圖的查詢語句中包含有列別名,那麼列別名將做爲視圖的別名。

 

實例

建立一個視圖,包含部門id爲50的員工id使用ID_NVMBER命名該列,包含員工名字使用name命名該列,包含員工的年薪使用ANN_SALARY命名該列。

 

create view emp50 as select e.employee_id id_number,e.last_name,12*e.salary   ann_salary from employee e;

 

1.7從視圖中取回數據

示例一:

查詢部門id爲80的員工信息,包含他們的id,名字以及薪水。

 

select * from emp80;

 

實例二:

查詢部門id爲50的員工信息,包含他們的id和薪水。

 

select  e.id_number, e.ann_salary from emp50 e;

 

不能查詢視圖中未包含的列。

 

1.8建立複雜視圖

 

 特色:

  1.   當個人視圖查詢是來自於兩張表的
  2.   在個人語句當中包含了組函數也就是聚合函數
  3.   當咱們的查詢當中有分組group by子句出現

 

  create view dept_sum_vu

    (name,minsal,maxsal,avgsal)

   as( select d.department_name,MiN(e.salary),

      MAX(e.salary),AVG(e.salary)

   from   employees e, departments d

   where  e.department_id=d.department_id

  group by  d.department_name;

 

1.8.1實例

  建立一個視圖,包含每一個部門的部門名稱,部門最低薪水、部門最高薪水以及部門的平均薪水。

1.9在定義視圖時指定列名

  select d.department_name,min(e.salary)  min,max(e.salary) max,avg(e.salary)  avg  from employees  e ,departments d where e.department_id=d.department_id group by d.department_name;

 

 

1.9.1示例

建立一個視圖,包含每一個部門的部門名稱、部門最低薪水、部門最高薪水以及部門的平均薪水。將部門名稱爲 name 、最低薪水命名爲minsal、最高薪水命名爲 maxsal  、平均薪水命名爲avgsal。

 

 

加別名1

create view dept_name as  select d.department_name,min(e.salary)  min,max(e.salary) max,avg(e.salary) avg

from employees  e ,departments d

where e.department_id=d.department_id

group by d.department_name;

 

加別名2

create view dept_name1 (name,minsal,maxsal,avgsal)as  select d.department_name,min(e.salary) ,max(e.salary),avg(e.salary) 

from employees  e ,departments d

where e.department_id=d.department_id

group by d.department_name;

 

1.10視圖中DML操做的執行規則

若是視圖中  包含下面的部分   就不能修改數據:

  組函數

  groupby 子句

  distinct關鍵字

  用表達式定義的列

1.10.1示例

  刪除emp80視圖中僱員ID爲100的僱員。

 

1.11拒絕DML操做

    create or replace view empvu10

        (employee_number, employee_name,job_title)

      as  select employee_id, last_name ,job_id

      from  empoyees 

      where department_id=10

      with read only;

 

 

1.12示例

建立一個簡單視圖、包含employees表中的全部數據,單該視圖拒絕DML操做。

 

create view v_emp as select * from  employees with read only;

1.13刪除視圖

      drop view  view

 

刪除視圖不會丟失數據,由於視圖是基於數據庫中的基本表的。

示例

刪除名稱爲emp90的視圖。

 

1.14內建視圖和子查詢

  1.14.1什麼是內建視圖

 

內建視圖是一個帶有別名(或者相關名)的能夠在sql語句中使用的子查詢

一個主查詢的在from子句中指定的子查詢就是一個內建視圖。

 

內建視圖:內建視圖由位於from子句中命名了別名的子查詢建立。該子查詢定義一個能夠在主查詢中引用數據源。

 

示例:

  顯示那些僱員低於他們部門最高薪水的僱員的名字、薪水、部門號和他們部門最高的薪水。

 

  select  em.last_name,em.salary,em.department_id ,e.maxsal 

 from employees em ,(select   e. department_id  , max(e.salary)  maxsal  from

employees e group by e.department_id) e 

 where em.department_id=e.department_id

em.salary<e.maxsal;

 

1.15Top-N分析

1.15.1什麼是「TOP-N」分析

top-n 查詢在須要基於一個條件,從表中顯示最前面的n條記錄或最後的n條記錄是有用的。該結果能夠用於進一步分析,例如,用top-n分析你能夠執行下面的查詢類型。

 

  • 在公司中掙錢最多的三我的
  • 公司中最新的四個員工
  • 銷售產品最多的兩個銷售表明
  • 過去六個月中銷售最好的3種產品。

1.15.2執行top分析

top-n查詢使用一個帶有下面描述的元素的一致的嵌套查詢結構:

子查詢或者內建視圖產生數據的排序列表,該子查詢或者內建視圖包含order by 子句來確保排序以想要的順序排序。爲了取回最大值,須要用desc參數。

 

在最後的結果集中用外查詢限制行數。外查詢包括下面的組成部分:

--rownum 僞列,它爲從子查詢返回的每一行指定一個從1開始連續的值

--一個where子句,它指定被返回的行,外where子句必須用一個<或者《=操做。

 

工資最高的三我的。

select rownum ,last_name,salary from(select last_name,salary from employees order bysalary desc)   where rownum <=3; 

 

1.16oralce的分頁查詢

1.16.1什麼是分頁查詢

 

  當查詢的結果集數據量過大時,可能會致使各類各樣的問題發生,例如,服務器資源被耗盡,因數據傳輸量過大而使處理超時,等等。最終都會致使查詢沒法完成。解決這個問題的一個策略就是分頁查詢,也就是說不要一次性查詢全部的數據,每次查詢一部分數據。這樣分批地進行處理,能夠呈現出很好的用戶體驗,對服務資源的消耗也不大。

 

  分頁查詢原則:

  在內建視圖中經過rownum僞劣值的判斷來指定獲取數據的數量。

 

1.16.2示例。

查詢僱員表中數據,每次只返回10條數據。

select * from (select rownum rn,e.* from employees e)em where em.rn >=1 and em.rn<=10;

 

select * from (select rownum rn,e.* from employees e)em where em.rn between 11 and 20;

2.序列

2.1什麼是序列

 

  序列是用戶建立的數據庫對象,序列會產生惟一的整數。序列的一個典型的用途是建立一個主鍵的值,它對於每一行必須是惟一的。序列由一個oracle內部程序產生並增長或者減小。

  序列是一個節省時間的對象,由於它能夠減小應用程序的代碼量。序列號獨立於表被存儲和產生,所以,相同的序列能夠被多個表使用。

 

2.2建立序列

2.2.1經過ddl語句建立序列

 

create  sequence sequencce

  [increment  by n]

  [start with n]

  [{maxvalue n| nomaxvalue}]

  [{minvalue n | nominvalue}]

  [{cycle | nocycle}]

  [{cache n|nocache}];

在語法中:

squence是序列發生器的名字

increment by n 指的是序列號之間的間隔,在這兒 n是一個整數(若是該子句被省略,序列量爲1)

start with n 指的是要產生的第一個序列數(若是該子句被省略,序列從1開始)

maxvalue n 指定序列能產生的最大值

nomaxvalue 對於升序序列指定10^27爲最大值,對於降序序列指定-1爲最大值(這裏是默認選項)

minvalue n 指定最小序列值

nominvalue 對於升序序列指定1爲最小值,對於降序序列指定-(10^27)爲最小值

cycle|nocycle指定序列在達到它的最大或者最小值以後,是否繼續產生(nocycle是默認選項)

cache n|nocache 指定oracle服務器預先分配多少值,而且在內存中(默認狀況下,oracle服務器緩衝20個值)

 

cteate sequence dept_seq increment by 10 start with 120 maxvalue 9999 nocache nocycle;

 

 

2.3操做序列

 

2.3.1查詢序列

      select sequence_name min_value,max_value,increment_by,last_number

      from  user_sequences;

 

2.3.2使用序列

NEXTVAL和curral僞列

nextval返回下一個可用的序列值,它每次返回一個惟一的被引用值,即便對於不一樣的用戶也是如此。

 

currval獲取當前的序列值

在currval獲取一個值之前,nextval對該序列必須發佈

 

      select test_seq.currval  from dual;

2.3.2.1示例

在location ID2500中插入一個新的部門名稱support。

 

insert into departments(department_id,department_name,location_id)

values(dept_seq.nextval,'Support',2500);

 

2.4修改序列

2.4.1修改序列

      alter sequence dept_deptid_seq

        increment by 20

      maxvalue 9999999

      nocache 

       nocycle;

 

2.4.2修改序列的原則

  必須是被修改序列的全部者,或者有alter權限。

  用alter sequence 語句,只有之後的序列數會受到影響。

  用alter sequence語句,startwith選項不能被改變。爲了以不一樣的數從新開始一個序列,該序列必須被刪除和從新建立。

2.4.2.1示例

將dept_seq序列中的增加量修改成20,最大爲999999.

   alter sequence dept_seq increment by 20 maxvalue 999999 nocache nocycle

 

2.4.3刪除序列

drop sequence dept_deptid_seq;

 

2.4.3.1示例

刪除dept_seq序列。

 

3.索引

3.1什麼是索引

 

  在關係型數據庫中,索引是一種單獨的、物理的對數據庫表中一列或者多列的值進行排序的一種存儲結構,它是某個表中一列或者若干列的集合和相應的指向表中物理標識這些值的數據頁的邏輯指針清單。索引的做用至關於圖書的目錄,能夠根據目錄中的頁碼快速找到所須要的內容。

  索引提供對錶中行的直接和快速訪問。它的目的是用已索引的路徑快速定位數據以減小磁盤I/O。索引由oracle服務器自動使用和維護,索引邏輯的和物理的獨立於他們索引的表,這意味着索引能夠在任什麼時候候被建立或者刪除,而且不影響基表或其餘的索引。

  當刪除表時,相應的索引也被刪除。

3.2索引的類型

  惟一性索引:當你在一個表中定義一個列爲主鍵,或者定義一個惟一建約束時oracle服務器自動建立該索引,索引的名字習慣上是約束的名字。

  非惟一性索引:由用戶建立,例如,能夠建立一個foreign key列索引用於一個查詢中的鏈接來改進數據取回的速度。

3.3建立索引的方式

  自動:在一個表的定義中,當定義一個primary key或者unique約束時,一個惟一索引被自動建立

  手動:用戶可以在列上建立非惟一的索引來加速對行的訪問。

3.4使用索引

  過多也是壞事。

  在表上創建更多的索引並不意味着更快地查詢,在帶索引地表上被提交地每一個dml操做意味着索引必須跟新:與表聯繫地索引越多,對oracle數據庫地影響越大,oracle數據庫每次dml操做以後必須跟新全部的索引。

 

3.4.1何時建立索引

  • 一個列包含一個大範圍的值
  • 一個列包含不少的空值
  • 一個列或多個列常常同時在一個where 子句中或者一個鏈接條件中使用
  • 表很大,而且常常的查詢指望取回少於百分之2到4的行。

 

3.4.2何時不建立索引

表很小

不常常在查詢中做爲條件被使用的列

大多數查詢指望取回多於表中百分之2到4行

表常常被更新

被索引的列做爲表達式的一部分被引用

 

3.5操做索引

3.5.1非惟一性索引的類型

oracle的非惟一性索引:單行索引,複合索引(組合索引),函數索引

 

3.5.2建立索引語法

create index index on

table (column[,column]......)

 

3.5.2.1建立單行索引

3.5.2.1.1示例

爲employees表中的last_name建立一個索引並命名爲emp_index。

 

create index emp_index on employees(last_name);

 

3.5.2.2.2示例

爲departments表建立一個包括manager_id與location_id複合索引並命名爲dept_man_loc。

create index dept_man_loc on departments(manager_id,location_id);

 

3.5.2.3建立函數索引

3.5.2.3.1示例

爲department表中的department_name建立一個帶有大寫函數的索引dept_upper2。

create index  dept_upper2 on departments(upper(department_name));

 

3.5.3查詢索引

USER_INDEXES數據字典視圖包含索引和它惟一的名字。

 

USER_IND_COLUMNS視圖包含索引名、表名和列名。

 

  select ic.index_name ,ic.column_name,

      ic.column_position  col_pos, ix.uniqueness

    from  user_indexes ix, user_ind columns ic 

    where ic.index_name=ix.index_name

    and ic.table_name='EMPLOYEES',

 

 

    select  ic.index_name,ic.column_name,ic.column_position,in.uniqueness  from user_indexes  ix ,user_ind_columns ic where ix.index_name=ic.index_name and ic.table_name=''departments;

 

 

3.5.4刪除索引

drop index index;

 

3.5.4.1示例

刪除名稱爲dept_upper的索引。

drop index dept_upper。

 

4.同義詞

 

4.1什麼是同義詞

  同義詞能夠除去對象名必須帶的方案限制,並提供給你一個可替換表名、視圖名、序列名和存儲過程名或者其餘對象名。

該該方法對具備特別長的對象的名字頗有用。

4.2建立和刪除同義詞

4.2.1建立同義詞

create sysnonym d_sum

for dept_sum_vu;

4.2.1.1示例

 create synonym dep for departments;

4.2.2刪除同義詞

drop synonym dep;

 

 

 

 

5.建立用戶

5.1什麼是oracle用戶

oracle用戶是來鏈接數據庫和訪問數據庫對象的。

 

5.2操做用戶

5.2.1建立用戶

須要具有建立用戶的權限可使用sys或者system用戶來建立新用戶。

 

  create user user

  indentified by password

 

5.2.1.1使用默認表空間

5.2.1.1.1示例

建立一個用戶名稱爲u_test,永久表空間使用oracle默認的永久表空間。

  create user u_test identified by oracle;

5.2.1.2使用指定表空間

create user u_wq identified by oracle default tablespace wq /(temporary  tablespace);

5.2.2.1示例

刪除u_test用戶

  drop user  u_test;

刪除用戶的同時將該用戶下的其餘對象一併刪掉。

  drop user u_test cascaed;

 

12、數據控制語言(DCL)

 

grant ... 授予用戶權限

revork  撤銷用戶權限

 

1.授予系統權限

    grant  create  session,create table,

        create sequence,create view

        to scott;

1.1授予建立其餘對象權限

  create session

  create table

  create sequence

   create procedure

  unlimited tablespace

 

爲u_wq用戶分配建立表、視圖、建立序列權限以及使用永久表空間權限。

grant  create table,create view ,create sequence to u_wq;  

grant unlimited tablespace to u_wq;

 

 

2.撤銷權限

revoke權限from 用戶

2.1示例

  revoke create table from u_wq;

撤銷u_wq用戶建立表的權限

  revoke create table from u_wq;

3.oracle中的角色

3.1什麼是角色

  角色是命名的能夠授予用戶的相關權限的組,該方法使得授予、撤回和維護權限容易的多。

一個用戶可使用幾個角色,而且幾個用戶也能夠被指定相同的角色。

3.2建立角色並授予權限給角色

  3.2.1建立角色

    create role manager;

 

3.2.1.1示例

  建立一個名稱爲manager的角色。

3.2.2授予權限給一個角色

      grant  create table ,create view to manager;

3.2.2.1示例一

向manager角色中添加會話,建立表、視圖、建立序列。

   grant create session,create table,create view ,create sequence to manager;

 

3.2.3授予一個角色給用戶

  grant manager to dehann ,kochhar;

3.2.3.1示例一

建立一個名稱爲wq用戶密碼爲wq。該用戶使用表空間wq。

  create user wq identified by wq default tablespace  wq;

3.2.3.2示例二

爲用戶分配能夠無限制的使用永久表空間

grant unlimited tablespace to wq;

3.2.3.3示例三

將manager角色分配給wq用戶。

    grant manager to wq;

3.2.3.4示例四

在wq用戶中建立一個測試表,包含一個id列類型爲整數類型。

    create table test(id number);

 

3.2.4撤銷用戶角色

3.2.4.1示例

  撤銷wq用戶的manager角色。

  revoke manager from wq;

 

十三經過PL/SQL Developer查看查詢的執行計劃

 

1.什麼是執行計劃

執行計劃是一條查詢語句在oracle中執行過程訪問路勁的描述。

2.配置執行計劃須要顯示的項

 

3.執行計劃的經常使用列字段解釋。

基數(Cardinality):oracle估計的當前操做的返回結果集行數

字節(Bytes):執行該步驟後返回的字節數。

耗費(COST)、cpu耗費:oracle估計的該步驟的執行成本,用於說明sql執行的。

time(Time):oracle估計的當前操做所需的時間

 

4.使用執行計劃

經過工具啓動執行計劃。選中須要查看執行計劃的查詢語句,在工具欄中選擇

Tools---->Explain  Plan或者F5

5.查看執行計劃

 

 

 5.1執行順序

縮進最多的最早執行:(縮進相同時,最上面的最早執行)。

 

5.2表訪問的幾種方式

TABLEACCESS FULL(全表掃描)

TABLEACCESS  BY INDEX ROWID(經過rowid的表存取)

TABLEACCESS BY INDEX SCAN(索引掃描)

 

5.2.1Table Acess full(全表掃描)

oracle會讀取表中全部的行,並檢查每一行是否知足sql語句中的where限制條件

使用建議,數據量太大的表不建議使用全表掃描,除非自己須要取出的數據較多,佔到表數據總量的5-10%以上。

 

5.2.2TABLE ACCESS BY INDEX ROWID (經過rowid的表存取)

5.2.2.1什麼是ROWID

  ROWID是oralce自動加在表中每行最後的一列僞列,就說明表中並不會物理存儲ROWID的值。

  你能夠像使用其餘列同樣使用它,只是不能對該列的值進行增刪改查操做。

  一旦一行數據插入後,則其對應的ROWID在該執行聲明週期內是惟一的,即便發生行遷移,該行的ROWID值也不變。

5.2.2.2TABLE ACCESS BYINDEX ROWID(索引掃描)

  行的rowid指出了該行所在的數據文件、數據塊以及行在該塊中的位置,因此經過rowid能夠快速定位到目標數據上,這也是oracle中存取單行數據最塊的方法。  

 

5.2.3.1索引掃描其實分爲兩步

1.掃描索引獲得對應的rowid。

2.經過rowid定位到具體的行讀取數據。

5.2.3.2五種索引掃描

 

index  unique scan (索引惟一掃描)

index range scan(索引範圍掃描)

index full scan(索引全掃描)

index fast full scan(索引快速掃描)

index skip scan(索引跳躍掃描)

 

5.2.4oracle的優化器

5.2.4.1oracle的優化器種類

RBO(Rule-Based Optimization) 基於規則的優化器

CBO(Cost-Based Optimization)基於代價的優化器

相關文章
相關標籤/搜索