讀《Oracle從入門到精通》筆記--持續更新中

第一章 Oracle 11g概述
1.6節 啓動與關閉數據庫實例
啓動數據庫:
Startup [nomount|mount|open|force][resetrict][pfile=filename]
解釋:nomount ---> 表示啓動實例不加載數據庫
mount ---> 表示啓動實例、加載數據庫並保持數據庫的關閉狀態
open ---> 表示啓動實例、加載並打開數據庫(默認選項)

force ---> 表示終止實例並重新啓動數據庫
resetrict  --> 用於指定受限制的會話方式啓動數據庫
pfile ---> 用於指定啓動實例是所使用的文本參數文件,filename 就是文件名。
關閉數據庫
shutdown [normal|transactional|immediate|abort] 
解釋:normal ---> 表示以正常方式關閉數據庫(阻止新建連接,等待正在連接的用戶主動斷開)
transactional ---> 表示在當前所有的活動事務被提交完畢之後,關閉數據庫(阻止新建連接和開始新事務,等到有活動的事務提交後再斷開用戶連接)
immediate   ---> 表示在儘可能短的時間內立即關閉數據庫(阻止新建連接和開始新事務,回退未提交的事務,關閉數據庫)
abort ---> 表示以終止方式來關閉數據庫(具有一定的強制性和破壞性)
第二章 Oracle 11g 體系
2.2 邏輯存儲結構
Oracle 數據庫 -> 表空間 -> 表   -> 數據段 -> 數據區 -> 數據塊
索引 -> 索引段 ...
視圖 -> ...
回滾段
臨時段
總之,Oracle數據庫由多個表空間組成(數據庫自身也屬於邏輯概念),而表空間由多個段組成,段由多個數據區組成,數據區由多個數據塊組成。

2.2.1 數據塊(Data Blocks)
數據塊:Oracle數據庫邏輯存儲結構中最小的邏輯單位,也是執行數據庫輸入輸出操作的最小存儲單位。
在v$parameter數據詞典中查詢標準數據塊的大小:
select name,value from v$parameter where name = 'db_block_size';
數據塊結構:塊頭(基本信息,物理地址、段的類型),表目錄(表相關信息),行目錄,空餘空間(未使用),行數據(已使用)。
2.2.2 數據區(Extent)
數據區:Oracle的最小的分配單位。數據區是表中數據增長的基本單位,在Oracle中,分配存儲空間就是以數據區位單位的。
一個Oracle對象包含至少一個數據區,設置一個表或索引的存儲參數包含設置它的數據區大小。
2.2.3 段(Segment)
段是一個獨立的邏輯存儲結構,用於存儲表、索引或簇等佔用空間的數據對象。一個段只屬於一種特定的數據對象,每當創建一個獨立的數據對象時,都將爲它創建一個段。
段是爲特定的數據對象(如表、索引、回滾等)分配的一些列數據區。段內包含的數據區可以不連續,並且可以跨越多個文件,使用段的目的是用來保存特定的數據對象。
段:數據段(存表的數據,通過添加新的數據區來實現表的增大)、索引段、回滾段(保存修改前的舊值)、臨時段。
2.2.4 表空間(TableSpace)
表空間是Oracle中最大的邏輯劃分區域,通常用來存放數據表、索引、回滾段等數據對象,任何數據對象在創建時都必須指定存儲在摸個表空間中。表空間(屬於邏輯存儲結構)
與數據文件(屬於物理存儲結構)相對應,一個表空間由一個或或多個數據文件組成,一個數據文件只屬於一個表空間;Oracle數據的存儲空間在邏輯上表現爲表空間,而在物理
上表現爲數據文件。舉個例子來說,表空間相當於操作系統中的文件夾,而數據文件就相當於文件夾中的文件。每個數據庫至少有一個表空間(即SYSTEM表空間),表空間的大小等於所有
從屬於他的數據文件的大小。
由於表空間在物理上(即磁盤)包括操作系統中的一個或多個數據文件,因此在表空間中創建的數據對象就存在以下兩種情況:
(1)若表空間只包含一個數據文件,則該表空間中的所有對象都存儲在這個數據文件中。
(2)若表空間包含多個數據文件,則Oracle即可將數據對象存儲在該表空間中的任意一個數據文件中,也可以將同一個數據對象中的數據分佈在表空間的多個數據文件中。

