(一)、物理讀:把資料從資料塊讀取到
buffer cach
e中1、第一次查詢乙個表t
select * from t ;
2、第二次查詢:
select * from t;
第一次查詢有6次物理讀,第二次查詢有0個物理讀。
當資料塊第一次讀取到,就會快取到buffer cach
e 中,而第二次讀取和修改該資料塊時就在記憶體buffer cache 了。
3、 資料塊被重新讀入buffer cache ,
這種發生在
如果有新的資料需要被讀入
buffer cache中,而buffer cache又沒有足夠的空閒空間,oracle就根據lru演算法將lru鍊錶中lru端的資料置換出去。當這些資料被再次訪問到時,需要重新從磁碟讀入。
下面來實驗:
清空緩衝區:alter session set events 'immediate trace name flush_cache';
再來查詢t表:又重新進行了6次物理讀。
(二)、邏輯讀:指從
buffer cache中讀取資料塊
1、及時讀:
即時讀即讀取資料塊當前的最新資料。任何時候在
buffer cache中都只有乙份當前資料塊。即時讀通常發生在對資料進行修改、刪除操作時。這時,程序會給資料加上行級鎖,並且標識資料為「髒」資料。
2、資料一致性讀:
oracle是乙個多使用者系統。當乙個會話開始讀取資料還未結束讀取之前,可能會有其他會話修改它將要讀取的資料。如果會話讀取到修改後的資料,就會造成資料的不一致。一致性讀就是為了保證資料的一致性。在buffer cache中的資料塊上都會有最後一次修改資料塊時的scn。如果乙個事務需要修改資料塊中資料,會先在回滾段中儲存乙份修改前資料和s
cn的資料塊,然後再更新buffer cache中的資料
塊的資料及其scn,並標識其為「髒」資料。當其他程序讀取資料塊時,會先比較資料塊上的scn和自己的scn。如果資料塊上的scn小於等於程序本身的
scn,則直接讀取資料塊上的資料;如果資料塊上的scn大於進
程本身的scn,則會從回滾段中找出修改前的資料塊讀取資料。通常,普通查詢都是一致性讀。
總結邏輯讀:
oracle效能調優中,邏輯讀是個很重要的度量值,它不僅容易收集,而且能夠告訴我們許多關於資料庫引擎工作量的資訊。邏輯讀是在執行sql語句的時候從快取記憶體中讀取的塊數。
邏輯讀在oracle調優中有四個好處:
(1)邏輯讀是受制於cpu能力的操作,因而,很好的反映了cpu的使用情況。
(2)邏輯讀可能導致物理讀,因而,通過減少邏輯讀的數量,很可能會降低i/o操作次數。
(3)邏輯讀是受制於序列的操作,既然經常要考慮多使用者負載的優化,最小化邏輯讀將有利於避免擴充套件性問題。
(4)邏輯讀的數量可以通過sql跟蹤檔案和動態效能檢視在sql語句以及執行計畫級別獲得。
我們都知道,資料塊是oracle最基本的讀寫單位,但使用者所需要的資料,並不是整個塊,而是塊中的行,或列.當使用者發出sql語句時,此語句被解析執行完畢,就開始了資料的抓取階段,在此階段,伺服器程序會先將行所在的資料塊從資料檔案中讀入buffer cache,這個過程叫做物理讀.物理讀,每讀取乙個塊,就算一次物理讀.當塊被送進buffer cache後,並不能立即將塊傳給使用者,因為使用者所需要的並不
是整個塊,而是塊中的行.從buffer cache的塊中讀取行的過程,就是邏輯讀.為了完成一次邏輯讀,伺服器程序先要在hash表中查詢塊所在的buffer
cache 鏈.找到之後,需要在這個鏈上加乙個cache buffer chains 閂,加閂成功之後,就在這個鏈中尋找指定的塊,並在塊上加乙個pin鎖.並釋放cache buffer chains閂.然後就可以訪問塊中的行了.伺服器程序不會將塊中所有滿足條件的行一次取出,而是根據你的抓取命令,每次取一定數量的行.這些行取出之後,會經由pga傳給客戶端使用者.行一旦從buffer cache中取出,會話要釋放掉在塊上所加的pin.本次邏輯讀就算結束.如果還要再抓取塊中剩餘的行,伺服器程序要再次申請獲得cache bufffer鏈閂.再次在塊上加pin.這就算是另外一次邏輯讀咯.也就是說,伺服器程序每申請一次cache buffer鏈閂,就是一次邏輯讀.而每次邏輯讀所讀取的行的數量,可以在抓取命令中進行設定.
邏輯讀和cache buffer chains閂關係密切,tom曾有文章提到,程序每申請一次cache buffer chains閂,就是一次邏輯讀。但是,邏
輯讀並不等同於cache buffer chains閂,每次邏輯讀,在9i中至少需要獲得兩cache buffer chains閂。邏輯讀是指在hash表中定位塊的這個過程。
查詢表塊的分布:
select bk,max(id),min(id) from (select dbms_rowid.rowid_block_number(rowid) bk,id from temp) group by bk ;
set arraysize 15:設定查詢的批量為15。
SQLSERVER預讀邏輯讀物理讀
預讀 用估計資訊,去硬碟讀取資料到快取。預讀100次,也就是估計將要從硬碟中讀取了100頁資料到快取。物理讀 查詢計畫生成好以後,如果快取缺少所需要的資料,讓快取再次去讀硬碟。物理讀10頁,從硬碟中讀取10頁資料到快取。邏輯讀 從快取中取出所有資料。邏輯讀100次,也就是從快取裡取到100頁資料。l...
SQL Server邏輯讀 預讀 物理讀
sql server邏輯讀 預讀 物理讀 sql server 儲存資料的方式 1.頁是最小的操作單元,也就是說從磁碟讀取資料庫的時候最少讀取一頁,每一頁的大小是8kb,sql server對於頁的讀取是原子性,要麼讀完一頁,要麼完全不讀,不會有中間狀態 2.區是8個連續的頁組成的,區是最小的分配單...
初談SQL Server邏輯讀 物理讀 預讀
要理解邏輯讀 物理讀 預讀這三個概念,先要搞懂sql server的資料儲存方式。sql server資料庫包括資料檔案和日誌檔案,乙個資料庫可以有乙個或多少資料檔案 日誌檔案。所有的資料儲存在資料檔案中,資料檔案可以劃分為再小的單元,我們稱為 頁 每頁大小8k。8個頁面構成乙個區。sql serv...