溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么理解Oracle Buffer

發(fā)布時間:2021-11-09 14:56:34 來源:億速云 閱讀:148 作者:iii 欄目:關(guān)系型數(shù)據(jù)庫

這篇文章主要介紹“怎么理解Oracle Buffer”,在日常操作中,相信很多人在怎么理解Oracle Buffer問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么理解Oracle Buffer”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

一個Oracle Buffer是一個Oracle段對象緩存塊。一個Oracle buffer一開始時包含與Oracle塊中相同的信息。一個buffer的內(nèi)容依賴于段類型以及它是滯是一個段頭塊。buffer有許多種狀態(tài)通過v$bh的state列來表示,它們可能被歸納成在種模式:free(可用),dirty(臟)與pinned(固定)。

Free Buffers
當一個buffer與磁盤上的數(shù)據(jù)塊匹配時它的狀態(tài)就是free。一個free buffer可以看作是一個鏡像buffer,因為它鏡像了磁盤上的數(shù)據(jù)塊。下面的查詢簡單的顯示了如何判斷buffer cache中free buffers的數(shù)量。一個free buffer可能確實是空的(例如,在實例重啟之后),但它將最有可能包含真實的塊信息,比如行記錄。一個free buffer可以被替換而不會產(chǎn)生任何損壞,因為有一個副本存儲在磁盤上。當然,如果一個事務(wù)提交,那么至少被修改的buffer必須被記錄到聯(lián)機重做日志文件中。

SQL> select count(*) from v$bh where status='free';
  COUNT(*)
----------
        24

一個free buffer可能不是被頻繁的訪問。也許一個查詢需要訪問單行數(shù)據(jù)因此需要將數(shù)據(jù)塊放入buffer cache中,而這個buffer之后再也沒有被訪問過。而另一方面,一個free buffer也可以是被頻繁訪問的。例如,如是一個特定的數(shù)據(jù)塊被重復(fù)地查詢,它將被頻繁的訪問,但它的狀態(tài)仍然是free狀態(tài),因為buffer沒有被改變過。如果你對freebuffer的定義簡單又清晰,那么許多Oracle的算法將也變得清晰,這將使理解,檢測與解決競爭更容易。

Dirty Buffers
當一個buffer它不能與磁盤上的相關(guān)塊進行匹配時它的狀態(tài)就是dirty。對一個buffer進行的任何改變都會使用它的狀態(tài)變?yōu)閐irty,因為buffer將不再與磁盤上的塊相匹配。當內(nèi)存中的改變還沒有被寫入磁盤而要對其進行覆蓋時,dirty塊是不能被替換的。一旦數(shù)據(jù)庫寫進程將一個dirty buffer寫入磁盤,那么buffer將與磁盤上的塊再一次匹配那么這個buffer的狀態(tài)將變?yōu)閒ree。

一個dirty buffer可能也不被頻繁訪問。假設(shè)一行記錄被修改但其它進程不需要訪問這個buffer。因為行記錄被改變這個塊確實是dirty的,但它不被頻繁訪問。當然,也有被頻繁訪問的dirty buffers。簡單地重復(fù)更新一行記錄將確保它的buffer的狀態(tài)為dirty又被頻繁的訪問。

下面的查詢顯示dirty buffers的狀態(tài)可能是xcur或write。將在cache buffer chains中詳細介紹current與consistent模式的buffers。xcur狀態(tài)意味著一個進程已經(jīng)改變了一個current模式的buffer的狀態(tài)為這種狀態(tài),并且進程可能現(xiàn)在更新buffer中的行記錄,雖然行記錄現(xiàn)在仍然受制于其它條件,比如行級鎖。排他模式不會阻止多個用戶改變相同buffer中的多行記錄,它簡單表示當current模式的buffer可以被改變。在RAC環(huán)境中這是至關(guān)重要的,可能有多個共享current模式buffers(scur),但在整個RAC數(shù)據(jù)庫中每個塊只有一個排他current模式buffer存在。

SQL> select status, count(*) from v$bh where dirty='Y' group by status;
STATUS       COUNT(*)
---------- ----------
xcur            20792
scur              919
pi               2567

Pinned Buffers
當一個buffer被pinned時,它不能被替換。另一種看待pinning的方式是對buffer的一種非官方鎖。因為一個buffer不是一種關(guān)系結(jié)構(gòu),標準的鎖機制不能應(yīng)用。Pinning一個特定的buffer,latches或mutexes可以控制訪問整組buffers。Pinning可以與latch與lock一起連用來確保適當?shù)男蛄谢?,保護與并行控制被實現(xiàn)。

假設(shè)一個服務(wù)器進程將要讀取一個buffer中的一行記錄。當你仍然在訪問這一行記錄時,有人使用其它的buffer替換了你正在訪問的buffer這是極端粗魯?shù)?。這就像你正在讀一本書時,有一個人說"讓我看看",并從你手中搶走一樣。許多進程可以pin相同的buffer(讀取相同的塊),但是只有一個進程能pinned這個buffer,它不能被替換。當一個free buffer的行記錄正被查詢時,它的狀態(tài)從free變?yōu)閜inned再次回到free。當free buffer中的行記錄被修改后,它的buffer狀態(tài)將從free變?yōu)閜inned,再變?yōu)閐irty。

Oracle沒有通過v$bh視圖來顯示pinned buffers,但任何被touched的buffer也就是被pinned了。當一個buffer正被移動到寫列表中并且正更新touch計數(shù)時Oracle將也會pin這個buffer。

Buffer Headers的作用
當buffers內(nèi)置在buffer cache中并且buffers確實已經(jīng)被改變了,列表管理實際作用于buffer headers,而不是實際的buffers。一個buffer header是一個優(yōu)化過的內(nèi)存結(jié)構(gòu)它包含關(guān)于一個buffer和與它相關(guān)的塊信息,但不包含塊數(shù)據(jù)比如行記錄。

為什么對于buffer cache沒有視圖v$bc?,這是因為一個buffer與一個塊的元數(shù)據(jù)被存儲在buffer header,并且它的元數(shù)據(jù)對于我們的性能分析是需要的。因此視圖被命名為v$bh,對于buffer header有三個關(guān)鍵的列表或鏈:
.Cache buffers chains(CBCs)被用來快速判斷一個Oracle塊是否內(nèi)置在buffer cache中。

.最近最少使用(LRU)列被用來在cache中保留住被頻繁訪問的buffers并找到free buffers。

.寫列表包含不久將被寫入磁盤的dirty buffers。

重要的是理解buffer headers的這三個列表而不是實際的buffers。單個buffer header總是內(nèi)置在一個CBC中和一個LRU鏈或一個寫列表中。

三個列表的維護是在buffer header級別,不是buffer級別,更不是在數(shù)據(jù)塊級別。我們許多人被教導當buffer內(nèi)置在buffer cache中時,buffers它們本身是被鏈接的。這是不正確。每個buffer都與一個buffer header相關(guān)聯(lián),并且在各種列表中操作的是buffer header。

Cache Buffer Chains
簡而言之,CBCs被用來回答“這個buffer是否在buffer cache中,如果在,它在哪里”這本質(zhì)上是一個搜索類型的問題。很多類型的搜索算法可能被用來獲得答案:二叉樹,B+樹,B*樹,順序搜索,哈希算法,或一些算法組合。Oracle選擇使用一種哈希算法,緊接著使用快速順序搜索。

哈希算法
哈希算法可以非??焖伲驗檎麄€結(jié)構(gòu)通常被存儲在內(nèi)存中并且要求一個單獨的數(shù)學計算,同時存在一些內(nèi)存訪問來回答搜索問題。哈希結(jié)構(gòu)有許多變化,但所有的哈希結(jié)構(gòu)都是由一個哈希函數(shù),哈希桶與哈希鏈組成的。

哈希函數(shù)
哈希函數(shù)接收輸入并使用定義的范圍來產(chǎn)生一個輸出。輸入被叫作一個哈希值。x mod 10函數(shù)可以簡單地被用來確保不管輸入的正數(shù)哈希值,它的輸出總是在0到9之間。哈希值輸入11,輸出將是1。一個好的哈希函數(shù)將會產(chǎn)生均勻分布的輸出。當Oracle將要搜索一個buffer時,基于數(shù)據(jù)塊的文件號與塊號的組合(它也叫數(shù)據(jù)塊地址DBA)來生成一個哈希值。因此哈希函數(shù)本質(zhì)上是對buffer的數(shù)據(jù)塊文件號和塊號進行哈希運算。這是一種非常方便并可以快速哈希運算的情況。