系統默認的表空間:
SYSTEM表空間 --- 系統表空間 : 用於存放Oracle系統內部表和數據詞典的數據,如表明、列名、用戶名等。
SYSAUX表空間 --- SYSTEM表空間的輔助表空間,降低SYSTEM的負荷。
UNDO表空間   --- 撤銷表空間,用於存儲撤銷信息的表空間。一般在Oracle實例後,Oracle系統自動創建一個名字爲“UNDOTBS1”的撤銷表空間,對應的數據文件是“UNDOTBS01.DBF”.
USERS表空間  --- 用戶表空間,是Oracle建議用戶使用的表空間,可以在這個表空間上創建各種數據對象,比如創建表、索引、用戶等數據對象。Oracle系統的樣例用戶SCOTT對象就存放在USRS表空間中。
除了Oracle系統默認創建的表空間外,用戶可根據應用系統的實際情況及其所要存放對象的類型創建多個自定義的表空間,以區分用戶數據與系統數據。此外,不同應用系統的數據應存放在不同的表空間上,
而不同的表空間的文件應存放在不同的硬盤上,從而減少I/O衝突,提高應用系統的操作性能。




2.3 物理存儲結構
Oracle數據庫的物理存儲結構由多個物理文件組成,主要有數據文件、控制文件、日誌文件、重做文件、歸檔日誌文件、參數文件、口令文件和警告文件等。
2.3.1 數據文件
用於保存用戶應用程序數據和Oracle系統內部數據文件。在創建表空間是,Oracle會創建表空間的數據文件。在表空間中創建數據對象時,用戶無法指定使用 哪個數據文件來進行存儲,只能由Oracle系統負責爲數據對象選擇具體的數據文件存儲。
讀取數據: 判斷是否存在高速緩存中,若不存在,從數據文件讀取數據,並將數據保存在高速數據緩衝區;若存在,從高速緩存取數。
修改、插入數據:先報數據保存在高速緩衝區,然後由Oracle的後臺進程DBWR決定如何將其寫入響應的數據文件。
查看系統數據文件:
select * from dba_data_files;
select * from v$datafile;
大致分爲:系統數據文件、撤銷數據文件、用戶數據文件
查看臨時數據文件:
select * from dba_temp_files;
2.3.2 控制文件
控制文件是一個二進制文件,它記錄了數據庫的物理結構,其中包含數據庫名、數據文件與日誌文件的名字和位置、數據庫創建日期等信息。控制文件一般在Oracle系統安裝時或創建數據庫實例時自動創建,控制文件所存放的路徑由服務器參數文件
spileorcl.ora的control_files參數值來指定。
Oracle的啓動:訪問spfile文件  --> 分配Oracle系統全局區(SGA) ,此時Oracle實例處於安裝狀態,日誌文件處於打開狀態 --> 自動讀取“控制文件”中的數據文件和日誌文件中的信息 --> 打開數據文件和日誌文件供用戶使用。
數據庫與控制文件關係:一對多。
查詢控制文件信息:
select * from v$controlfile;
2.3.3 日誌文件
分爲:重做日誌(Redo Log File)和歸檔日誌(Archive Log File)。
重做日誌:在數據庫運行期間,當用戶執行COMMIT命令時,數據庫首先將每筆操作的原始記錄寫入到日誌文件總,成功後,才把新的記錄傳遞給應用程序。
日誌信息查詢:
select * from v$logfile;
Oracle系統在運行過程中產生的日誌信息,首先被臨時存放在系統全局區的重做日誌緩衝區中,Commit命令(或日誌緩衝區信息滿1/3)時,LGWR進程(日誌寫入進程)將日誌信息從一個日誌組寫滿後接着寫另一個日誌組。當LGWR進程將所有的
能用的日誌文件都使用過一遍將再次轉向第一個日誌組重新覆蓋。

歸檔文件:
非歸檔模式:...
歸檔模式:當所有日誌文件被寫入一遍後,LGWR進程將轉向第一個日誌組進行重新覆寫前,先由歸檔進程(ARCH)將日誌文件中的信息讀出寫入歸檔文件。歸檔操作中,日誌文件不能寫入,這樣會影響效率,而且會佔用大量磁盤空間,影響性能。
歸檔文件查詢是否採用歸檔:
select * from v$database;
查詢歸檔文件所在路徑:
show parameter log_archive_dest;
2.3.4 服務器參數文件
。。。(待完成)
2.2.5 密碼文件、警告文件和跟蹤文件
。。。(待完成)
2.4 Oracle 11g 服務器機構
。。。(待完成)
2.5 數據詞典
數據詞典是Oracle存放關於數據庫內部信息的地方,用來描述數據庫內部的運行和管理情況。
Oracle字典視圖包括四個層次,分別爲X$內部表、基礎數據字典表、數據字典視圖和動態性能視圖。
2.5.1 Oracle數據詞典概述
dba_  : 包含數據庫實例的所有對象信息。
v$_   : 當前實例的動態視圖,包含系統管理和系統優化等所使用的視圖。
V_$   :是V$的同義詞。
user_ :記錄用戶的對象信息。
gv_   : 分佈式環境下所有實例的動態視圖,包含系統管理和系統優化使用的視圖。
GV_$  :是GV$的同義詞。
all_  :記錄用戶的對象信息機被授權訪問的對象信息。
X$    :是GV$視圖的數據來源,oracle內部表。
2.5.2 Oracle 常用的數據詞典
(1) 基本數據詞典
Oracle對這些數據字典都分別建立了用戶視圖視圖,不僅有更容易接受的名字,還隱藏了數據字典表表之間的關係,讓我們字節通過視圖來進行查詢,
簡單而形象,Oracle針對這些對象的範圍,分別把視圖命名爲DBA_XXXX, ALL_XXXX和USER_XXXX


