看到很多朋友對數據庫的理解、認識還是沒有突破一個瓶頸,而這個瓶頸往往只是一層窗紙,越過了你將看到一個新世界。
04、05年做項目的時候,用SQL Server 2000,核心表(大部分使用頻繁的關鍵功能每次都要用到)達到了800萬數據量,很早以前查過一些相關表,有的達到了3000多萬,磁盤使用的光纖盤,100G空間,每周必須備份轉移數據,否則100G空間一周會滿掉,這個系統幾年來,目前仍然保持非常良好的性能。還聽說過朋友的SQL Server 2000數據庫工作在幾十TB的環境下,高並發量,對這種級別的駕馭能力我還是差的很遙遠。
想當年,也是一提SQL Server,就覺得它的性能沒法跟Oracle相比,一提到大數據處理就想到Oracle。自己一路走來,在本地blog上記錄了很多優化方面的post,對的錯的都有,沒有時間系列的整理出來,這篇文章將join方法的概念稍微整理在一起,給大家個參考。通過查資料了解裡面提到的各種概念,在實際中不斷驗證總結,完全可以對數據庫一步步深入理解下去的。
我只對SQL Server 2000比較了解,但這並不阻礙我在Oracle、MySQL進行SQL調優、產品架構,因為在數據庫理論原理上,各大數據庫基本出入不大,對數據庫的深入理解,也不會影響你架構設計思想變壞,相反給你帶來的是更深層次的思考。
關於執行計劃的說明
在SQL Server查詢分析器的Query菜單中選擇Show Execution Plan,運行SQL查詢語句,在結果窗口中有Grid、Execution Plan、Messages三個Tab。看圖形形式的執行計劃,順序是從右到左,這也是執行的順序。執行計劃中的每一個圖標表示一個操作,每一個操作都會有一個或多個輸入,也會有一個或多個輸出。輸入和輸出,有可能是一個物理數據表、索引數據結構,或者是執行過程中的一些中間結果集/數據結構。鼠標移動到圖標上,會顯示這個操作的具體信息,例如邏輯和物理操作名稱、記錄的數量和大小、I/O成本、CPU成本、操作的具體表達式(參數Argument)。鼠標移動到連接箭頭上,會顯示箭頭起始端的操作輸出結果集的記錄數、記錄的大小,一般情況下可以將這個輸出結果集理解為箭頭結束端的輸入。
另外關於執行計劃的一些補充說明:1. 執行計劃中顯示的信息,都是一個“評估”的結果,不是100%准確的信息,例如記錄數量是取自統計信息,I/O成本、CPU成本來自執行計劃生成過程中基於統計信息等得出的評估結果。2. 執行計劃不一定准確,一方面受SQL Server維護的統計信息准確性的影響,另一方面SQL語句編譯時刻與執行時刻的環境(內存使用狀況、CPU狀況等)可能會不一樣。
關於統計信息、I/O成本和CPU成本的評估、SQL語句的編譯和執行過程,這裡不再深入。另外盡管執行計劃不一定准確,但它仍是SQL語句分析最重要的依據,因為你可以理解為,絕大部分情況下,SQL Server是以這種方式來執行的。