哈希桶
哈希輸入值將被哈希到桶,每個輸出值代表了一個單獨的桶。在許多哈希情況下,可能輸入的哈希值的數(shù)量超過桶數(shù)。對于Oracle來說,可能的哈希輸出值就是Oracle數(shù)據(jù)塊的數(shù)量。但在任何情況下,哈希輸入值的數(shù)量將與buffercache中的buffers的數(shù)量相等。

當有兩個哈希值被哈希到相同的桶時,這叫作碰撞。碰撞對于哈希來說是很常見的。碰撞可以通過增加哈希桶的數(shù)量來最小化,但可能對于高性能程序來說是一種災(zāi)難,比如Oracle數(shù)據(jù)庫。例如,假設(shè)x mod 10的哈希函數(shù)有1000哈希輸入值,這將肯定會出現(xiàn)碰撞。為了避免碰撞,哈希算法輸出完全均勻的輸出將需要1000個哈希桶。使用一種極好的哈希算法與大量的哈希桶兩種方法減少碰撞。如果哈希算法不變,那么可以增加哈希桶的數(shù)量。

哈希鏈
每個哈希桶都有一個相關(guān)聯(lián)的哈希鏈。當一個搜索的對象被哈希到一個桶時,這個桶的鏈被順序搜索來查找對象。如果對象在哈希鏈中沒有找到,我們知道對象不在整個哈希結(jié)構(gòu)中。如果哈希鏈很短,順序搜索將很快完成。如是對象不在cache中,鏈長度最好為零。

Oracle的CBC結(jié)構(gòu)是一種復(fù)雜的內(nèi)存結(jié)構(gòu),并且Oracle必須要維持序列化控制。所以它使用了一種序列化結(jié)構(gòu):latch或mutex。

如何破壞CBC的性能
要學習如何解決性能問題的最好方法就是知道如何模擬問題,有三種典型的方法來降低CBC的性能:
.當減少latches的數(shù)量時,剩余l(xiāng)atches的并發(fā)將會增加
.如果減少CBCs的數(shù)量,平均每個CBC的長度將會增加,剩余chains的并發(fā)與CBC的掃描時間也會增加
.如果buffer克隆變得激烈,那么頻繁訪問的chain將變得很長,會增加并發(fā)與CBC的掃描時間

減少latches來限制并發(fā)
使用單個latch,序列化將被保證,但是并發(fā)性將受到嚴重的限制。當另一個進程請求latch時而它被其它進程所持有時就會產(chǎn)生競爭。在這個例子中,簡單地增加一個latch可以解決這個問題。如果存在上百成千個進程需要訪問CBCs,那么可以看到存在嚴重的并發(fā)性能限制問題。幸運地是缺省情況下Oracle創(chuàng)建了上百個CBC latches。

Oracle知道它的哈希函數(shù)不完美并且將會產(chǎn)生碰撞。一種減少碰撞的方法是有大量的CBCs。但你第一反應(yīng)會覺得更多的CBCs將會消耗更多的內(nèi)存,但事實不是這樣的。每個buffer header必須內(nèi)置在一個CBC鏈上,與CBC鏈的數(shù)量及長度無關(guān)。當使用更多的CBC鏈時,而buffer headers的數(shù)量不變時,平均CBC鏈的長度會減小。因此,對于每個CBC鏈雖然有一些額外的內(nèi)存消耗,但真正的內(nèi)存消耗者是buffer headers的數(shù)量,不僅僅是CBC鏈的數(shù)量。

許多年以前規(guī)則定義latches的數(shù)量不應(yīng)該超過CPU核數(shù)的兩倍。很明顯Oracle已經(jīng)修改了規(guī)則,CBC latches只是Oracle數(shù)據(jù)庫中許多l(xiāng)atches中的一種。

Oracle可能處理多個CBC latches,有人會認為對于每個CBC將有一個latch,但Oracle認為這是不必要的且一個latch可以管理上百個CBC鏈。

