亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

解讀SQL 內存數據庫的細節

2024-07-21 02:50:56
字體:
來源:轉載
供稿:網友
解讀SQL 內存數據庫的細節

相信大家對內存數據庫的 概念并不陌生,之前園子里也有多位大牛介紹過SQL內存數據庫的創建方法,我曾仔細 拜讀過,有了大致了解,不過仍有很多細節不清晰,比如:

(1)內存數據庫是把整個數據庫放到內存中的嗎?

(2)數據都在內存里面,那宕機或者斷電了,數據不是沒有了嗎?

(3)據在內存是怎么存放的,還是按照頁的方式嗎,一行的大小有限制嗎?

(4)內存數據庫號稱無鎖式設計,SQL是如何處理并發沖突的呢?

相信這些疑問也是大家在思考內存數據庫時經常遇到的難題,下文將為大家一一揭開這些問題的面紗,如有不對之處,還請各位看官幫我指出。

一、內存數據庫是如何存儲的,只放在內存嗎?是把整個數據庫放在內存嗎?

答案:不是。

如果你還沒有看過宋大俠的博客,建議現在就看看。

http://www.cnblogs.com/CareySon/p/3155753.html

在這篇文章中,我想著重引用如下兩個信息:

(1)內存數據庫其實就是將指定的表放到內存中,而不是整個數據庫;

(2)內存數據庫用文件流的方式組織磁盤中的數據文件;

我再補充一個信息

(3)內存數據庫的數據文件分data file和delta file,而且是成對出現;

1、內存數據庫其實就是將指定的表放到內存中,而不是整個數據庫;

從宋大俠的博客中可以知道,內存數據庫的創建過程其實就是將表存放到內存中,而不是整個數據庫。下圖展示 了創建內存優化表的語法,紅色框標注了內存與傳統表創建時語法不相同的地方。

內存優化表不僅僅是把數據存放到內存中,要不然跟傳統數據的緩存沒有區別。在內存數據庫中,內存優化表也叫為"natively compile memory-optimized tables",翻譯過來就是本地編譯內存優化表,內存優化表在創建的同時被編譯成本地機器代碼裝載到內存中,本地機器代碼包含了能被CPU直接執行的機器指令,所以對內存優化表的訪問和操作將非常快。

內存優化表分兩類,持久性表和非持久性表,對持久性表的改動會記錄日志,即使數據庫重啟,數據也不會丟失;對非持久性表的操作不會記錄日志,這些操作結果只保留在內存中,數據庫重啟后數據會丟失。

上文只是介紹了新建一張表的情況,在正常的業務環境中我們不可能對一個業務系統數據庫的每張表都去create,那對于已經存在的表,有沒有配置方法呢?答案恐怕不太令人滿意,目前SQL暫不支持遷移現有表到內存中,因此要想使用內存數據庫,現有的業務數據表必須重新創建。

2、內存數據庫用文件流的方式組織磁盤中的數據文件

在內存數據庫中,磁盤上存儲的數據文件不在是區、頁的存儲方式,而是基于文件流存儲。文件流存儲的一個特點之一就是支持快速的讀操作,這在數據庫重啟時將文件流中的數據load到內存中時很能提高效率。

3、內存數據庫的數據文件分data file和delta file,而且是成對出現;

內存數據庫中插入、更新的數據和刪除的數據物理分開存儲的,分別用data file和delta file保存。

(1)Data file

Data file用來保存"插入"或者"更新"的數據行,data file中數據行的存儲順序嚴格按照事務執行的順序組織,比如data file中第一行的數據來自于事務1,第二行數據來自于事務2,這兩行可以是同一個表的數據,也可以是不同表的數據,取決于這兩個連續的事務操作的內存優化表是否相同。 這種方式的好處是保證了磁盤IO的連續性,避免隨機IO。

Data file的大小是固定的,為128MB,當一個data file被寫滿了后,SQL會自動新建一個data file。因為數據在data file中保存的順序是按照事務的執行順序進行的,所以一張表的數據行(來自多個事務)可能跨越了多個data file,當對多行進行更新操作時,寫操作可以分配到多個文件上,并且同時進行,這樣就可以加快更新的效率。(下文介紹delta file時會介紹)