user_對象視圖:描述了當前用戶schema下的對象;
all_對象視圖:描述了當前用戶有權限訪問到的所有對象的信息;
dba_對象視圖:包括了所有數據庫對象的信息;


注 意: 在創建數據庫是會運行兩個腳本。先運行catalog.sql,該腳本用來創建數據庫的內部字典表。然後再運行catrpoc.sql,
該腳本用來創 建數據庫內建的存儲過程、包等pl\sql對象。如果我們是使用dbca來創建數據庫,則dbca會自動調用這兩個腳本。
否則在執行create database命令來創建時,則需要手工運行這兩個腳本。 
(2)動態性能視圖概述
所謂動態性能視圖,就是指將內存裏的數據或控制文件裏的數據以表的形式展現出來。他們實際都是需表,並不是真正的表。
只不過是爲了能夠讓我們更好的管理數據庫的性能,所以將內存裏的活動情況以表的形式展現出來。
只要數據庫還在運行,就會不斷更新動態性能視圖。一旦數據庫關閉或崩潰,動態性能視圖裏的數據就會全部丟失,下次重啓時則會重新計算。
就像所有的數據字典的名詞都存在dictionary裏一樣,v$fixed_table裏存放了所有的動態性能視圖的名稱。
所有的動態性能的屬主都是sys,且都以v$_開頭,創建同名詞時則都以v$開頭。












SQL的基本執行順序及優化:

from子句--執行順序爲從後往前、從右到左表名(最後面的那個表名爲驅動表,執行順序爲從後往前, 所以數據量較少的表儘量放後)

where子句--執行順序爲自下而上、從右到左(表之間的連接必須寫在其他Where 條件之前, 可以過濾掉最大數量記錄的條件必須寫在Where 子句的末尾)
數據庫在處理SQL以前,都會去分析,發現查詢的條件中是否有索引,如果有,縣更具索引查找。那麼優先根據姓名的條件,去檢索,然後再去把通過索引得到的數據,
驗證Oracle查詢條件是從左向右還是從右向左:
方法一:(第1條語句執行不會出錯,第2條語句會提示除數不能爲零。說明從右 --> 左)
Select 'ok' From Dual Where 1 / 0 = 1 And 1 = 2;  
    Select 'ok' From Dual Where 1 = 2 And 1 / 0 = 1;   
select * from temp where to_number(t2)>1 and t1='sz';  
select * from temp where t1='sz' and to_number(t2)>1;      
方法二:(Output中可以清楚的看到結果)
Create Or Replace Function F1(v_In Varchar2) Return Varchar2 Is  
Begin  
Dbms_Output.Put_Line('exec F1');  
Return v_In;  
End F1;  
/  
Create Or Replace Function F2(v_In Varchar2) Return Varchar2 Is  
Begin  
Dbms_Output.Put_Line('exec F2');  
Return v_In;  
End F2;  
/
select 1 from dual where f1('1')='1' and f2('1')='1';  
select 1 from dual where f2('1')='1' and f1('1')='1';  
groupby--執行順序從左往右分組

select子句--少用*號,儘量取字段名稱。
ORACLE在解析的過程中, 會將依次轉換成所有的列名, 這個工作是通過查詢數據字典完成的, 使用列名意味着將減少消耗時間。

sql 語句用大寫的;因爲 oracle 總是先解析 sql 語句,把小寫的字母轉換成大寫的再執行

order by子句--執行順序爲從左到右排序,很耗資源


oracle 語句提高查詢效率的方法:


  1:...where column in (select * from ... where ...);


   2:...where exists (select 'X' from ... where ...);


   第二種格式要遠比第一種格式的效率高。
在Oracle中可以幾乎將所有的IN操作符子查詢改寫爲使用EXISTS的子查詢。
使用EXIST,Oracle系統會首先檢查主查詢,然後運行子查詢直到它找到第一個匹配項,這就節省了時間Oracle系統在執行IN子查詢時,首先執行子查詢,並將獲得的結果列表存放在在一個加了索引的臨時表中。


  避免使用having子句。HAVING 只會在檢索出所有記錄之後纔對結果集進行過濾。


  這個處理需要排序,總計等操作。如果能通過WHERE子句限制記錄的數目,那就能減少這方面的開銷。




