成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

DB2 優化器中針對 JOIN 語句的結果集估計

數據庫
我們大家都知道DB2 優化器在為 SQL 語句生成執行計劃時,都會對每個步驟產生的結果集大小進行估計,這就是優化器的基估計。

在所有 SQL 語句基估計過程中,以 JOIN 語句的計算過程最復雜,而 JOIN 語句恰恰是進行性能優化的重點。本文主要關注的是 DB2 優化器在進行基估計時采用的相關計算方法、輸入等。

簡介

優化器是 DB2 的心臟和靈魂(可以把它類比成寶馬 730 或波音 747 的發動機引擎一樣)。它分析 SQL 語句并確定可以滿足每條語句的最有效的存取路徑。 DB2 SQL 優化器可以估計每個備選訪問計劃的執行成本,并根據其估計結果選擇一個最佳訪問計劃。

在優化器在優化一個 SQL 語句的過程中使用到兩個非常重要的概念:selectivity 和 cardinality 。 selectivity 是指一個 SQL 操作的得出結果集占原來結果集的百分比,而 cardinality 就是指一個 SQL 操作的得出結果集的行數。

為正確地確定每種訪問計劃的成本,DB2 優化器都會對每個步驟產生的結果集大小即返回的行數進行估計,這就是優化器的基估計。 DB2 優化器需要準確的基數估計值?;鶖倒烙嬍沁@樣一種過程:在應用了謂詞或執行了聚集之后,優化器使用統計信息確定部分查詢結果的大小。對于訪問計劃的每個操作符,優化器將估計該操作符的基數輸出。一個或更多謂詞的應用可以減少輸出流基數。

JOIN 謂詞

當我們在 SQL 里面需要對多個表進行 join 的時候,DB2 會首先選擇其中的 2 個表進行 join,并獲取到一個中間的結果集,然后 DB2 可能會用這個中間的結果集和第三個表做 join,再次獲得中間的結果集(當然也可能是把另外 2 個表做 join,然后把兩個中間的結果集進行 join 操作),不管是怎么操作,DB2 一次能夠 join 的表的個數肯定是兩個。因此當優化器在考慮 Join 如何處理的時候,join 的順序就是一個很重要的問題,因為我們總是希望能夠在最開始就把結果集控制的盡量小。

一個 JOIN 謂詞一般描述如下所示:

  1. T1.joincol=T2.joincol 

在實際應用過程中,Where 子句中除 JOIN 謂詞外,一般都還有本地謂詞,形式如下:

  1. T1.joincol=T2.joincol and T1.filter=literal_1 and T2.filter=literal_2 

謂詞 T1.filter=literal_1 用于對 T1 表進行過來,T2.filter=literal_2 用于多 T2 表進行過濾,然后兩個經過過濾的表進行 JOIN 操作。至于 JOIN 采用 hash join 還是 Merge Join 或者 NestLoop Join 取決于 DB2 的優化級別、參數設置以及成本估計。

DB2 Join 謂詞選擇性計算公式如下:

  1. Selectivity (T1.y = T2.y)= 1/max(colcard(T1. joincol), colcard(T2. joincol)) 

其中,colcard(T1. joincol) 指 T1 表 joincol 列的不同值的個數,colcard(T2. joincol) 指 T2 表 joincol 列的不同值的個數,兩者取較大的一個作為 Join 謂詞計算依據。此公式存在兩個假設:

包含性,即 T2. joincol 的所有取值都在 T1 joincol 取值范圍內,反之也行。

均衡性,即兩個連接列上的數據分布均勻。

DB2 優化器中針對 JOIN 語句的結果集估計

作者: 駱洪青,  出處:IT專家網論壇, 責任編輯: 陳子琪, 2009-06-24 07:00

DB2 優化器在為 SQL 語句生成執行計劃時,都會對每個步驟產生的結果集大小進行估計,這就是DB2 優化器的基估計。在所有 SQL 語句基估計過程中,以 JOIN 語句的計算過程最復雜,而 JOIN 語句恰恰是進行性能優化的重點。

DB2 Join 謂詞基估計計算公式如下:

  1. Join Cardinality =Join Selectivity *   
  2. filtered cardinality(t1) *   
  3. filtered cardinality(t2)  

