一 概述 我的工作是開發移動電信操作系統
當客戶通過網絡或語音終端申請一項服務的時候
我們的系統必須提供一個快速的回應
即使是要求不到一秒的回答時限
我們仍然需要在容量巨大的DB端執行復雜的SQL語句
在這種情況下
一個簡單的低效率的查詢會帶來災難性的後果
一個不合適的SQL語句有可能耗盡整個DB的處理資源
這樣一來就導致DB不能處理其他的客戶請求
而且
這種情況往往發生在新的服務項目的發布之後
也就是說
正是市場行銷的高峰期
你能想象當這樣的問題發生時我們的高級市場經理的心情嗎?
不幸的是
低效率的SQL語句是不可避免的
系統通常都是在遠遠低於產品正常運行時的數據數量之上進行測試的
所以系統的性能隱患不可能被完全發現
這也正是每一個DB開發人員都應該明白基本SQL調試原理的初衷
這篇文章將對此類問題做一個理論性的闡述
在讀完文章之後
你應該能回答: 對特定數據量的數據I
這個執行計劃是合理的嗎?
我不得不提醒你
這是一個關於理論的文章
我知道沒有人喜歡理論
但是沒有其他有效的方法來數說一二
那麼
別擔心
讓我們繼續吧
也許我們能從這裡得到一些幫助和啟示
在這片文章裡
將說明以下幾個方面:
什麼是最優化
數據表記錄查詢
嵌套循環連接表
二 假定 CUSTOMERS表包含了所有客戶的總體信息
假設這個公司有一百萬個客戶
CUSTOMERS表有一個主鍵CUSTOMER_ID
這個主鍵有一個索引PK_CUSTOMERS
LAST_NAME列也有一個名為IX_CUSTOMERS_LAST_NAME的索引
表中有
個不同的Last Name
表中的記錄平均有
bytes
CUSTOMERS表中的REGION_ID字段連接REGIONS表
REGIONS表包含了所有的大約
個國家和地區
有一個主鍵GEGION_ID和關於這個主鍵的索引PK_REGIONS
我將使用RECORDS(CUSTOMERS)和PAGES(CUSTOMERS)分別來表示CUSTOMERS表的記錄數量和頁數
對於其它的表甚至索引也用類型的標志方法
Prob[CUSTOMERS
LAST_NAME = @LastName]表示一個客戶名字為@LastName的可能性
三 什麼是執行計劃 一個SQL語句表示你所想要得到的但是並沒有告訴Server如何去做
例如
利用一個SQL語句
你可能要Server取出所有住在Prague的客戶
當Server收到的這條SQL的時候
第一件事情並不是解析它
如果這條SQL沒有語法錯誤
Server才會繼續工作
Server會決定最好的計算方式
Server會選擇
是讀整個客戶表好呢
還是利用索引會比較快些
Server會比較所有可能方法所耗費的資源
最終SQL語句被物理性執行的方法被稱做執行計劃或者是查詢計劃
一個執行計劃右若干基本操作組成
例如
遍歷整張表
利用索引
執行一個嵌套循環或Hash連接等等
我們將在這一系列的文章裡詳細討論
所有的基本操作都有一個輸出: 結果集
有些
象嵌套循環
有一個輸入
其他的
象Hash連接
有兩個輸入
每個輸入應與其它基本操作的的輸出想連接
這也就是為什麼一個執行可以被看做是一個數的原因: 信息從樹葉流向樹根
在文章的下面部分有很多諸如此類的例子
負責處理或計算最優的執行計劃的DB Server組件叫優化器
優化器是建立在其所在的DB資源的基礎上而進行工作的
四 如何檢查執行計劃 如果你在使用的是Microsoft SQL Server
你可以使用Query Analyzer
簡單地輸入一個SQL語句並按Ctrl+L鍵
查詢將被圖形化的顯示出來:
負責處理或計算最優的執行計劃的DB Server組件叫優化器
優化器是建立在其所在的DB資源的基礎上而進行工作的
From:http://tw.wingwit.com/Article/program/Oracle/201311/16996.html