如果CBC鏈比buffers多,這意味著有一些CBC鏈將不會關(guān)聯(lián)buffer header,這將有效的使CBC鏈的長度變?yōu)榱恪?/p>

[oracle@jytest2 ~]$ sqlplus / as sysdba
SQL*Plus: Release 12.2.0.1.0 Production on Thu Mar 21 10:28:02 2019
Copyright (c) 1982, 2016, Oracle.  All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
SQL> col param format a50 heading "Instance Param and Value" word_wrapped
SQL> col description format a20 heading "Description" word_wrapped
SQL> col dflt format a5 heading "Dflt?" word_wrapped
SQL> select rpad(i.ksppinm, 35) || ' = ' || v.ksppstvl param,
  2  i.ksppdesc description,
  3  v.ksppstdf dflt
  4  from x$ksppi i,
  5  x$ksppcv v
  6  where v.indx = i.indx
  7  and v.inst_id = i.inst_id
  8  and i.ksppinm in
  9  ('db_block_buffers','_db_block_buffers','db_block_size',
 10  '_db_block_hash_buckets','_db_block_hash_latches'
 11  )
 12  order by i.ksppinm
 13  /
Instance Param and Value                           Description          Dflt?
-------------------------------------------------- -------------------- -----
_db_block_buffers                   = 97136        Number of database   TRUE
                                                   blocks cached in
                                                   memory: hidden
                                                   parameter
_db_block_hash_buckets              = 262144       Number of database   TRUE
                                                   block hash buckets
_db_block_hash_latches              = 8192         Number of database   TRUE
                                                   block hash latches
db_block_buffers                    = 0            Number of database   TRUE
                                                   blocks cached in
                                                   memory
db_block_size                       = 8192         Size of database     FALSE
                                                   block in bytes

引起CBC latch競爭的最好和最簡單的方法之一就是創(chuàng)建一個大的buffer cache來緩存更多的塊,然后將CBC latches的數(shù)量減少到一個。Oracle從10g開始就不允許CBC latches的數(shù)量小于1024,但是即使有1024個CBC latches和足夠的邏輯IO能力,也能經(jīng)常看到CBC latch競爭。

通過減少CBC的數(shù)量來增加CBC的掃描時間
如果CBCs很長,那么掃描它的時間將會引起顯著的競爭。另外其它進程獲得CBC latch的時間也會顯著增強。一種很明顯的方式是增加平均每個CBC的長度來減少CBC的數(shù)量,這可以通過減少哈希桶的數(shù)量來完成。簡單地將實例參數(shù)_db_block_hash_buckets減少到50,確保你查詢的塊內(nèi)置在buffer cache中,那么會很快得到CBC latch競爭。因為Oracle至少要確保64個哈希桶來忽略你的設(shè)置,但這仍然會有大量的競爭。

在現(xiàn)實中,一種解決CBC latch競爭的方法是增加哈希桶的數(shù)量,這將減少平均每個CBC的長度。如果一個特定的CBC很長且被頻繁文章,那么這個解決方案將不能提高性能。此外Oracle創(chuàng)建了大量的CBC,因此增加哈希桶的數(shù)量不像增加CBC一樣能顯著的提高性能,但它有一種有效的方法應(yīng)該值得考慮。

使用克隆Buffers來增加CBC的掃描時間
雖然長CBC的問題很少見,但如果出現(xiàn)了,那么情況是很嚴重的。理解這是如何發(fā)生的不僅僅可以幫助你解決這個問題還能更深入的理解CBCs,latch,undo與讀一致性。它涉及RAC系統(tǒng)。

長CBC代表了一個非常有挑戰(zhàn)性的問題。首先,哈希結(jié)構(gòu)是很快速的因為幾乎沒有掃描,因此長CBC會迅速降低使用哈希算法的好處。第二,一個掃描進程必須處理一個CBC latch,不是隨便一個CBC latch,這個CBC latch保護特定的CBC。一個長CBC意味著CBC latch將被持有更長時間并且當掃描列表將使用更多的CPU。另外,因為CBC latch被持有的時間更長,這將增加另外的進程競爭latch的可能性。當競爭latch的進程在spinning與在sleeping時發(fā)布等待事件時都是要消耗CPU的。但問題遠不止如此。