其中 filtered cardinality(t1) 是在 T1 表上應用本地謂詞后獲得結果集,filtered cardinality(t2) 是在 T2 表上應用本地謂詞后獲得結果集。

示例#p#

創建測試表

我們創建以下測試表:

T1 表擁有 10000 行數據。參加進行 JOIN 操作的列 join1 數據均勻分布,取值范圍在 0 ~ 29 之間,沒有空值。對 T1 進行過濾的列 filter1 數據也均勻分布,取值在在 0 ~ 24 之間。 V1 列從 0 自然增長到 9999 。

T2 表擁有 10000 行數據。參加進行 JOIN 操作的列 join2 數據均勻分布,取值范圍在 0 ~ 29 之間,沒有空值。對 T2 進行過濾的列 filte2r 數據也均勻分布,取值在在 0 ~ 24 之間。 V2 列從 0 自然增長到 9999 。

  1. drop table db2inst1.t1;   
  2. CREATE TABLE db2inst1.t1   
  3. ( Filter1 int, join1 int , v1 int, padding1 char(1)   
  4. )   
  5. NOT LOGGED INITIALLY   
  6. ;   
  7. INSERT INTO db2inst1.t1 (filter1, join1, v1,padding1)   
  8. WITH TEMP (COUNTER, filter1, join1, v1,padding1) AS   
  9. ( VALUES (0, MOD(INT(RAND() * 1000), 25),MOD(INT(RAND() * 1000), 30), 0, 'A')   
  10. UNION ALL SELECT (COUNTER + 1),MOD(INT(RAND() * 1000), 25),   
  11. MOD(INT(RAND() * 1000), 30), (COUNTER + 1), 'A' FROM TEMP WHERE (COUNTER + 1) < 10000   
  12. )   
  13. SELECT Filter1, join1, v1,padding1   
  14. FROM TEMP   
  15. ;   
  16. drop table db2inst1.t2;   
  17. CREATE TABLE db2inst1.t2   
  18. ( Filter2 int, Join2 int , V2 int, Padding2 char(1)   
  19. )   
  20. NOT LOGGED INITIALLY   
  21. ;   
  22. INSERT INTO db2inst1.t2 (filter2, join2, v2,padding2)   
  23. WITH TEMP (COUNTER, filter2, join2, v2,padding2) AS   
  24. ( VALUES (0, MOD(INT(RAND() * 1000), 50),MOD(INT(RAND() * 1000), 40), 0, 'A')   
  25. UNION ALL SELECT (COUNTER + 1),MOD(INT(RAND() * 1000), 50),MOD(INT(RAND() * 1000), 40),   
  26. (COUNTER + 1), 'A' FROM TEMP WHERE (COUNTER + 1) < 10000   
  27. )   
  28. SELECT Filter2, join2, v2,padding2   
  29. FROM TEMP   
  30. ;  

在表創建完成后,我們收集 T1 和 T2 的統計信息,在收集統計信息是只包括表的基本統計和列的統計信息,不包括列的分布信息。

  1. db2 "runstats on table db2inst1.t1 on all COLUMNS "   
  2. db2 "runstats on table db2inst1.t2 on all COLUMNS "  

使用 db2look 從系統統計視圖中提取 T1、T2 的統計信息如下。

表 1. T1 統計信息

統計屬性 值 說明

表 CARD 10000 表的行數

表 NPAGES 68 表占用的頁面數

列 FILTER1 的 COLCARD 25 列的不同取值個數

列 FILTER1 的 NUMNULLS 0 列的空值行數

列 JOIN1 的 COLCARD 30 列的不同取值個數

列 JOIN1 的 NUMNULLS 0 列的空值行數

表 2. T2 統計信息

統計屬性 值 說明

表 CARD 10000 表的行數

表 NPAGES 68 表占用的頁面數

列 FILTER2 的 COLCARD 50 列的不同取值個數

列 FILTER2 的 NUMNULLS 0 列的空值行數

列 JOIN2 的 COLCARD 40 列的不同取值個數

列 JOIN2 的 NUMNULLS 0 列的空值行數

測試一

我們首先執行以下查詢來驗證公式。

  1. select count(*)   
  2. from (   
  3. select   
  4. t1.v1, t2.v1   
  5. from   
  6. t1,   
  7. t2   
  8. where   
  9. t1.filter = 1   
  10. and t2.join1 = t1.join1   
  11. and t2.filter = 1 )   
  12. as b;  

在表創建完成后,我們收集 T1 和 T2 的統計信息,在收集統計信息是只包括表的基本統計和列的統計信息,不包括列的分布信息。

  1. db2 "runstats on table db2inst1.t1 on all COLUMNS "   
  2. db2 "runstats on table db2inst1.t2 on all COLUMNS "  

使用 db2look 從系統統計視圖中提取 T1、T2 的統計信息如下。

表 1. T1 統計信息

統計屬性 值 說明

表 CARD 10000 表的行數

表 NPAGES 68 表占用的頁面數

列 FILTER1 的 COLCARD 25 列的不同取值個數

列 FILTER1 的 NUMNULLS 0 列的空值行數

列 JOIN1 的 COLCARD 30 列的不同取值個數

列 JOIN1 的 NUMNULLS 0 列的空值行數

表 2. T2 統計信息

統計屬性 值 說明

表 CARD 10000 表的行數

表 NPAGES 68 表占用的頁面數

列 FILTER2 的 COLCARD 50 列的不同取值個數

列 FILTER2 的 NUMNULLS 0 列的空值行數

列 JOIN2 的 COLCARD 40 列的不同取值個數

列 JOIN2 的 NUMNULLS 0 列的空值行數

測試一

我們首先執行以下查詢來驗證公式。

  1. select count(*)   
  2. from (   
  3. select   
  4. t1.v1, t2.v1   
  5. from   
  6. t1,   
  7. t2   
  8. where   
  9. t1.filter = 1   
  10. and t2.join1 = t1.join1   
  11. and t2.filter = 1 )   
  12. as b;  

以上的相關內容就是對DB2 優化器中針對 JOIN 語句的結果集估計的介紹,望你能有所收獲。

【編輯推薦】

  1. shell抽取db2數據庫數據的方法示例
  2. DB2數據庫日志文件進行歸檔的問題分析
  3. DB2數據庫的安裝目錄結構介紹
  4. DB2數據庫性能調整的命令介紹
  5. DB2數據庫開發常見問題解答
責任編輯:佚名 來源: aa25.cn
相關推薦

2010-08-10 17:33:42

DB2 優化器

2010-11-04 15:39:40

DB2 SQL語句

2010-08-31 15:08:14

DB2INSERT優化

2010-09-06 15:13:05

DB2

2010-11-04 11:17:42

DB2 Merge語句

2010-11-01 11:13:57

DB2表管理

2010-08-19 14:54:07

DB2 優化器

2011-03-21 09:51:04

DB2性能優化

2010-08-17 16:13:32

DB2 并行版本

2010-09-30 16:46:11

DB2操作語句

2010-11-04 11:39:47

2011-05-27 16:00:10

DB2

2010-11-04 15:34:20

DB2索引優化

2011-01-20 10:15:22

ibmdwDB2

2010-11-02 15:36:18

DB2建表語句

2011-05-27 14:28:33

DB2

2011-05-27 15:24:28

DB2

2012-08-01 14:23:35

IBMdW

2010-08-17 17:29:06

DB2性能優化

2010-08-31 10:20:10

DB2MSCS集群
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产一二三区免费视频 | 69av片| 伊人导航| h免费观看 | 日韩中文字幕免费在线观看 | 91视频国产区| 不卡视频在线 | 天天久久| 91综合网 | 欧美日韩中文国产一区发布 | www.日本三级| 99视频在线播放 | 欧美日韩一区二区三区不卡视频 | 国产精品久久久亚洲 | 久久国产精品一区二区三区 | 久久99视频这里只有精品 | 99re国产视频| 色橹橹欧美在线观看视频高清 | 亚洲一区国产精品 | 一级片av | 在线播放国产一区二区三区 | 国产精品一区在线播放 | 在线免费观看视频黄 | 欧美不卡一区二区 | 亚洲精品成人在线 | 天天操天天干天天曰 | 国产一区高清 | 大学生a级毛片免费视频 | 在线色网| 中文av字幕| 日韩在线资源 | 国产精品亚洲综合 | 日日夜夜精品 | 国产一级片av | 先锋资源站 | 91精品欧美久久久久久久 | 欧美看片 | 国产永久免费 | 亚洲综合无码一区二区 | 欧美日韩18 | 国产成人黄色 |