如下圖,一共有4個data files(淺藍色),第一個data file的事務范圍為100-200,第二個data file的事務范圍為200-300……(100、200表示時間戳)

在Data file中,如果一行被刪除或者更新了,這行不會從data file中移除,而是通過delta file(上圖黃色框)來標記刪除的行,(update的本質是delete和insert的集合,所以執行update時也會有刪除的動作),這樣可以消除不必要的磁盤IO。

如果data file的數據永不刪除,那文件豈不是無限制的增大,以后備份不是得用很大的磁盤才行?當然不是,SQL在處理這個問題用到方法其實很簡單——"合并",根據合并策略,將多個data file和delta file合并起來,依據delta file的內容刪除data file中的多余記錄,然后將多個data file合并成一個文件,從而減小數據文件占用的磁盤空間大小。

(2) Delta file

每個data file都有一個與之匹配的Delta File,這個匹配是指事務范圍上的匹配,兩者記錄的是同一段事務(包括一個或者多個事務)上的數據,Delta File中記錄了data file中被刪除行的標記,這個標記其實就是一個關聯信息{inserting_tx_id, row_id, deleting_tx_id }。它跟data file一樣,也是嚴格按照事務操作的順序來保存刪除的行的信息。

如上圖,該內存數據庫有5個data file,分別存放了事務范圍在100-200、200-300、300-400、400-500及500的數據。如果有一個時間戳為501的事務需要刪除時間戳為150、250、450的事務所產生的數據和增加一些新數據時,相應的IO請求就會被分配到第1、2、4的 delta file上和第5的data file上。刪除操作可以分配到多個文件上,并且同時進行,這樣就可以加快刪除的效率。

二、數據都在內存里面,那宕機或者斷電了,數據不是沒有了嗎?

答案:不是。

內存數據庫通過兩種方式保證數據的持久性:事務日志和chcekpoint。

(1)事務日志

內存數據庫的"寫日志"和"寫數據"在一個事務中進行,在事務執行期間,SQL會先"寫數據"然后在才"寫日志",這點與傳統數據庫不同,在傳統數據庫中,不管是在內存中還是磁盤中,"寫數據"總是在"寫日志"之后,也就是通常所說的WAL(Write-Ahead Transaction Log)。但是,在事務提交時,內存數據庫和傳統數據庫在"寫日志"上沒有什么區別:日志會先于數據寫入到磁盤中。

因此,即使服務器發生了宕機或者斷電,下次數據庫重啟時會按照已經保存在磁盤中事務日志將業務redo(重做),所以不要擔心數據會丟失。

另外,需要補充的是,內存數據庫只會對持久性表將已提交的事物日志保存到磁盤中。這樣做的好處可以減少寫磁盤的次數。內存數據庫支持頻繁、快速的增、刪、改等操作,這個強度遠遠高于傳統數據庫,數據庫需要為每筆操作寫日志,這樣就會產生大量磁盤IO,寫日志操作將有可能成為性能瓶頸,不記錄未提交的事務日志就減少寫日志的數量,從而可以提高數據庫的性能。

有同學會想,不記錄未提交事務的日志會不會導致數據不一致呢?

肯定不會,因為日志在寫入磁盤前不可能發生先把"臟數據"寫入到磁盤的現象(下面介紹checkpoint的時候會介紹原因)。

(2)CheckPoint

在內存數據庫中,CheckPoint的主要目的就是將內存中的"數據"寫入到磁盤中,從而在數據庫崩潰或者重啟時減少數據恢復的時間。不需要數據庫逐條讀取所有的日志來恢復數據。默認情況下Checkpoint是周期性進行的,當日志至上次checkpoint后增加了512M時會觸發新一輪CheckPoint。

在傳統數據庫這種,Checkpoint可以將未提交的數據flush到磁盤的mdf文件中,這個現象在內存數據庫中不會發生,因為內存數據庫只將已提交事務的日志,而在寫日志(到磁盤)之前不可能將數據先寫到磁盤中,因此可以保證寫到磁盤中的數據一定是已提交事務的數據。

三、數據在內存是怎么存放的,還是按照頁的方式嗎,一行的大小有限制嗎?

答案:不是按照頁的方式,一行的限制大小為8060Bytes。

內存優化表是基于行版本存儲的,同一行在內存中會有多個版本,可以將內存優化表的存儲結構看作是該表中 所有行的多個行版本的集合。

