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

DB2中的終極SQL性能調節技術

2013-11-15 14:31:11  來源: DB2 

  使用針對工作負載的正確的性能調節技術以避免硬件升級和優化DB性能

  性能通過響應時間吞吐量峰值響應時間命中和每秒會話來衡量SQL編碼和調節技術直接影響性能開發高性能的DB應用需要對DB技術的深入了解

  當然在小數據量時這些技術無足輕重忽略的連接子查詢表的表達式和CASE表達式的程序完全可以在輕量級負載下工作的很好使用%的SELECT INFO語句來進行數據獲取的程序在開始會非常的迅速但是一旦數據量和會話速度增加性能將受到很大影響DB的可擴展性需要小的優化的SQL加上方案設計性能結構緩沖池和針對工作負載模式優化的存儲另外的方案就是升級硬件了當然對於有著硬件升級的無盡預算的人來說不用閱讀本文了對於其他人我將講解如何編碼聰明的SQL以及調優的訪問路徑

  指針對於DB性能的影響

  曾經有段時間在一個大的復雜的銀行應用程序中存在著一個批處理程序這個新的批處理程序和訪問路徑被通過代碼走查的方式檢查過了因為項目截止日期的原因測試很少;在實際的首次運行中程序在運行個小時之後終止了一個很慢的代碼走查之後發現了個指針每個指針訪問一個不同的表中的數據每個指針在其他打開的指針的循環中被打開在彼此間傳遞數據也就是說這個程序在DB以外竟然結合了個表這不是聰明的SQL這個信息需要進入到個表;然而每個指針只能進入一個因此個指針被合並為一個聰明的指針

  這個批處理在第二天用了四分鐘就完成了大多數人可能會結束這個成功的任務了但是務實的人不會一個緩慢的EXPLAIN信息走查發現了一個有趣的表連接序列問題優化器選擇了開始個表的復雜的循環連接還使用了一系列的大的數據表(ADDR和NAME)它們每個都包含千萬行數據這不是DB優化器的典型行為然而有一些使用<>比較小表之間列的連接情況這些比較對於優化器來說很難估計因為DB catalog包含了相等列而非不等列這裡就需要訪問路徑優化了DB優化者腦中肯定有多種推薦的解決方案一些可以在包或語句層次上另外的一些工作在謂詞層次當然還有其他一些傳統方式不奏效情況下的終極技術一個要求就是如下的性能調節技術提供給你的catalog以足夠的統計使用統計向導來保證優化器有關於你的數據的精確全景

  DB性能調節技術

  包級別的SQL調優——需要REOPT(ONCE/ALWAYS/AUTO) BIND選項這個語句通告優化器來在運行時重新優化包中的每個語句至少ONCE或者ALWAYS(每次執行)在DB 中可以AUTO(需要時)這項技術的開銷由選擇的選項和SQL語句的數量及復雜性決定這些開銷在批處理程序中可以忽略不計但是在短期運行的交易中會有很大影響在我們的例子中批處理程序指針只有一個謂詞和一個基數為的主機變量REOPT是一個調節選項用來優化非統一列值分布和主機變量內容高可變的情況是COLCARDF=的反面包級別的調節並不合適

  語句級別的調節技術——包括OPTIMIZE FOR n ROWS和FETCH FIRST n ROWS ONLY這些語句放在SELECT語句末尾是在不需要結果集的情況下進行優化的優化器假設除了這些語句的所有的SELECT語句需要整個結果這些結果偏向於諸如數序和表預取的訪問路徑因為我們的批處理指針一定需要整個結果因此語句級別的調節也不是合適的技術

  謂詞界別的調節技術——包括增加一個假的過濾器(TXCX=TXCX)或增加一個空操作到謂詞上(+/* CONCAT )一個假的過濾器能夠通過減少總過濾器因素(表中滿足資格的行的比例)改變優化器這個方法能夠改變表連接的順序索引選擇和連接方法多個假過濾器是允許的但是必須在沒有引用過的一列上空操作(no op)能夠通過降級一個過濾器從符合到不符合來改變優化器的工作方式但是只在z/OS上有用LUW優化器卻不受其影響這個改變也會影響一個表連接序列索引選擇和連接方法謂詞級別的技術可以被一起使用來獲取想要的結果我們例子中的指針對多個謂詞級別調節的結合不起反應因此是采用重武器的時候了

  一些終極調節技術包括使用DISTINCE的表的表達式和其他終極跨查詢的塊優化方法這些技術要求手動查詢重寫它們強制使得優化器以一個指定順序的方式執行查詢塊使用這些技術視需要終極提醒的因為他們能把表連接序列索引選擇和連接方法從好改到壞DISTINCE表表達式強制優化器優先於其他查詢塊執行圓括號中的查詢如果SELECT DISTINCE中指定的列引用了不同的表表表達式可以被實例化為唯一的以供排序我們的批處理指針有一個非優化的連接序列使用該技術得到如下查詢

  這樣的查詢重寫迫使優化器通過T連接表T來連接ADDR和NAME如果關鍵字DISTINCT在上例中省略了DB優化器合並表表達式查詢和輸出查詢這樣就和原來的語句和連接序列一樣了SELECT DISTINCT是一個關鍵的組件然而因為列列表跨越了多個表臨時的個表連接結果實例為一個唯一的工作文件以供排序排序的開銷平均在每次執行幾千行這是可以忽略的負載批處理程序現在可以在兩分鐘之內完成任務了

  更多未來的調節技術

  其他的一些查詢重寫技術從全異的查詢塊中獲取信息以重寫查詢IBM曾經將此技術成為跨查詢塊優化;DB 中被成為全局優化一個好消息就是這項技術開始在DB優化器的自我查詢重寫(QWR)階段中出現了所有DB查詢都能使用它也是指日可待了同時我們也需要將一些終極方法掌握在自己的手裡


From:http://tw.wingwit.com/Article/program/DB2/201311/21936.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.