Oracle 基本概念深刻

 Oracle 邏輯讀:服務器

     咱們都知道,數據塊是oracle最基本的讀寫單位,但用戶所須要的數據,並非整個塊,而是塊中的行,或列.當用戶發出SQL語句時,此語句被解析執行完畢,就開始了數據的抓取階段,在此階段,服務器進程會先將行所在的數據塊從數據文件中讀入buffer cache,這個過程叫作物理讀.物理讀,每讀取一個塊,就算一次物理讀.oracle

     當塊被送進buffer cache,並不能當即將塊傳給用戶,由於用戶所須要的並不整個塊,而是塊中的行.buffer cache的塊中讀取行的過程,就是邏輯讀.爲了完成一次邏輯讀,服務器進程先要在hash表中查找塊所在的cache buffer .找到以後,須要在這個鏈上加一個cache buffer chains ,加閂成功以後,就在這個鏈中尋找指定的塊,並在塊上加一個pin.並釋放cache buffer chains.而後就能夠訪問塊中的行了.app

     服務器進程不會將塊中全部知足條件的行一次取出,而是根據你的抓取命令,每次取必定數量的行.這些行取出以後,會經由PGA傳給客戶端用戶.行一旦從buffer cache中取出,會話要釋放掉在塊上所加的PIN.本次邏輯讀就算結束.若是還要再抓取塊中剩餘的行,服務器進程要再次申請得到cache bufffer鏈閂.再次在塊上加PIN.這就算是另一次邏輯讀咯.也就是說,服務器進程每申請一次cache buffer鏈閂,就是一次邏輯讀.而每次邏輯讀所讀取的行的數量,能夠在抓取命令中進行設置. ide

     邏輯讀和Cache buffer chains閂關係密切,TOM曾有文章提到,進程每申請一次Cache buffer chains閂,就是一次邏輯讀。可是,邏輯讀並不等同於Cache buffer chains閂,每次邏輯讀,在9i中至少須要得到兩Cache buffer chains閂。邏輯讀是指在Hash表中定位塊的這個過程。spa

 

Oracle Sql loader 直接插入和間接插入:進程

 

   這個問題相信不少人都已經知道了,爲了方便初學者,我再來重審一遍。hash

create table 表1 as select 列1,列2,... select 表2 it

insert /*+append*/ into 表1 select 列1,列2,... select 表2 table

如上形式的插入,都叫作直接路徑插入。固然,在SQL*Loader中也有直接路徑插入的形式。class

所謂直接路徑插入,就是繞過Buffer cache,直接將數據插入進表所在數據文件中。

假若有表AA,要將AA中的數據插入進表BB,在普通的間接插入下,先將AA的數據塊傳進Buffer cache,再將BB的塊也傳進Buffer cache,在Buffer cache中從AA的塊中讀出行,插入進BB的塊中。BB的塊就都變成了髒塊,再等待DBWn把它們寫進數據文件。所以,間接路徑插入後,AA表的塊和BB表的塊都會在Buffer cache中出現。

而直接路徑插入下,將AA表的數據塊傳進Buffer cache中,讀出行,直接寫進BB表所在的數據文件。插入完畢後,除了表頭塊外,BB表的數據塊並不會出如今Buffer cache中。

相關文章
相關標籤/搜索