日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Oracle数据块原理深入剖析

發(fā)布時間:2024/8/26 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Oracle数据块原理深入剖析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

數(shù)據(jù)塊(Oracle Data Blocks),本文簡稱為“塊”,是Oracle最小的存儲單位,Oracle數(shù)據(jù)存放在“塊”中。一個塊占用一定的磁盤空間。特別注意的是,這里的“塊”是Oracle的“數(shù)據(jù)塊”,不是操作系統(tǒng)的“塊”。

Oracle每次請求數(shù)據(jù)的時候,都是以塊為單位。也就是說,Oracle每次請求的數(shù)據(jù)是塊的整數(shù)倍。如果Oracle請求的數(shù)據(jù)量不到一塊,Oracle也會讀取整個塊。所以說,“塊”是Oracle讀寫數(shù)據(jù)的最小單位或者最基本的單位。

塊的標(biāo)準(zhǔn)大小由初始化參數(shù)DB_BLOCK_SIZE指定。具有標(biāo)準(zhǔn)大小的塊稱為標(biāo)準(zhǔn)塊(Standard Block)。塊的大小和標(biāo)準(zhǔn)塊的大小不同的塊叫非標(biāo)準(zhǔn)塊(Nonstandard Block)。同一數(shù)據(jù)庫中,Oracle9i及以上版本支持同一數(shù)據(jù)庫中同時使用標(biāo)準(zhǔn)塊和非標(biāo)準(zhǔn)塊。Oracle允許指定5種非標(biāo)準(zhǔn)塊(Nonstandard Block)。

操作系統(tǒng)每次執(zhí)行I/O的時候,是以操作系統(tǒng)的塊為單位;Oracle每次執(zhí)行I/O的時候,都是以O(shè)racle的塊為單位。
Oracle數(shù)據(jù)塊大小一般是操作系統(tǒng)塊的整數(shù)倍。

數(shù)據(jù)塊的格式(Data Block Format)

塊中存放表的數(shù)據(jù)和索引的數(shù)據(jù),無論存放哪種類型的數(shù)據(jù),塊的格式都是相同的,塊由塊頭(header/Common and Variable),表目錄(Table Directory),行目錄(Row Directory),空余空間(Free Space)和行數(shù)據(jù)(Row Data)五部分組成,
如下圖所示。?

?

塊頭(header/Common and Variable):存放塊的基本信息,如:塊的物理地址,塊所屬的段的類型(是數(shù)據(jù)段還是索引段)。 表目錄(Table Directory):存放表的信息,即:如果一些表的數(shù)據(jù)被存放在這個塊中,那么,這些表的相關(guān)信息將被存放在“表目錄”中。

行目錄(Row Directory):如果塊中有行數(shù)據(jù)存在,則,這些行的信息將被記錄在行目錄中。這些信息包括行的地址等。

行數(shù)據(jù)(Row Data):是真正存放表數(shù)據(jù)和索引數(shù)據(jù)的地方。這部分空間是已被數(shù)據(jù)行占用的空間。

空余空間(Free Space):空余空間是一個塊中未使用的區(qū)域,這片區(qū)域用于新行的插入和已經(jīng)存在的行的更新。

頭部信息區(qū)(Overhead):我們把塊頭(header/Common and Variable),表目錄(Table Directory),行目錄(Row Directory)這三部分合稱為頭部信息區(qū)(Overhead)。頭部信息區(qū)不存放數(shù)據(jù),它存放的整個塊的信息。頭部信息區(qū)的大小是可變的。一般來說,頭部信息區(qū)的大小介于84字節(jié)(bytes)到107字節(jié)(bytes)之間。

數(shù)據(jù)塊中自由空間的使用

當(dāng)往數(shù)據(jù)庫中插入(INSERT)數(shù)據(jù)的時候,塊中的自由空間會減少;當(dāng)對塊中已經(jīng)存在的行進(jìn)行修改(UPDATE)的時候(使記錄長度增加),塊中的自由空間也會減少。

