學習資料庫的基礎知識的書籍

freebus發表於2020-02-26



一開始學資料庫的時候,和學校裡教的 C/C++/Java 完全不是一個路子的事。你學會了 C 中的函式,Java 中的方法,卻無法理解 SELECT WHERE FROM 到底為什麼不能執行;你知道了指標,卻依舊不知道為什麼需要一個索引才能使得 SQL 跑的飛快。


其實入門來說,把書好好看看,例子好好做做,就會了。


從入門到能做事,才是需要花時間精進的。


資料庫的內部結構,就像是作業系統那麼複雜。


它涉及到的內容,有硬體三大件,即 CPU, 記憶體,IO;還有與之互動的軟體,SQL 和 內嵌的語言( 比如 CLR )


遠古時期的資料庫應用,只有少數科學家在上面跑批處理,瓶頸往往都是單個硬體元件,比如 CPU, 記憶體,IO. 大家都知道的是老式的硬碟,往往轉速不夠快,導致計算一直很緩慢,那麼用 RAID 就可以明顯提高效率了;記憶體在早期也沒有很多的容量,或者價格很高,很難民用;CPU 往往是發展最快的,摩爾定理 18 個月翻番,但在那時候,依舊達不到現在 i3 的速度。


所以就在那個時期,跑批花的時間可能是幾天。有部電影《模仿遊戲》,由圖靈艾倫(就是美國計算機協會以他的名義設立了圖靈獎的那個圖靈》自制的破譯德軍密碼的機器,在破譯之前大家能做的事情就是等著機器停下來。20世紀50年代,計算機被正式用起來的那段時期,資料管理概念(現在被稱為資料庫管理)已經成型了。那個年代基本上在硬體體系找效能最佳化突破口。


上述的故事,歷史告訴我們一個契機:在談論資料庫效能最佳化的時候,不可忽略機器,軟體本身的架構。在我們談論如何最佳化 SQL 的時候,能一定不能脫離資料庫軟體自身的體系結構。那麼以下的書單,是需要同時進行閱讀與操練的。


以我目前所使用的 SQL Server 來說,這些書可以按個看下去:


涉及到體系結構的,分別有《Microsoft SQL Server 2008 Internals》,《Inside SQL Server 2005/2008 Storage Engine》.


《Storage Engine》,切勿望文生義,不單講儲存,它是全面的讓我們瞭解 SQL Server 底層結構與上層應用的本質。書中的一張體系圖,非常好用。你之前用 Sql Server Management Studio 來拉一拉資料,還經常抱怨下,這介面怎麼老是執行的那麼慢,一會就卡死。看過之後,你就會覺得,哦,原來這些 SQL 還要經過這這這那那那步驟,難怪反應慢了,看來我得限制點資料跑一跑,或者去伺服器用Bulk 跑一下。你看是不是對調優也有幫助呢。本書除了講體系,更重要的是幫我們瞭解一些表,索引結構的知識。有些做了很久開發的朋友,其實是不知道為什麼要分割槽,怎樣分割槽的。所以在這裡可以看到,分割槽的概念就是分散式儲存的一個應用,利用多磁碟的軌道定址,幫助 SQL 查詢資料。


《Internals》是講內幕的書。你看了之前的《Storage Engine》能夠幫你瞭解是什麼,那麼這本書就帶你瞭解為什麼要這麼做。為什麼 Halloween Problem 會存在,即導致你的 SQL 迴圈,明明有了退出條件,為什麼始終等不到退出; 為什麼 SQL 有了 where 條件,卻把別人的查詢給堵塞了;為什麼 Inner join 沒有 Inner Hash Join 來得快,等等一系列問題,都會在書中有詳細例子給你做闡述。除了這些針對 SQL 本身的原理提出瞭解釋,本書還有很多實質性操作的案例。就比如 Inner Hash Join 。 我經常會問身邊做了4,5年開發的朋友,平時用什麼 Hint 來提高效能。他們很多時候給我的 答案是,搖頭,即不知道 Hint 是什麼。那麼 “ with(NOLOCK) 用過嗎 ”,“當然,這樣可以允許讀的快一點”。 所以假如你也不知道內幕是什麼,看這本書就對了。


如果想要再深入一點,可以看看《Windows Internals》。這是一本講 Windows 作業系統的書。講程式,執行緒,記憶體,NUMA, Performance Monitor, 在我們對資料庫做日常健康巡檢的時候,經常會用到的一些概念。


《Inside Microsoft SQL Server Queryting Tuning and Optimization》:如果大家平時的工作,就是為了拉資料快一點,而不想深入的去了解體系,就想在 3 個月內提高自己的 T-SQL 最佳化水平,那麼直接看這本吧。本書從實際的調優的角度出發,帶我們尋找,為什麼我們的 SQL 會慢,有可能的原因是,堵塞:伺服器資源不夠而造成的排隊等待,或者併發引起的競爭條件,即我們訪問的資源被別的程式給鎖住了;為什麼我們的 儲存過程會突然變慢,有可能的原因是因為重新編譯了,導致 CPU 變高,也有可能是因為 parameter sniff(引數嗅探帶來的計劃快取)。當然這本書裡還提到了邏輯處理與物理處理,即在我的微信公眾號有篇文章提到的執行計劃的Physical Operation(物理運算子). 這是 SQL 編寫層面的, 但是也能解釋,Join 中的 on 與 From 中的 where ,對最終結果的影響。資料庫級別的調優,本質上都要考慮整個庫的輸出質量,是對各個元件的平衡,以達到滿足絕大部分請求。


《資料庫索引設計以及最佳化》:索引在我們平時的 SQL 調優中,肯定是會優先考慮的步驟。那麼你知道為什麼索引要定期重建嗎;為什麼要將一些無關的欄位也放進索引裡面;為什麼在資料倉儲中藥使用點陣圖索引呢? 這本書圍繞著索引講述了大量的索引實際操作,以及講解為什麼要這麼建。如果我們不知道成本最佳化的概念,其實有好的索引放在庫裡,但是最佳化器並沒有引用這個索引,我們也無法去引導最佳化器使用這個索引。書中還特別指出了最佳化器的盲點,需要人去做排程。這本是最佳化器的一個缺陷,但是給了 AI 從全量資料角度去幫我們做最佳化決策的一個入口。


《Database System implementation》,即《資料庫系統實現》。再有興趣的同學可能需要研讀一下這本書了,雖說是教科書,但是各家資料庫的供應商畢竟都有自己對 SQL 引擎的實現方式。萬變不離其宗,基本原理就在這裡。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31365439/viewspace-2677274/,如需轉載,請註明出處,否則將追究法律責任。

相關文章