正常情況下,Oracle的哈希算法使用的CBC的數(shù)量是buffers的兩倍還多,因此CBC的長度很短。長CBC出現(xiàn)的唯一方式是多個buffers被哈希到相同的CBC上。通常這不是一個問題,但也可能出現(xiàn)。為了解析這種情況,先了解塊克隆與哈希。當一個Oracle塊被cached后,只有單個當前模式buffer能被修改。如果buffer中的一行需要被修改,單個當前模式buffer必須是可用的。當前模式buffers有時也叫CU buffers。在RAC系統(tǒng)中,如果需要的當前模式buffer內(nèi)置在另一個實例中,那它必須被發(fā)送到你使用的這個實例中然后才可以修改buffer。

假設(shè)一個服務(wù)器進程在時間T100正運行一個查詢。這個進程訪問數(shù)據(jù)字典并知道它將必須訪問一個特定塊,因此它將被哈希到合適的CBC,獲取合適的CBC latch,掃描CBC,并找到當前模式buffer的buffer header。然而在檢查buffer header時,發(fā)現(xiàn)當前模式buffer在時間T200被修改過,是在服務(wù)器進程開始執(zhí)行查詢之后。這意味著在查詢執(zhí)行后需要的行記錄已經(jīng)被修改過了。 Oracle的缺省讀一致性模式要求被返回的信息與查詢開始執(zhí)行時的一致。因此Oracle必須采取操作來確保被返回的信息對于時間T100來說是正確的。

Oracle現(xiàn)在要么找到一個buffer的副本,要么構(gòu)建一個當前模式buffer的副本,因此這個buffer代表了時間T100所處處的情況。一個buffer副本通常叫做buffer克隆??寺∫粋€buffer是一種相對昂貴的處理。首先,必須找到一個free buffer,然后buffer header必須被合適的連接到CBC結(jié)構(gòu)與LRU鏈結(jié)構(gòu)。

理解潛在的重大性能影響的關(guān)鍵是理解被克隆的buffer的buffer header將內(nèi)置在CBC結(jié)構(gòu)中的什么位置。因為被克隆的buffer是一個合法的buffer,它在buffer cache中占據(jù)了空間,能被共享且必須被定位。這意味著它必須被合適的內(nèi)置在CBC結(jié)構(gòu)中。被克隆的buffer的文件號與塊號與它的當前模式buffer的相同,這意味著它必須被哈希到相同的CBC。因此,如果一個buffer有50個克隆副本,與它相關(guān)的CBC將至少有50個buffer header那么長,并且如果與其它buffer出現(xiàn)碰撞可能更長。Oracle對此無能為力,因為哈算法是基于文件號與塊號的。

不僅free buffer搜索算法有利于替換克隆的buffer,但Oracle試圖限制每個buffer的克隆數(shù)量。Oracle想要每個buffer的克隆數(shù)量不超過隱含參數(shù)_db_block_max_cr_dba,它的缺省值為6。然而如果克隆變得很激烈,一個buffer的克隆副本很容易超過6個。

SQL> col name for a30
SQL> col value for a20
SQL> col describ for a50
SQL> select x.ksppinm NAME,y.ksppstvl value,x.ksppdesc describ
  2  from x$ksppi x, x$ksppcv y
  3  where x.inst_id=USERENV('Instance')
  4  and y.inst_id=USERENV('Instance')
  5  and x.indx=y.indx
  6  and x.ksppinm like '%&par%';
Enter value for par: _db_block_max_cr_dba
NAME                           VALUE                DESCRIB
------------------------------ -------------------- --------------------------------------------------
_db_block_max_cr_dba           6                    Maximum Allowed Number of CR buffers per dba
1 row selected.

有許多克隆的buffer不一定意味著有性能問題。如果真的出現(xiàn)性能問題,CBC latch競爭問題將非常明顯。如果出現(xiàn)這種情況并發(fā)現(xiàn)克隆buffer的問題,那么考慮以下可能的補救措施:
.修復(fù)應(yīng)用程序
這通常是必須要做的。這是非常痛苦的,需要開會,如果應(yīng)用程序開發(fā)者參與將會非常專業(yè)化,并且通常要求應(yīng)用程序以某些方式被修改來減少單個克隆buffer被頻繁的訪問。