DELETE語句和UPDATE語句會使塊中的自由空間增加。當(dāng)使用DELETE語句刪除塊中的記錄或者使用UPDATE語句把列的值更改成一個更小值的時候,Oracle會釋放出一部分自由空間。釋放出的自由空間并不一定是連續(xù)的。通常情況下,Oracle不會對塊中不連續(xù)的自由空間進(jìn)行合并。因為合并數(shù)據(jù)塊中不連續(xù)的自由空間會影響數(shù)據(jù)庫的性能。只有當(dāng)用戶進(jìn)行數(shù)據(jù)插入(INSERT)或者更新(UPDATE)操作,卻找不到連續(xù)的自由空間的時候,Oracle才會合并數(shù)據(jù)塊中不連續(xù)的自由空間。

對于塊中的自由空間,Oracle提供兩種管理方式:自動管理,手動管理

行鏈接和行遷移(Row Chaining and Migrating)

行鏈接(Row Chaining):如果我們往數(shù)據(jù)庫中插入(INSERT)一行數(shù)據(jù),這行數(shù)據(jù)很大,以至于一個數(shù)據(jù)塊存不下一整行,Oracle就會把一行數(shù)據(jù)分作幾段存在幾個數(shù)據(jù)塊中,這個過程叫行鏈接(Row Chaining)。如下圖所示:?

?


如果一行數(shù)據(jù)是普通行,這行數(shù)據(jù)能夠存放在一個數(shù)據(jù)塊中;如果一行數(shù)據(jù)是鏈接行,這行數(shù)據(jù)存放在多個數(shù)據(jù)塊中。

行遷移(Row Migrating):數(shù)據(jù)塊中存在一條記錄,用戶執(zhí)行UPDATE更新這條記錄,這個UPDATE操作使這條記錄變長,這時候,Oracle在這個數(shù)據(jù)塊中進(jìn)行查找,但是找不到能夠容納下這條記錄的空間,無奈之下,Oracle只能把整行數(shù)據(jù)移到一個新的數(shù)據(jù)塊。原來的數(shù)據(jù)塊中保留一個“指針”,這個“指針”指向新的數(shù)據(jù)塊。被移動的這條記錄的ROWID保持不變。行遷移的原理如下圖所示:?

?

無論是行鏈接還是行遷移,都會影響數(shù)據(jù)庫的性能。Oracle在讀取這樣的記錄的時候,Oracle會掃描多個數(shù)據(jù)塊,執(zhí)行更多的I/O。

塊中自由空間的自動管理

Oracle使用位圖(bitmap)來管理和跟蹤數(shù)據(jù)塊,這種塊的空間管理方式叫“自動管理”。自動管理有下面的好處:

◆易于使用

◆更好地利用空間

◆可以對空間進(jìn)行實時調(diào)整

塊中自由空間的手動管理

用戶可以通過PCTFREE, PCTUSED來調(diào)整塊中空間的使用,這種管理方式叫手動管理。相對于自動管理,手動管理方式比較麻煩,不容易掌握,容易造成塊中空間的浪費(fèi)。

PCTFREE參數(shù)用于指定塊中必須保留的最小空閑空間百分例。之所以要預(yù)留這樣的空間,是因為UPDATE時,需要這些空間。如果UPDATE時,沒有空余空間,Oracle就會分配一個新的塊,這會產(chǎn)生行遷移(Row Migrating)。
PCTUSED也是用于設(shè)置一個百分比,當(dāng)塊中已使用的空間的比例小于這個百分比的時候,這個塊才被標(biāo)識為有效狀態(tài)。只有有效的塊才被允許插入數(shù)據(jù)。