分組:排序去組內最大:   
select deptno,ename,sal from
    (select deptno,ename,sal,row_number() over (partition by deptno order by sal desc) as sal_order
        from scott.emp) where sal_order <2;
    




decode函數:
decode (expression, search_1, result_1, search_2, result_2, ...., search_n, result_n)
decode (expression, search_1, result_1, search_2, result_2, ...., search_n, result_n, default)
原理:
IF 條件=值1 THEN
    RETURN(翻譯值1)
ELSIF 條件=值2 THEN
    RETURN(翻譯值2)
    ......
ELSIF 條件=值n THEN
    RETURN(翻譯值n)
ELSE
    RETURN(缺省值)
END IF



Oracle常用系統函數:
字符類型:select ASCII('c') from dual;    ---90
select CHR(90) from dual;---z
select concat('hello ','world') from dual;select 'hello ' | 'world' from dual; ---hello world
select initcap('oh my god!') from dual; ---Oh My God!
select instr('oracle 11g','1',3,2) from dual;   ---9   從第3個字符開始查詢字符串“1”第2次出現的位置。
select length('123') from dual;   --- 3
select lower('HELLO'),upper('hello') from dual;---hello,HELLO
select ltrim('####hello###','#'),rtim('Hello     '),trim('#' from '##Hello###') from dual;
--- hello###,Hello,Hello
select replace('Bad Luck Bad Gril','Good') from dual;---Good Luck Good Gril
select substr('MessageBox',8,3) from dual;---Box
數字類函數:ABS(n) -->  絕對值
CELL(n) -->  >= n 的最小整數
COS(n) -->  n 的餘弦值,n爲弧度
EXP(n) -->  e 的n 次冪
FLORR(n) -->  <= n 的最大整數
LOG(n1, n2) -->  以n1爲低n2的對數
MOD(n1,n2)  -->  n1 除以 n2 的餘數
POWER(n1,n2)-->  n1 的 n2 次方
ROUND(n1,n2)-->  返回小數點最接近的整數
SIGN(n) -->  負數返回-1,整數返回1,0返回0
SIN(n) -->  返回正弦值
SQRT(n) -->  n 的平方根
TRUNC(n1,n2)-->  ....
 日期、時間類函數:
  select sysdate from dual;
  select add_months(sysdate,6) from dual;-- 返回sysdate加上6個月的結果
  last_day(d)--- 返回日期d的最後一天,d爲時間類型
  months_between(d1,d2)---d1,d2 爲時間類型
  new_time(d1,t1,t2)---d1 爲日期類型,t1,t2 爲字符串
 轉換類函數:
  to_char(x) 或者 to_char(x,'YYYY-MM-DD')
  to_date(x) 或者 to_date(x,'YYYY-MM-DD')
  to_number(x)
  
  
  
  數據表的維護:
  1.維護表中的字段:
  增加:alter table table_name add(column_name type);
  刪除:alter table table_name drop column column_name;
  alter table table_name drop(column_name1,column_name2);
  修改屬性:alter table table_name modify column_name columntype;
  重命名錶:alter table table_old_name rename to table_new_name;
  刪除表:drop table table_name [cascade constraints];
  修改表的狀態:alter table table_name read only;
  alter table table_name read write;
  數據的完整性和約束性:
  非空約束:alter table table_name modify column_name [not] null;
  主鍵約束:表中沒有定義主鍵:alter table talbe_name add constraint 主鍵名 primary key(column_name);  --自己定義主鍵名
  alter table talbe_name add primary key(column_name);  --系統自動分配名稱的主鍵約束
  表中存在主鍵時,先刪除主鍵:alter table table_name drop constraint 主鍵名;
  唯一性約束:alter table table_name add constraint 約束名 unique(column_name);
  alter table table_name drop constraint 約束名;
  外鍵約束:alter table table_name add constraint 外鍵約束名 foreign key(column_name) references table_name2(column_name)   -- table_name2(外鍵所在的表);
  alter table table_name add constraint 外鍵約束名 foreign key(column_name) references table_name2;   -- table_name2(外鍵所在的表);
 
 
 
 
 
  閃回功能恢復被刪除的表:
  1.確認表是否被刪除:select * from student;
  2.確認刪除後,去回收站查詢看看:select object_name,original_name from recyclebin where original_name = 'STEDENT';
  3.使用FLASHBACK TABLE 語句恢復被刪除的表:flashback table student to before drop;
 
 
 
 
 
  第十章  索引對象




























 
發佈了39 篇原創文章 · 獲贊 4 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章