.移動行記錄
如果幸運的話,可能存在多行記錄使得buffer被頻繁訪問。如果可能散這些行,因此多個buffer現(xiàn)在不再被頻繁的訪問。當修改傳統(tǒng)的pct_free與pct_used存儲參數(shù)是一種選擇時,為了增加控制,可以考慮設(shè)置一個塊可以存儲的最大記錄數(shù)。意外地是這不僅僅是簡單地執(zhí)行類似于alter table all_status minimizer records_per_block 5語句

.平衡工作負載
如果能控制工作負載強度,在克隆活動高峰期間,考慮減少與buffer克隆活動相關(guān)的工作負載。雖然這不是一個令人興奮的解決方案,工作負載平衡也能對性能產(chǎn)生積極影響。

CBC競爭識別與解決方案
一些解決方案可以幫助你解決CBC競爭的問題。在嘗試解決CBC latch問題之前,確保它們存在。

SQL> @swpctx
Remember: This report must be run twice so both the initial and
final values are available. If no output, press ENTER twice.
DB/Inst: RLZY/RLZY1                                               25-Mar 11:24am
Report:   swpctx.sql           OSM by OraPub, Inc.                Page         1
            System Event CHANGE (17 sec interval) Activity By PERCENT
                                       Time Waited  % Time    Avg Time     Wait
Wait Event Display Name                      (sec)  Waited Waited (ms) Count(k)
-------------------------------------- ----------- ------- ----------- --------
latch: cache buffers chains                 10.610   96.28        15.7        1
control file parallel write                  0.160    1.45         7.6        0
log file parallel write                      0.030    0.27        15.0        0
log file sync                                0.000    0.00         0.0        0

如果數(shù)據(jù)庫系統(tǒng)是Oracle 10g之前的版本,那么top wait event將會是latch free,就需要確認latch問題是CBClatch。對于Oracle 10g及以后的版本,wait event將是latch: cache buffers chains。在大多數(shù)情況下,CPU子系統(tǒng)將被大量利用并且負擔過重。以下是可能的CBC latch解決方案:
.優(yōu)化邏輯IO SQL語句
當回答“buffer是否在buffer cache”中時CBC結(jié)構(gòu)將變得緊張起來,期待的答案總是“Yes”,如果答案為“No”,將會看到順序讀或分散讀等待事件。因此從應(yīng)用程序角度來看,查找執(zhí)行活動主要是buffer gets也就是邏輯IO的SQL盡你所能地減少邏輯IO消耗。這是典型的SQL優(yōu)化,包括索引,以及在性能問題出現(xiàn)時減少執(zhí)行速率。

.增加CPU處理能力
在大多數(shù)情況下,CPU子系統(tǒng)將被過多利用并且可能是操作系統(tǒng)瓶頸。latch的獲得與相關(guān)的內(nèi)存管理可能消耗過多的CPU資源。做任何可以減少CPU消耗與能增加CPU能力的事。查找在高峰期間沒有執(zhí)行或正在執(zhí)行的進程。考慮增加或者使用更快的CPU。如果正在運行在虛擬環(huán)境中,考慮確保Oracle系統(tǒng)已經(jīng)增加CPU資源。然而,請注意除非應(yīng)用程序工作負載已經(jīng)顯著增加,增加的CPU處理能力通常將被快速地消耗掉。真正的解決方案可能是其它的方案。增加CPU能力可能是一個快速解決方案,但它可能不能真正地解決問題。

.檢查buffer克隆問題
無論何進遇到CBC latch競爭問題,都需要檢查是否存在buffer克隆的問題。這是很少見的情況,但如果遇到了,那么解決方案與其它解決方案是非常不同的。

.增加CBC latch數(shù)量
這通常會帶來一些安慰,但不是真正的優(yōu)化邏輯IO SQL。隱含參數(shù)_db_block_hash_latches控制著CBC latch的數(shù)量

.增加CBC buckets
它很難對性能產(chǎn)生影響,因為Oracle缺省情況下,創(chuàng)建了大量的buckets。除非之前減少了CBC buckets的數(shù)量,增加這個參數(shù)的大小將會顯著地影響性能。

到此,關(guān)于“怎么理解Oracle Buffer”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI