青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Prayer

在一般中尋求卓越
posts - 1256, comments - 190, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理
http://istl.inspur.com/showart.asp?id=27

1、準備實驗環境

我們創建了一個模擬tpch(數據庫工業標準測試)測試的數據庫,庫中一共有3張數據表,分別是:

part      產品部件表

supplier 供應商表

partsupp 產品供應商關聯表

其中part表中含有200000條數據,partsupp表中含有800000條數據,supplier表中含有10000條數據

1) 我們為如上的3張表分別建立如下的索引:

create index part_idx1 on tpcd.part(p_partkey,p_size);

create index partsupp_idx1 on tpcd.partsupp(ps_partkey, ps_supplycost, ps_suppkey);

create index supp_idx1 on tpcd.supplier(s_suppkey);

 

 

2) 建立索引后,我們收集一下相關的統計信息,在db2cmd中執行如下的命令:

runstats on table tpcd.part with distribution and detailed indexes all;

runstats on table tpcd.partsupp with distribution and detailed indexes all;

runstats on table tpcd.supplier with distribution and detailed indexes all;

 

 

分別對PART, PARTSUPP, SUPPLIER運行以下命令,確保runstats已經成功執行:

db2 “select card,npages,stats_time from syscat.tables where tabname=’PART’”

 

CARD                 NPAGES               STATS_TIME

-------------------- -------------------- -----------------------------------------------------------

 200000                 7616               2008-08-21-17.20.22.828000

 

 

其中,CARD為該表的記錄數,NPAGES為該表所占有的存儲空間(頁數)STATS_TIME為收集統計信息的時間。

2、發現問題

1) 我們有如下的一個SQL語句:

 

select

    count(*)

from

         tpcd.part,

         tpcd.partsupp,

         tpcd.supplier

where

         p_partkey = ps_partkey

         and s_suppkey = ps_suppkey

    and p_size = 30

         and ps_suppkey = 9988@

 

 

目前,該SQL的運行速度不理想,我們希望通過調優提高這個SQL語句的執行效率。

首先,我們為了記錄這條查詢語句執行的時間,運行如下SQL文件,記錄一個時間:

文件名:lab.sql

values current timestamp@

 

select       

 count(*)

from

 tpcd.part,       

 tpcd.partsupp,        

 tpcd.supplier

where       

 p_partkey = ps_partkey 

 and s_suppkey = ps_suppkey       

 and p_size = 30     

 and ps_suppkey = 9988@

 

values current timestamp@

 

 

db2cmd中運行:

db2 -td@ -vf lab.sql

 

 

得到結果如下:

1

--------------------------

2009-01-04-15.09.25.281000

1 條記錄已選擇。

 

select count(*) from tpcd.part, tpcd.partsupp, tpcd.supplier where p_partkey = ps_partkey and s_suppkey = ps_suppkey an p_size = 30 and ps_suppkey = 9988

1

-----------

1

 1 條記錄已選擇。

 

values current timestamp

1

--------------------------

2009-01-04-15.09.33.359000

 

 1 條記錄已選擇。

 

 

通過前后時間對比,我們發現這個SQL運行了大約6秒鐘(不同的機器性能可能有差異)

3、分析問題

1) 為了了解這個SQL的執行過程,我們開始分析它的執行計劃,在db2cmd中運行:

db2expln -d tpcd -f lab.sql -t -z @ -g > lab-before.exp

 

可以用文本編輯器打開lab-before.exp,下面,我們詳細解讀其中的執行計劃:如圖1所示

 

 

分析:執行計劃是倒樹狀的結構,首先對part表、partsupp表和supplier表進行索引掃描,然后對partpartsupp表的索引掃描結果進行NLJOIN(嵌套循環連接),再將結果與supplier表的索引掃描結果進行HSJOINHASH連接),再進行排序,最后返回查詢結果。

其中黃色標記部分,我們發現執行part表的索引掃描花費較大(1261.42個單位),且掃描結果(3810行)與我們的最終期望結果(1)差距較大,執行NLJOIN的花費(7443.881261.4215.1451=6167.31個單位),因此我們認為這里partpartsupp表建立的索引是影響查詢效率的因素。

4、解決問題

1) 在仔細分析的問題之后,我們嘗試來解決這個問題,我們規劃了一個新的索引方案,我們建立新的索引:

drop index part_idx1;

create index part_idx1 on tpcd.part(p_size,p_partkey);

drop index partsupp_idx1;

create index partsupp_idx1 on tpcd.partsupp(ps_suppkey,ps_partkey, ps_supplycost );

drop index supp_idx1;

create index supp_idx1 on tpcd.supplier(s_suppkey);

 

 

我們改變了part表和partsupp表的索引順序

2) 建立索引后,我們再收集一下相關的統計信息,在db2cmd中執行如下的命令:

runstats on table tpcd.part with distribution and detailed indexes all;

runstats on table tpcd.partsupp with distribution and detailed indexes all;

runstats on table tpcd.supplier with distribution and detailed indexes all;

 

 

3) 下面,我們再執行一下原來的SQL,在db2cmd中執行:

db2 connect to tpcd

db2 –td@ -vf lab.sql

1

--------------------------

2009-01-04-16.02.45.078000

 1 條記錄已選擇。

 

select count(*) from tpcd.part, tpcd.partsupp, tpcd.supplier where p_partkey = ps_partkey and s_suppkey = ps_suppkey an p_size = 30 and ps_suppkey = 9988

1

-----------

1

 1 條記錄已選擇。

 

values current timestamp

1

--------------------------

2009-01-04-16.02.45.218000

 

 1 條記錄已選擇。

 

 

 

通過前后時間對比,我們發現這次,這個SQL運行時間在1秒之內 (不同的機器性能可能有差異)

4) 為了進一步分析這個SQL的執行過程,我們再分析一下SQL的執行計劃:

db2cmd中運行:

db2expln -d tpcd -f lab.sql -t -z @ -g > lab-after.exp

 

 

 

可以用文本編輯器打開lab-after.exp,下面,我們詳細解讀這個執行計劃,如圖2所示

 

從執行的總花費(84.817)上我們可以明顯的看到優化后的效果。

5、解決方案分析

我們來看實驗Sql語句的謂詞部分:

p_partkey = ps_partkey

   and s_suppkey = ps_suppkey

     and p_size = 30

         and ps_suppkey = 9988@

 

DB2sql優化器在執行查詢sql語句,根據謂詞進行表連接查詢,并不依賴于where條件中謂詞的順序,而是根據所建索引來進行先后順序的連接。

我們再來看優化前的索引:

create index part_idx1 on tpcd.part(p_partkey,p_size);

create index partsupp_idx1 on tpcd.partsupp(ps_partkey, ps_supplycost, ps_suppkey);

create index supp_idx1 on tpcd.supplier(s_suppkey);

 

1)我們目標是盡量增大第一次或前幾次join的數據量縮小幅度,所以首先要進行小表的索引掃描和連接。而這里,從業務角度來說,把業務主鍵放到索引的第一個位置是有意義的,但是對于優化器來說,這毫無意義。優化器會根據索引優化器會首先選擇謂詞:p_partkey = ps_partkey partpartsupp進行NLJOIN,而這兩個表是數據量相對大的表。

2NLJOIN中外表只掃描一次,內表掃描N次,所以內表要盡量的小一些。而這里的內表partsupp800000條數據。

我們期望優化器做如下處理:

1)優化器首先根據謂詞p_size = 30 ps_suppkey = 9988@進行索引掃描,縮小數據范圍。

2)優化器根據謂詞s_suppkey = ps_suppkeysupplierpartsupp進行表的NLJOIN。內表(partsupp)是數據量較小的一個表

所以,我們要將p_sizeps_suppkey的索引提前,建立如下索引

create index part_idx1 on tpcd.part(p_size,p_partkey);

create index partsupp_idx1 on tpcd.partsupp(ps_suppkey,ps_partkey, ps_supplycost );

create index supp_idx1 on tpcd.supplier(s_suppkey);

 

 

6、總結

