程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> DB2 優化器中針對 JOIN 語句的結果集估計(2)

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

編輯:DB2教程

創建測試表

我們創建以下測試表:

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. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved