SQL 數據庫學習路線推薦

昨天咱們的星球裏有位朋友諮詢了個 SQL 數據庫學習路線的問題。數據庫

一開始學數據庫的時候,和學校裏教的 C/C++/Java 徹底不是一個路子的事。你學會了 C 中的函數,Java 中的方法,卻沒法理解 SELECT WHERE FROM 到底爲何不能執行;你知道了指針,卻依舊不知道爲何須要一個索引才能使得 SQL 跑的飛快。緩存

其實入門來講,把書好好看看,例子好好作作,就會了。性能優化

從入門到能作事,纔是須要花時間精進的。服務器

如下是我在知乎上答的 一篇帖子,順着其中提到的書,慢慢摸索個年把,就會略有小成了。微信

數據庫的內部結構,就像是操做系統那麼複雜。架構

它涉及到的內容,有硬件三大件,即 CPU, 內存,IO;還有與之交互的軟件,SQL 和 內嵌的語言( 好比 CLR )併發

遠古時期的數據庫應用,只有少數科學家在上面跑批處理,瓶頸每每都是單個硬件組件,好比 CPU, 內存,IO. 你們都知道的是老式的硬盤,每每轉速不夠快,致使計算一直很緩慢,那麼用 RAID 就能夠明顯提升效率了;內存在早期也沒有不少的容量,或者價格很高,很難民用;CPU 每每是發展最快的,摩爾定理 18 個月翻番,但在那時候,依舊達不到如今 i3 的速度。分佈式

因此就在那個時期,跑批花的時間多是幾天。有部電影《模仿遊戲》,由圖靈艾倫(就是美國計算機協會以他的名義設立了圖靈獎的那個圖靈》自制的破譯德軍密碼的機器,在破譯以前你們能作的事情就是等着機器停下來。20世紀50年代,計算機被正式用起來的那段時期,數據管理概念(如今被稱爲數據庫管理)已經成型了。那個年代基本上在硬件體系找性能優化突破口。ide

上述的故事,歷史告訴咱們一個契機:在談論數據庫性能優化的時候,不可忽略機器,軟件自己的架構。在咱們談論如何優化 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 引擎的實現方式。萬變不離其宗,基本原理就在這裏。

相關文章
相關標籤/搜索