熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

SQL 調試指南 - 數據庫執行計劃(圖)

2013-11-13 15:36:33  來源: Oracle 

  一 概述
  
  我的工作是開發移動電信操作系統 當客戶通過網絡或語音終端申請一項服務的時候 我們的系統必須提供一個快速的回應 即使是要求不到一秒的回答時限 我們仍然需要在容量巨大的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[CUSTOMERSLAST_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
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.