Oracle存儲數(shù)據(jù)的最小粒度(finest level of granularity)被稱為數(shù)據(jù)塊(data block)(也叫做邏輯塊(logical block),Oracle塊(Oracle block)或頁(page))。一個數(shù)據(jù)塊對應(yīng)于磁盤上數(shù)個字節(jié)(byte)的物理數(shù)據(jù)庫空間。?
??
? 處于數(shù)據(jù)塊之上的邏輯數(shù)據(jù)庫空間是數(shù)據(jù)擴(kuò)展(extent)。數(shù)據(jù)擴(kuò)展是為存儲數(shù)據(jù)而分配的一組連續(xù)的數(shù)據(jù)塊。?
??
? 位于數(shù)據(jù)擴(kuò)展之上的邏輯數(shù)據(jù)庫存儲結(jié)構(gòu)是段(segment)。段由一組數(shù)據(jù)擴(kuò)展 (extent)構(gòu)成,這些數(shù)據(jù)擴(kuò)展位于同一表空間(tablespace)中,用于存儲各種邏輯數(shù)據(jù)結(jié)構(gòu)。例如每個表(table)的數(shù)據(jù)都存儲在其自身的數(shù)據(jù)段(data segment)中,每個索引(index)的數(shù)據(jù)都存儲在其自身的索引段(index segment)中。如果表或索引是分區(qū)存儲(partitioned)的,則每個分區(qū)擁有自己的段。?
??
? Oracle為段(segment)分配空間時以數(shù)據(jù)擴(kuò)展(extent)為單位。當(dāng)段內(nèi)已有的數(shù)據(jù)擴(kuò)展沒有可用空間時,Oracle為此段分配一個新的數(shù)據(jù)擴(kuò)展。因為數(shù)據(jù)擴(kuò)展是隨需分配的,所以一個段內(nèi)的數(shù)據(jù)擴(kuò)展在磁盤上未必是連續(xù)的。?
??
? 一個段(segment)以及屬于她的所有數(shù)據(jù)擴(kuò)展(extent)必須包含在同一表空間中。但在一個表空間內(nèi),屬于同一個段的數(shù)據(jù)擴(kuò)展可以分布在多個數(shù)據(jù)文件(datafile)上,即段可以跨文件存儲。但是每個數(shù)據(jù)擴(kuò)展只能包含于同一個數(shù)據(jù)文件中。?
??
? 在用戶分配一個新的數(shù)據(jù)擴(kuò)展(extent)時,其中的數(shù)據(jù)塊(data block)未必被同時分配。如果用戶是為某個數(shù)據(jù)庫對象分配數(shù)據(jù)擴(kuò)展 ,那么數(shù)據(jù)塊也同時被立即分配并加入可用塊列表(free list)中。如果數(shù)據(jù)擴(kuò)展并非專為某數(shù)據(jù)庫對象分配,那么數(shù)據(jù)塊只在高水位線 (high water mark)移動時才被分配。高水位線是段(segment)中已用和未用空間的邊界。?
??
? 數(shù)據(jù)塊概述?
??
??
? Oracle對數(shù)據(jù)庫數(shù)據(jù)文件(datafile)中的存儲空間進(jìn)行管理的單位是數(shù)據(jù)塊(data block)。數(shù)據(jù)塊是數(shù)據(jù)庫中最小的(邏輯)數(shù)據(jù)單位。與數(shù)據(jù)塊對應(yīng)的,所有數(shù)據(jù)在操作系統(tǒng)級的最小物理存儲單位是字節(jié)(byte)。每種操作系統(tǒng)都有一個被稱為塊容量(block size)的參數(shù)。Oracle每次獲取數(shù)據(jù)時,總是訪問整數(shù)個(Oracle)數(shù)據(jù)塊,而不是按照操作系統(tǒng)塊的容量訪問數(shù)據(jù)。?
??
? 數(shù)據(jù)庫中標(biāo)準(zhǔn)的數(shù)據(jù)塊(data block)容量是由初始化參數(shù) DB_BLOCK_SIZE 指定的。除此之外,用戶還可以指定五個非標(biāo)準(zhǔn)的數(shù)據(jù)塊容量(nonstandard block size,在10g R2 32bit版本中可以指定2k,4k,16k,32k四個非標(biāo)準(zhǔn)數(shù)據(jù)塊容量)。數(shù)據(jù)塊容量應(yīng)該設(shè)為操作系統(tǒng)塊容量的整數(shù)倍(同時小于數(shù)據(jù)塊容量的最大限制),以便減少不必要的I/O操作。Oracle的數(shù)據(jù)塊是Oracle可以使用和分配的最小存儲單位。?
??
? 數(shù)據(jù)塊結(jié)構(gòu)?
??
? 在Oracle中,不論數(shù)據(jù)塊中存儲的是表(table)、索引(index)或簇表(clustered data),其內(nèi)部結(jié)構(gòu)都是類似的。
? 標(biāo)準(zhǔn)內(nèi)容:數(shù)據(jù)塊頭中包含了此數(shù)據(jù)塊的概要信息,例如塊地址(block address)及此數(shù)據(jù)塊所屬的段(segment)的類型,例如,表或索引,該部分為。可變內(nèi)容:ITL(Interested Transaction List)用來記錄該塊所有發(fā)生的事務(wù),一個itl可以看作是一個記錄,在一個時間,可以記錄一個事務(wù)(包括提交或者未提交事務(wù))。當(dāng)然,如果這個事務(wù)已經(jīng)提交,那么這個itl的位置就可以被反復(fù)使用了,因為itl類似記錄,所以,有的時候也叫itl槽位。 如果一個事務(wù)一直沒有提交,那么,這個事務(wù)將一直占用一個itl槽位,itl里面記錄了事務(wù)信息,回滾段的入口,事務(wù)類型等等。如果這個事務(wù)已經(jīng)提交,那么,itl槽位中還保存的有這個事務(wù)提交時候的SCN號。?
??
? 表目錄區(qū)?
??
? 如果一個數(shù)據(jù)表在此數(shù)據(jù)塊中儲存了數(shù)據(jù)行,那么數(shù)據(jù)表的信息將被記錄在數(shù)據(jù)塊的表目錄區(qū)(table directory)中。?
??
? 行目錄區(qū)?
??
? 此區(qū)域包含數(shù)據(jù)塊中存儲的數(shù)據(jù)行的信息(每個數(shù)據(jù)行片斷(row piece) 在行數(shù)據(jù)區(qū)(row data area)中的地址)。 (一個數(shù)據(jù)塊中可能保存一個完整的數(shù)據(jù)行,也可能只保存數(shù)據(jù)行的一部分 ,所以文中使用row piece)?
??
? 當(dāng)一個數(shù)據(jù)塊(data block)的行目錄區(qū)(row directory)空間被使用后,即使數(shù)據(jù)行被刪除(delete),行目錄區(qū)空間也不會被回收。舉例來說,當(dāng)一個曾經(jīng)包含50條記錄的數(shù)據(jù)塊被清空后,其塊頭(header)的行目錄區(qū)仍然占用100字節(jié)(byte)的空間。只有在數(shù)據(jù)塊中插入(insert)新數(shù)據(jù)時,行目錄區(qū)空間才會被重新利用。
??
? 管理開銷?
??
? 數(shù)據(jù)塊頭(data block header),表目錄區(qū)(table directory),行目錄區(qū)(row directory)被統(tǒng)稱為管理開銷。其中 有些開銷的容量是固定的;而有些開銷的總?cè)萘渴强勺兊?ITL)。數(shù)據(jù)塊中固定及可變管理開銷的容量平均在84到107字節(jié)(byte)之間。?
??
? 行數(shù)據(jù)?
??
? 數(shù)據(jù)塊(data block)中行數(shù)據(jù)區(qū)(row data)包含了表或索引的實際數(shù)據(jù)。一個數(shù)據(jù)行可以跨多個數(shù)據(jù)塊(是行鏈接和行遷移下文會講到)?
??
? 可用空間?
??
? 在插入新數(shù)據(jù)行,或在更新數(shù)據(jù)行需要更多空間時(例如,原來某行最后一個字段為空(trailing null),現(xiàn)在要更新為非空值),將使用可用空間區(qū)(free space)中的空間。?
??
? 如果一個數(shù)據(jù)塊(data block)屬于表或簇表的數(shù)據(jù)段(data segment),或?qū)儆谒饕乃饕?#xff08;index segment),那么在其數(shù)據(jù)塊頭中還可能會存儲事務(wù)條目 。如果一個數(shù)據(jù)塊中的數(shù)據(jù)行正在由 INSERT, UPDATE, DELETE,及 SELECT...FOR UPDATE 語句訪問,此數(shù)據(jù)塊中就需要保存事務(wù)條目。?
??
? 事務(wù)條目所需的存儲空間依據(jù)操作系統(tǒng)而定。在常見的操作系統(tǒng)中事務(wù)條目大約需要占用23字節(jié)(byte)。?
??
? 數(shù)據(jù)塊中的可用空間管理?
??
? 數(shù)據(jù)庫中段的管理方式?jīng)Q定了數(shù)據(jù)塊中可用空間的管理方式。的可用空間可以被自動管理。段內(nèi)的可用/已用空間以位圖(bitmap)形式記錄(自動管理模式下),這與手動管理采用free list以列表方式的管理不同。段空間自動管理(Automatic segment-space management)具備以下優(yōu)勢:?
??
? 1、空間利用效率更高,尤其針對每行數(shù)據(jù)容量差異大的表(或其他對象)?
??
? 2、能夠更好地針對當(dāng)前數(shù)據(jù)的情況實時調(diào)整?
??
? 3、易于使用?
??
? 4、在RAC環(huán)境下能更好的提升性能和空間利用(個人認(rèn)為是因為第一和第二點的優(yōu)勢在RAC環(huán)境下能更明顯的體現(xiàn)出來的原因。)?
??
? 用戶可以在創(chuàng)建一個本地管理的表空間(locally managed tablespace)時選擇自動段空間管理(automatic segment-space management)功能。這樣在此表空間內(nèi)創(chuàng)建的段都將默認(rèn)地設(shè)置為自動段空間管理。?
??
? 數(shù)據(jù)塊可用空間的有效性及優(yōu)化?
??
? 有兩種SQL語句可以增加數(shù)據(jù)塊中的可用空間:分別是 DELETE 語句,和將現(xiàn)有數(shù)據(jù)值更新為占用容量更小值的 UPDATE 語句。在以下兩種條件下,上述兩中操作釋放的空間可以被后續(xù)的 INSERT 語句使用:?
??
? 如果 INSERT 語句與上述兩種操作在同一事務(wù)(transaction)中,且位于釋放空間的語句之后,那么 INSERT 語句可以使用被釋放的空間。?
??
? 如果 INSERT 語句與釋放空間的語句在不同的事務(wù)中(比如兩者是由不同的用戶提交的),那么只有在釋放空間的語句提交后,且插入數(shù)據(jù)必需使用此數(shù)據(jù)塊時, INSERT 語句才會使用被釋放的空間。?
??
? 數(shù)據(jù)塊(data block)中被釋放出的空間未必與可用空間區(qū)(free space)相連續(xù)。Oracle在滿足以下條件時才會將釋放的空間合并到可用空間區(qū):(1) INSERT 或 UPDATE 語句選中了一個有足夠可用空間容納新數(shù)據(jù)的數(shù)據(jù)塊,(2)但是此塊中的可用空間不連續(xù),數(shù)據(jù)無法被寫入到數(shù)據(jù)塊中連續(xù)的空間里。Oracle只在 滿足上述條件時才對數(shù)據(jù)塊中的可用空間進(jìn)行合并,這樣做是為了避免過于頻繁的空間合并工作影響數(shù)據(jù)庫性能。?
??
? 數(shù)據(jù)塊中行片段?
??
? Oracle 使用一個或多個行片斷(row piece)來存儲表的每一行數(shù)據(jù)的前255列。當(dāng)一個數(shù)據(jù)塊(data block)可以容納一個完整的數(shù)據(jù)行時(且表的列數(shù)小于等于 256),那么此行就可以使用一個行片斷來存儲。當(dāng)插入(insert)一個數(shù)據(jù)行,或更新(update)已有數(shù)據(jù)行時,數(shù)據(jù)行容量大于數(shù)據(jù)塊容量,那么 Oracle 將使用多個行片斷來存儲此行。大多數(shù)情況下,每個數(shù)據(jù)行只存儲于一個行片斷中,且在同一數(shù)據(jù)塊內(nèi)。?
??
? 有兩種情況會導(dǎo)致表中某行數(shù)據(jù)過大,一個數(shù)據(jù)塊(data block)無法容納。?
??
? 第一種情況,行鏈接?
??
? 當(dāng)一行數(shù)據(jù)被插入時一個數(shù)據(jù)塊就無法容納 。在這種情況下Oracle將這行數(shù)據(jù)存儲在段內(nèi)的一個數(shù)據(jù)塊鏈(chain)中。在插入數(shù)據(jù)量大的行時常會發(fā)生行鏈接(row chaining),例如一個包含數(shù)據(jù)類型為 LONG 或 LONG RAW 列的數(shù)據(jù)行。此時行鏈接不可避免。當(dāng) Oracle 必須使用多個行片斷來存儲同一數(shù)據(jù)行時(且每個行片斷位于不同的數(shù)據(jù)塊內(nèi)),此行將在多個數(shù)據(jù)塊間構(gòu)成行鏈接(Row Chaining)。?
??
? 當(dāng)一個表超過 255 列時,每行第255列之后的數(shù)據(jù)將作為一個新的行片斷(row piece)存儲在相同的數(shù)據(jù)塊(data block)中,這被稱為塊內(nèi)鏈接(intra-block chaining)。由多個行片斷組成的行進(jìn)行塊內(nèi)鏈接時,使用各行片斷的 rowid 進(jìn)行鏈接。當(dāng)一個行為塊內(nèi)鏈接時,用戶可以從同一數(shù)據(jù)塊中訪問此行的全部數(shù)據(jù)。如果一個數(shù)據(jù)行位于同一數(shù)據(jù)塊內(nèi),那么訪問此行不會影響 I/O 性能,因為訪問此行不會帶來額外的 I/O 開銷。?
??
? 行遷移?
??
? 原本存儲在一個數(shù)據(jù)塊(data block)內(nèi)的數(shù)據(jù)行,因為更新操作導(dǎo)致長度增長,而所在數(shù)據(jù)塊的可用空間也不能容納增長后的數(shù)據(jù)行 。在這種情況下,Oracle將此行數(shù)據(jù)遷移到新的數(shù)據(jù)塊中。Oracle在被遷移數(shù)據(jù)行原來所在位置保存一個指向新數(shù)據(jù)塊的指針。被遷移數(shù)據(jù)行的 rowid 保持不變。?
??
? 當(dāng)數(shù)據(jù)行發(fā)生鏈接(chain)或遷移(migrate)時,對其訪問將會造成 I/O 性能降低,因為Oracle為獲取這些數(shù)據(jù)行的數(shù)據(jù)時,必須訪問更多的數(shù)據(jù)塊(data block)。?
??
? PCTUSED、PCTFREE?
??
? 在手動管理的表空間(manually managed tablespaces)中,用戶可以使用 PCTFREE 和 PCTUSED 這兩個存儲管理參數(shù)來控制對某段(segment)進(jìn)行插入和更新操作時,如何利用屬于此段的數(shù)據(jù)塊(data block)中的可用空間。用戶也可以在創(chuàng)建或修改索引時為其設(shè)定 PCTFREE 參數(shù)(索引存儲在索引段(index segment)中)。?
??
? PCTFREE?
??
? PCTFREE 參數(shù)用來設(shè)置一個數(shù)據(jù)塊(data block)中至少需要保留(reserve)多少可用空間(百分比值),為數(shù)據(jù)塊中已有數(shù)據(jù)更新時可能發(fā)生的數(shù)據(jù)量增長做準(zhǔn)備。例如,當(dāng)用戶用 CREATE TABLE 語句創(chuàng)建表時指定了以下參數(shù): PCTFREE 20。?
??
? 這個參數(shù)設(shè)定了此表對應(yīng)的數(shù)據(jù)段(data segment)中的每個數(shù)據(jù)塊(data block)至少保留20%的可用空間,以備塊中已有數(shù)據(jù)更新時使用。只要數(shù)據(jù)塊中行數(shù)據(jù)區(qū)與數(shù)據(jù)塊頭的容量之和不超過數(shù)據(jù)塊總?cè)萘康?0%,用戶就可以向其中插入新數(shù)據(jù),數(shù)據(jù)行被放入行數(shù)據(jù)區(qū)(row data area),相關(guān)信息被寫入數(shù)據(jù)塊頭(overhead area)。

總結(jié)

以上是生活随笔為你收集整理的Oracle数据块原理深入剖析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。