內存優化表中的行跟傳統數據庫的行結構是不一樣的,下圖描述了內存優化表中一行的數據結構:

在內存優化表中,一行有兩個大部分組成:Row header和Row body,

Row header記錄這個行的有效期(開始時間戳和結束時間戳)和索引指針

Row body記錄了一行的實際數據。

在內存優化表中,行版本的數量是由針對該行的操作次數決定的,比如:每更新一次,就會新產生一行,增加一個行版本,新行有新的開始時間戳,新行產生后,原來的數據行會自動填充結束時間戳,意味這行已經過期。

備注:上圖實際上只有3行,第1行有3個行版本,第2行有2個行版本,第3行有4個行版本。

既然同一行在內存中存在這么多的行版本,那數據庫在訪問時是怎么控制的呢?

在傳統數據庫中,表中每一行都是唯一的,一個事務如想找到一行,通過文件號、頁號、槽位就可以了。

在內存數據庫中,每一行有多個行版本,一個事務不可能對將每個行版本都操作一遍,實際上,一個事物只能操作同一行的一個行版本,至于它能對哪個行版本進行操作,取決于事務執行時間是否在這行的兩個時間戳之間。除此之外的其他行版本對該事務而言是不可見的。

由于一行可能存在多個行版本,大家可能會提出這樣一個疑問:每行都有這么多行版本,一張上百萬行的表,內存哪夠呀。不用擔心,前文介紹過了,每個行實際上是有時間戳的,對于已經打上結束時間戳且沒有活動事務訪問的行,SQL Server會通過garbage collection機制回收它占用的內存,從而節省內存。所以不要擔心內存不夠。

四、內存數據庫號稱無鎖式設計,那如果發生了并發沖突怎么辦,SQL是如何處理沖突的呢?

答案:內存數據庫用行版本來處理沖突。

鎖的一個重要作用就是避免多個進程同時修改數據,從而造成數據不一致。常見的沖突現象包括讀寫互鎖和寫寫互鎖。那內存數據庫是如何通過行版本來解決這兩種鎖定現象的呢?

(1)讀寫互鎖

在內存數據庫中,所有對內存優化表的事務隔離都是基于快照的,準確的說是基于行的快照。從上文行的 結構可以知道,每行的行頭包括開始時間戳和結束時間戳的,一個事務能不能訪問到這行關鍵在于事務的啟動時間是不是在這行的兩個時間戳內。

如果某個事務正在修改一行(快照),但還未提交到內存優化表中,也就是說"新行"還沒有結束時間戳,對"讀事務"而言,它讀還是是原來行(快照),因此不會存在臟讀的現象。

(2)寫寫互鎖

兩個事務同時更新一行時,就會發生寫寫互鎖。

內存數據庫沖突發生的概率比傳統數據庫小很多,但如果實在遇到了沖突,只能調整應用程序,在應用程序中加入"重試邏輯"(等待一會,然后再重新發起事務)來解決。

或許有同學覺得這種方式好像也沒有什么大的性能改變。其實不然,舉

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久久精品| 5252色成人免费视频| 美女久久久久久久久久久| 亚洲精品美女久久久久| 久热在线中文字幕色999舞| 国产成人精品最新| 国产999精品| 国产精自产拍久久久久久| 91久久久久久久久久| 欧美成人精品一区| 亚洲国产精品va在看黑人| 亚洲精品白浆高清久久久久久| 91成人在线观看国产| 亚洲欧洲在线免费| 日韩欧美中文免费| 26uuu日韩精品一区二区| 亚洲天堂av综合网| 国产一区二区激情| 91九色单男在线观看| 美女精品久久久| 另类专区欧美制服同性| 亚洲va欧美va国产综合剧情| 国产精品久久久| 国产97在线亚洲| 亚洲999一在线观看www| 视频直播国产精品| 国产精品色悠悠| 亚洲一区二区少妇| 亚洲黄色在线观看| 欧美日本亚洲视频| 日韩中文字幕网| 欧美成人精品三级在线观看| 欧美性xxxxxxxxx| 久久中文字幕国产| 国产精选久久久久久| 懂色aⅴ精品一区二区三区蜜月| 97高清免费视频| 亚洲视频在线视频| 亚洲欧美在线磁力| 亚洲国产精品热久久| 久久人91精品久久久久久不卡| 欧美在线免费看| 久久精品国亚洲| 国产福利精品视频| 91精品在线国产| 国产精品久久在线观看| 国产精品亚洲自拍| 国产精品精品国产| 亚洲成人av在线| 国产精品v片在线观看不卡| 亚洲综合第一页| 91精品久久久久久久久中文字幕| 色综合久久88| 亚洲精品电影网站| 国产福利精品视频| 中文字幕精品久久| 亚洲天堂精品在线| 欧美国产日韩一区二区| 精品magnet| 26uuu亚洲伊人春色| 2019中文字幕免费视频| 亚洲国产精久久久久久| 亚洲精品黄网在线观看| 性欧美办公室18xxxxhd| 成人国产精品久久久| 亚洲精品黄网在线观看| 最新亚洲国产精品| 亚洲欧美国产一区二区三区| 亚洲欧美三级在线| 啊v视频在线一区二区三区| 2018日韩中文字幕| 亚洲精品www久久久久久广东| 欧美日韩免费观看中文| 青青草99啪国产免费| 日韩成人av一区| 欧美黑人巨大精品一区二区| 久久久视频精品| 亚洲欧洲成视频免费观看| 日韩欧美成人网| 亚洲va国产va天堂va久久| 最近日韩中文字幕中文| 国产精品免费一区| 欧美大尺度激情区在线播放| 欧美大片在线影院| 日韩美女主播视频| 一本一道久久a久久精品逆3p| 色偷偷噜噜噜亚洲男人的天堂| 国产精品午夜一区二区欲梦| 91系列在线播放| 国产成人综合精品在线| 亚洲免费视频网站| 91久久国产精品91久久性色| 日本一欧美一欧美一亚洲视频| 亚洲乱亚洲乱妇无码| 亚洲天堂av在线免费观看| 欧美性猛交99久久久久99按摩| 国产精品美女www爽爽爽视频| 91国产精品电影| 欧美怡春院一区二区三区| 欧美视频免费在线观看| 亚洲最大中文字幕| 亚洲欧美日韩国产成人| 亚洲成人网在线| 欧美性猛交xxxx乱大交| 久久在精品线影院精品国产| 欧美猛交免费看| 欧美日本在线视频中文字字幕| 久久中文字幕国产| 伊人久久久久久久久久久久久| 亚洲天堂男人天堂女人天堂| 欧美性资源免费| 亚洲女人被黑人巨大进入al| 91av在线播放视频| 亚洲爱爱爱爱爱| 国产日韩精品综合网站| 久久久最新网址| 国产精品亚洲综合天堂夜夜| www高清在线视频日韩欧美| 色www亚洲国产张柏芝| 一区二区三区视频观看| 日韩电影免费观看在线观看| 午夜精品免费视频| 91丝袜美腿美女视频网站| 91亚洲精品视频| 亚洲男人天堂2023| 亚洲午夜未满十八勿入免费观看全集| 亚洲加勒比久久88色综合| 欧美极度另类性三渗透| 欧美专区在线播放| 色av吧综合网| 久久久精品一区二区| 亚洲美腿欧美激情另类| 神马久久久久久| 亚洲天堂开心观看| 久久久精品久久久久| 国产欧美日韩丝袜精品一区| 亚洲精品动漫久久久久| 国产精品∨欧美精品v日韩精品| 91牛牛免费视频| 欧美综合一区第一页| 91人成网站www| 亚洲色图美腿丝袜| 欧美一区二区三区四区在线| 亚洲男人天堂2019| 欧美精品情趣视频| 91国产在线精品| 国产午夜精品一区二区三区| 成人av.网址在线网站| 日韩女优人人人人射在线视频| 色综合久综合久久综合久鬼88| 一道本无吗dⅴd在线播放一区| 亚洲一区二区福利| 亚洲区一区二区| 久久福利网址导航| 久久久久久久久久久亚洲| 国产在线一区二区三区| 欧美午夜精品久久久久久久| 日韩av大片在线| 欧美激情视频一区二区| 一区二区成人精品| 欧美综合第一页| 国产亚洲精品久久久久久牛牛| 在线看福利67194| 一本一道久久a久久精品逆3p|