使用db2expln解釋工具,能夠得到DB2 Sql優化器的詳細Sql執行計劃,通過其中的花費我們可以結合sql語句及表、索引、連接的結構進行分析,發現并定位問題,然后對sql進行改進,達到優化的目標。

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品乱码一区二三区小蝌蚪| 久久成人亚洲| 亚洲国产精品嫩草影院| 在线亚洲自拍| 欧美一区免费| 欧美成人三级在线| 欧美成人国产一区二区| 中日韩美女免费视频网址在线观看| 亚洲——在线| 欧美国产日本在线| 韩国成人精品a∨在线观看| 一本一本久久| 欧美成人综合在线| 午夜精品理论片| 欧美高清视频在线播放| 国产亚洲精品v| 亚洲无线一线二线三线区别av| 美女黄网久久| 亚洲一区日韩在线| 欧美高清在线精品一区| 在线观看视频免费一区二区三区| 最新中文字幕亚洲| 男女精品视频| 久久久久国产一区二区| 国产欧美综合在线| 亚洲欧美日韩中文在线制服| 99国产成+人+综合+亚洲欧美| 这里只有精品丝袜| 欧美日本网站| 一区二区国产在线观看| 亚洲第一黄网| 亚洲永久免费| 国产精品欧美激情| 亚洲一区二区三区777| 亚洲激情专区| 欧美精品一区二区精品网| 欧美视频在线视频| 国产伊人精品| 美女主播一区| 麻豆国产va免费精品高清在线| 亚洲女人天堂av| 免费成人av在线| 欧美三日本三级少妇三99| 国产一区二区三区免费在线观看| 午夜亚洲视频| 亚洲一区二区成人在线观看| 久久国内精品视频| 美国十次成人| 日韩视频在线观看一区二区| 亚洲人成人一区二区三区| 久久xxxx| 欧美成人午夜激情视频| 亚洲私人影吧| 久久久www成人免费无遮挡大片 | 国内综合精品午夜久久资源| 亚洲高清视频在线观看| 国产精品一区在线观看| 欧美大片在线看| 欧美一级片一区| 99精品国产高清一区二区| 久久高清国产| 亚洲性感美女99在线| 久久视频在线视频| 国产一区自拍视频| 亚洲午夜女主播在线直播| 亚洲黄色天堂| 久久精品国产77777蜜臀| 亚洲一区日韩在线| 亚洲精品一区二区三区樱花| 极品av少妇一区二区| 亚洲综合大片69999| 亚洲美女视频在线免费观看| 久久精品国产69国产精品亚洲 | 一区二区三区高清不卡| 久久久夜色精品亚洲| 午夜精品福利一区二区蜜股av| 免费在线成人av| 久久亚洲免费| 国产嫩草一区二区三区在线观看| 亚洲精品日韩在线观看| 亚洲成人在线网站| 久久精品国产精品亚洲| 欧美一区二区三区免费大片| 欧美日韩伦理在线| 亚洲国产91| 亚洲精品国产精品国自产观看| 久久精品国产99精品国产亚洲性色 | 欧美国产日韩一区二区在线观看 | 日韩亚洲欧美在线观看| 久久天堂精品| 乱人伦精品视频在线观看| 国产欧美日韩高清| 亚洲永久免费精品| 欧美亚洲免费高清在线观看| 国产精品国产三级国产aⅴ浪潮| 亚洲剧情一区二区| 9久re热视频在线精品| 欧美精品电影| 亚洲免费黄色| 亚洲天堂av图片| 国产精品h在线观看| 一区二区三区你懂的| 亚洲欧美一区二区精品久久久| 国产精品久久国产愉拍 | 性欧美暴力猛交另类hd| 久久久国产精品一区| 韩国av一区二区| 久久久水蜜桃| 亚洲国产精品久久91精品| 亚洲精品一区二| 欧美性视频网站| 欧美亚洲一级片| 欧美jizz19性欧美| 99国产精品一区| 国产精品久久久久毛片软件| 午夜在线观看欧美| 欧美成人dvd在线视频| 亚洲免费观看高清完整版在线观看熊| 欧美人成在线| 午夜精品久久久久久久99水蜜桃 | 日韩午夜免费| 国产精品福利av| 香蕉亚洲视频| 亚洲第一网站| 亚洲一区二区三区四区五区黄| 国产精品专区第二| 久久精品99国产精品| 亚洲大片在线观看| 亚洲欧美激情视频| 黄色国产精品一区二区三区| 欧美精品九九99久久| 亚洲女同在线| 欧美国产欧美亚洲国产日韩mv天天看完整 | 欧美日韩蜜桃| 性欧美videos另类喷潮| 国产日韩精品在线| 午夜精品久久99蜜桃的功能介绍| 欧美一区二区精品| 亚洲电影免费观看高清完整版在线观看 | 夜夜爽www精品| 国产欧美一区二区视频| 欧美精品一区在线播放| 欧美一区三区三区高中清蜜桃| 亚洲黄一区二区| 久久国产加勒比精品无码| 亚洲美女在线国产| 国产一区视频网站| 国产精品久久夜| 欧美精品www| 美国三级日本三级久久99| 亚洲免费人成在线视频观看| 亚洲激情女人| 免费成人在线观看视频| 亚洲免费视频网站| 亚洲精品欧美激情| 伊人狠狠色j香婷婷综合| 国产精品永久| 欧美午夜不卡视频| 欧美激情欧美狂野欧美精品| 欧美中文字幕| 午夜精品久久久久久久| 亚洲视频免费观看| 一本久久a久久精品亚洲| 亚洲第一视频| 欧美激情精品久久久久久免费印度 | 在线欧美三区| 国产综合第一页| 国产精品最新自拍| 国产精品乱码一区二区三区| 欧美日韩精品欧美日韩精品 | 久久久久久九九九九| 亚洲一区二区三区欧美| 一本色道久久综合狠狠躁篇怎么玩 | 亚洲精品一区二区三区樱花| 好看不卡的中文字幕| 国产欧美一区二区三区视频| 国产精品乱人伦中文| 欧美偷拍另类| 欧美日韩一区在线播放| 欧美日韩一区二区精品| 欧美日韩免费高清一区色橹橹| 欧美激情精品久久久久久大尺度 | 国产欧美综合一区二区三区| 国产精品午夜av在线| 国产精品国产自产拍高清av王其 | 欧美激情综合| 亚洲国产成人精品女人久久久| 久久久久这里只有精品| 欧美一区二区在线免费观看| 亚洲欧美精品中文字幕在线| 亚洲欧美视频在线| 亚洲欧美日本国产专区一区| 亚洲欧美日韩一区| 欧美一进一出视频| 久久成人av少妇免费| 久久综合影视| 亚洲国产精品久久久久秋霞蜜臀 | 欧美成人午夜激情| 亚洲人成在线播放| 亚洲一区二区三区在线|