小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

理解DB2中的列組統(tǒng)計信息

 WindySky 2007-11-14
使用 IBM DB2® for Linux®,UNIX®,and Windows® (DB2)中的列組統(tǒng)計信息,當(dāng)多個等式本地謂詞或等式連接謂詞互相關(guān)聯(lián)時,優(yōu)化器可以確定一個更好的查詢訪問計劃,并且改善查詢性能。本文將介紹如何使用列組統(tǒng)計信息。

簡介

DB2 SQL 優(yōu)化器(后文簡稱為優(yōu)化器)可以估計每個備選訪問計劃的執(zhí)行成本,并根據(jù)其估計結(jié)果選擇一個最佳訪問計劃。一個訪問計劃可以指定用來解析一條 SQL 語句的操作次序。

為正確地確定每種訪問計劃的成本,DB2 優(yōu)化器需要準(zhǔn)確的基數(shù)估計值?;鶖?shù)估計是這樣一種過程:在應(yīng)用了謂詞或執(zhí)行了聚集之后,優(yōu)化器使用統(tǒng)計信息確定部分查詢結(jié)果的大小。對于訪問計劃的每個操作符,優(yōu)化器將估計該操作符的基數(shù)輸出。一個或更多謂詞的應(yīng)用可以減少輸出流基數(shù)。

在計算謂詞對于基數(shù)估計值的組合過濾效果時,通常會假設(shè)這些謂詞彼此之間是獨立的。然而,這些謂詞可以在統(tǒng)計方面彼此關(guān)聯(lián)。單獨地處理它們通常會導(dǎo)致優(yōu)化器低估基數(shù)值。而基數(shù)值的低估又會導(dǎo)致優(yōu)化器選擇一個次優(yōu)的訪問計劃。

對于至少應(yīng)用了至少兩個本地等式謂詞的 SQL 語句,優(yōu)化器將考慮使用多列統(tǒng)計信息來檢測統(tǒng)計關(guān)聯(lián),并更加準(zhǔn)確地估計多個謂詞組合的過濾效果。同樣對于連接兩個或更多表的 SQL 語句,以及在一對表間至少使用了兩個等式連接謂詞的連接,優(yōu)化器也會使用多列統(tǒng)計信息。

一個本地等式謂詞是一個應(yīng)用于單個表的等式謂詞,其描述如下所示:

COLUMN = literal

其中 literal 可以是以下任一內(nèi)容:

  • 一個常量值;
  • 一個參數(shù)標(biāo)記或一個主變量;
  • 一個專用寄存器(例如,CURRENT DATE)

一個等式連接謂詞的描述如下所示,它用于表 1 和表 2 間的連接:

T1.COLUMN = T2.COLUMN

DB2 V8.2 使用下面的多列統(tǒng)計信息:

  • 索引 keycard 統(tǒng)計信息:FIRST2KEYCARD、FIRST3KEYCARD、FIRST4KEYCARD 和 FULLKEYCARD
  • 列組統(tǒng)計信息:列組基數(shù)值

這些統(tǒng)計信息描述了包含兩個或更多列的列集中不同分組的數(shù)量。

在 DB2 V8.2 出現(xiàn)之前,只能使用索引 keycard 統(tǒng)計信息,并且要受下列條件約束:

  • 索引必須是完全限定的。如果鍵中的所有列都可以被等式謂詞 引用(連接謂詞或本地謂詞,但不是兩者的混合),那么這個索引就是完全限定的。
  • 對于連接謂詞,索引也必須是惟一的。

在 DB2 V8.2 中,通過考慮到所有索引 keycard 統(tǒng)計信息而不要求索引完全限定,DB2 SQL 優(yōu)化器進(jìn)一步擴(kuò)展了多列統(tǒng)計信息的使用。它還考慮到了用戶收集的任何列組統(tǒng)計信息。本文討論了優(yōu)化器如何利用這些統(tǒng)計信息,以及用戶如何識別要收集的列組統(tǒng)計信息。

9W9itug
9W9itug

多個本地等式謂詞的統(tǒng)計相關(guān)性

DB2 SQL 優(yōu)化器試圖檢測多個本地等式謂詞間的統(tǒng)計相關(guān)性。

示例 1:假設(shè)有一個表 SHOW_LISTINGS,它包含如下列:

9W9itug
表 1. SHOW_LISTINGS 表的描述9W9itug

列名 描述
SHOW_ID 表外鍵,包含關(guān)于各演出清單的信息
CHANNEL_ID 表外鍵,包含關(guān)于播放演出的每個頻道的信息
STATION_ID 表外鍵,包含和頻道相關(guān)的每個電視臺的信息
CITY_ID 表外鍵,包含關(guān)于上演該演出的每個城市的信息
DAY 演出播放的日期
TIME 演出播放的當(dāng)天的時間
<other columns> 描述了演出清單的其他屬性

由于演出只在某個電視臺的某個頻道播出,在一天的特定時間內(nèi),這些列(SHOW_ID,CHANNEL_ID,STATION_ID 和 TIME)彼此之間不是互相獨立的。DAY 列獨立于 TIME 列,但是它不獨立于所有演出清單的 SHOW_ID。

設(shè)想一條應(yīng)用了以下謂詞的 SQL 語句:

P1: SHOW_ID = ?
            P2: CHANNEL_ID = ?
            P3: STATION_ID = ?
            P4: TIME = ?
            
9W9itug

如果存在這樣一個索引,其中的鍵包含謂詞 P1-P4 引用的所有列,或者鍵中的前四列包含所引用的列,優(yōu)化器將使用 FIRST4KEYCARD 索引統(tǒng)計信息(如果收集了索引統(tǒng)計信息的話),來檢測謂詞 P1-P4 之間的統(tǒng)計相關(guān)性。在應(yīng)用了這四個謂詞之后,優(yōu)化器將計算一個更準(zhǔn)確的基數(shù)估計值。例如,下面的任何一個索引可以用來檢測這四個謂詞間的統(tǒng)計相關(guān)性:

IX1 ON SHOW_LISTINGS(SHOW_ID, CHANNEL_ID, STATION_ID, TIME)
            IX2 ON SHOW_LISTINGS(SHOW_ID, CHANNEL_ID, STATION_ID, TIME, CITY_ID)
            IX3 ON SHOW_LISTINGS(SHOW_ID, CHANNEL_ID, STATION_ID, TIME, DAY, CITY_ID)
            
9W9itug

優(yōu)化器使用 IX1 的 FULLKEYCARD 和 FIRST4KEYCARD 統(tǒng)計信息來檢測所有四個謂詞的相關(guān)性。類似地,它也可以使用 IX2 和 IX3 的 FIRST4KEYCARD。

不能使用如下所示的索引:

IX4 ON SHOW_LISTINGS(CITY_ID, SHOW_ID, CHANNEL_ID, STATION_ID, TIME)
            
9W9itug

由于每個 keycard 統(tǒng)計信息都將包含 CITY_ID 列,因此該列上未定義本地等式謂詞。

如果不存在具有所需鍵的索引,那么可以在 SHOW_ID、CHANNEL_ID、STATION_ID 和 TIME 上收集列組統(tǒng)計信息。優(yōu)化器使用這些列組統(tǒng)計信息,運用與處理索引的 FIRST4KEYCARD 統(tǒng)計信息相同的方式檢測這四個謂詞間的統(tǒng)計相關(guān)性。

DB2 優(yōu)化器同樣也會考慮具有謂詞子集的索引或者列組統(tǒng)計信息。例如,看下面所示的索引:

IX5 ON SHOW_LISTINGS(SHOW_ID, STATION_ID, CITY_ID, CHANNEL_ID)
            
9W9itug

該索引不能使用 FIRST2KEYCARD 來檢測謂詞 P1 和 P3 的統(tǒng)計相關(guān)性。盡管只是部分糾正了謂詞 P1-P4 間的統(tǒng)計相關(guān)性,但已足以允許優(yōu)化器選擇一個優(yōu)秀的查詢執(zhí)行計劃。此外,盡管索引 IX5 中的完整鍵包含 CHANNEL_ID 列,仍然不能使用 FULLKEYCARD 統(tǒng)計信息來檢測與 P2 的相關(guān)性,因為它包含的 CITY_ID 列沒有在謂詞中引用。

9W9itug
9W9itug

多個等式連接謂詞的統(tǒng)計相關(guān)性

DB2 SQL 優(yōu)化器同樣嘗試檢測兩個表中的多個等式連接謂詞間的統(tǒng)計相關(guān)性。

示例 2:考慮示例 1 中描述的 SHOW_LISTINGS 表,另外,RATINGS 表包含如下列:

9W9itug
表 2. RATINGS 表的描述9W9itug

列名 描述
SHOW_ID 表外鍵,包含關(guān)于各演出清單的信息
CHANNEL_ID 表外鍵,包含關(guān)于播放演出的每個頻道的信息
STATION_ID 表外鍵,包含和頻道相關(guān)的每個電視臺的信息
CITY_ID 表外鍵,包含關(guān)于上演該演出的每個城市的信息
DAY 播放演出的日期
TIME 播放演出的時間
RATING 在一天的某個時間,在特定城市中,某個電視臺頻道的演出清單的收視率

RATINGS 表包含描述不同城市演出清單的收視率信息,用戶可能需要查詢 RATINGS 表和 SHOW_LISTINGS 表的連接以檢索這兩個表的屬性。一個查詢在該連接上應(yīng)用的謂詞集包含以下內(nèi)容:

P1: SHOW_LISTINGS.SHOW_ID = RATINGS.SHOW_ID
            P2: SHOW_LISTINGS.CHANNEL_ID = RATINGS.CHANNEL_ID
            P3: SHOW_LISTINGS.STATION_ID = RATINGS.STATION_ID
            
9W9itug

P1-P3 這三個謂詞可能不是互相獨立的;優(yōu)化器試圖使用任何可用的多列統(tǒng)計信息來檢測謂詞之間的相關(guān)性。

優(yōu)化器只能檢測和說明每一對連接表上的多個連接謂詞間的統(tǒng)計相關(guān)性。例如,如果一條 SQL 語句包含如下謂詞:

P1: T1.A = T2.A
            P2: T1.B = T2.B
            P3: T1.C = T3.C
            
9W9itug

優(yōu)化器只嘗試檢測 P1 和 P2 間的統(tǒng)計相關(guān)性,因為它們只應(yīng)用于相同的兩個表的連接,T1 和 T2。P3 應(yīng)用于 T1 和 T2 的連接;那是一個不同的連接。如果添加了第四個謂詞,例如:

P4: T1.D = T2.D
            
9W9itug

優(yōu)化器將進(jìn)一步嘗試檢測 P3 和 P4 間的統(tǒng)計相關(guān)性。

為了說明等式連接謂詞間的統(tǒng)計相關(guān)性,優(yōu)化器使用連接所涉及的兩表之一的多列統(tǒng)計信息;這個表被視為連接的父表。因此只需要在連接的父表中收集列組統(tǒng)計信息。連接的另一個表被指定為子表。如果父表不能確定,那么優(yōu)化器就不能使用多列統(tǒng)計信息來檢測連接謂詞間的統(tǒng)計相關(guān)性。

附錄 B 提供了優(yōu)化器如何確定兩個連接表中的父表和子表的具體示例和描述。對連接中的父表進(jìn)行標(biāo)識,或者判斷連接中是否有父表,這對于避免收集無用的列組統(tǒng)計信息是非常有用的。如果尚無合適的索引可用,那么在連接中的每個表上收集列組統(tǒng)計信息即可。

9W9itug
9W9itug

收集多列統(tǒng)計信息

優(yōu)化器考慮使用所有可用的索引 keycard 統(tǒng)計信息。如果具有統(tǒng)計相關(guān)性的謂詞所引用的列集中,索引 keycard 統(tǒng)計信息不可用,可以使用 RUNSTATS 命令收集列組統(tǒng)計信息。下面是從 DB2 V82 提取的語法。

注意:對于 DB2 9,請在 Info Center 的 DB2 9 文檔中查看語法。.

			>>-RUNSTATS--ON TABLE--table name--+-USE PROFILE------------+--->
            '-| Statistics Options |-'
            Statistics Options:
            .-ALLOW WRITE ACCESS-.
            |--+--------------------------+--+--------------------+--------->
            '-| Table Object Options |-'  '-ALLOW READ ACCESS--'
            Table Object Options:
            |--+-FOR--| Index Clause |----------------------------------+---|
            '-+-------------------------+--+-----------------------+-'
            '-| Column Stats Clause |-'  '-AND--| Index Clause |-'
            Column Stats Clause:
            |--+-ON--| Cols Clause |------------------------------+---------|
            '-+---------------------+--| Distribution Clause |-'
            '-ON--| Cols Clause |-'
            On Cols Clause:
            .-ON ALL COLUMNS-------------------------------------------------.
            |                                           .-,-------------.    |
            |                                           V               |    |
            |--+-ON--+----------------------+--COLUMNS--(----Column Option-+--)-+--|
            |     '-+-ALL-+--COLUMNS AND-'                                      |
            |       '-KEY-'                                                  |
            '-ON KEY COLUMNS-------------------------------------------------'
            
9W9itug

“ON COLUMNS” 子句允許您指定一個列的列表,為它們收集統(tǒng)計信息。如果您指定了一組列,則會收集該組中惟一值的數(shù)量。未列出的列的統(tǒng)計信息非常明確。您可以在 “on-cols-clause” 和 “on-dist-cols-clause” 中使用這個子句。

注意:目前還不支持為一組列收集分布統(tǒng)計信息。

注意:如果啟用了 automatic runstats 并使用 RUNSTATS 命令收集了列組統(tǒng)計信息,automatic runstats 將覆蓋這些統(tǒng)計信息,并丟棄列組統(tǒng)計信息。

AUTO_RUNSTATS 數(shù)據(jù)庫配置設(shè)置表明是否啟用了 automatic runstats:

Automatic runstats (AUTO_RUNSTATS)=ON
            
9W9itug

如果設(shè)置為 “ON”,則啟用 automatic runstats。

AUTO_RUNSTATS 默認(rèn)情況下使用 “具有所有分布和示例的詳細(xì)索引” 的 RUNSTATS 選項。

您可以使用統(tǒng)計信息配置文件來覆蓋默認(rèn)的 RUNSTATS 選項。您可以將希望收集的任意列組統(tǒng)計信息添加到此配置文件中,以避免 automatic runstats 覆蓋它們。

統(tǒng)計信息配置文件” 提供了關(guān)于統(tǒng)計信息配置文件的詳細(xì)資料。

對于數(shù)據(jù)庫分區(qū)特性(database partitioning feature,DPF)環(huán)境,automatic runstats 總是在目錄分區(qū)上收集統(tǒng)計信息。如果表不存在于這個目錄節(jié)點上,將使用表駐留的節(jié)點組的第一個分區(qū)。

將使用 RUNSTATS 命令的 “ON COLUMNS” 選項收集列組統(tǒng)計信息。例如,使用 SHOW_LISTINGS 表收集 SHOW_LISTINGS.SHOW_ID、SHOW_LISTINGS.CHANNEL_ID 和 SHOW_LISTINGS.STATION_ID 中的列組統(tǒng)計信息,執(zhí)行如下 RUNSTATS 命令:

                RUNSTATS ON TABLE schema_name.SHOW_LISTINGS ON COLUMNS ((SHOW_ID, CHANNEL_ID,
            STATION_ID))
            
9W9itug

如果只在 DAY 列收集列統(tǒng)計信息以及收集 SHOW_ID、CHANNEL_ID、STATION_ID 和 TIME 列的列組統(tǒng)計信息,則執(zhí)行以下的 RUNSTATS 命令:

                RUNSTATS ON TABLE schema_name.SHOW_LISTINGS ON COLUMNS ((SHOW_ID, CHANNEL_ID,
            STATION_ID, TIME), DAY)
            
9W9itug

注意:列統(tǒng)計信息是在列組中列出的所有列上收集的。在上面的命令中,列統(tǒng)計信息同樣是在每一個列中收集的(SHOW_ID、CHANNEL_ID、STATION_ID 和 TIME)。

為了收集所有列的統(tǒng)計信息以及在 SHOW_ID、CHANNEL_ID、STATION_ID 和 TIME 中收集列組統(tǒng)計信息,執(zhí)行下面的 RUNSTATS 命令:

                RUNSTATS ON TABLE schema_name.SHOW_LISTINGS ON ALL COLUMNS AND ON COLUMNS
            ((SHOW_ID, CHANNEL_ID, STATION_ID, TIME))
            
9W9itug

要收集多個多列統(tǒng)計信息,可以提供一個組集。下面的 RUNSTATS 命令在組(SHOW_ID、CHANNEL_ID 和 STATION_ID)和組(SHOW_ID、CHANNEL_ID、STATION_ID 和 TIME)中收集多列統(tǒng)計信息,同樣也在 DAY 列上收集了列統(tǒng)計信息:

                RUNSTATS ON TABLE schema_name.SHOW_LISTINGS ON COLUMNS ((SHOW_ID,
            CHANNEL_ID, STATION_ID), (SHOW_ID, CHANNEL_ID, STATION_ID, TIME), DAY)
            
9W9itug

注意:對于索引統(tǒng)計信息來說,將為索引鍵的前兩個列、前三列和前四列收集多個多列統(tǒng)計信息,而一個列組基數(shù)統(tǒng)計信息是為指定的各列組收集的。

9W9itug
9W9itug

確定何時收集列組統(tǒng)計信息

確定何時收集列組統(tǒng)計信息以及要收集哪些列組統(tǒng)計信息是比較困難的。這一節(jié)將為您介紹一些方法,幫助您確定何時需要列組統(tǒng)計信息。

本節(jié)的示例使用了 SAMPLE 數(shù)據(jù)庫,可以通過執(zhí)行 “db2sampl” 創(chuàng)建,此數(shù)據(jù)庫使用 db2level:

Informational tokens are "DB2 v8.1.1.120", "s060801", "U808888", and FixPak "13".
            
9W9itug

示例 3:本地等式謂詞

創(chuàng)建了 SAMPLE 數(shù)據(jù)庫后,并沒有在表上收集統(tǒng)計信息。首先,需要在 EMPLOYEE 表中收集統(tǒng)計信息:

RUNSTATS ON TABLE SCHEMA_NAME.EMPLOYEE WITH DISTRIBUTION;
            
9W9itug

考慮 SAMPLE 數(shù)據(jù)庫中 EMPLOYEE 表上的如下查詢:

SELECT EMPNO, FIRSTNME, LASTNAME, WORKDEPT, SEX, JOB, SALARY
            FROM EMPLOYEE
            WHERE JOB='ANALYST';
            
9W9itug

該查詢從 EMPLOYEE 表返回兩條記錄:

EMPNO  FIRSTNME     LASTNAME        WORKDEPT SEX JOB      SALARY
            ------ ------------ --------------- -------- --- -------- -----------
            000130 DOLORES      QUINTANA        C01      F   ANALYST     23800.00
            000140 HEATHER      NICHOLLS        C01      F   ANALYST     28420.00
            2 record(s) selected.
            
9W9itug

看一下為此查詢選擇的查詢執(zhí)行計劃。

為此,使用 EXPLAIN 工具,它要求 EXPLAIN 表存在。

  1. 為了創(chuàng)建 EXPLAIN 表,執(zhí)行以下代碼:
    db2 -tvf $DB2PATH/misc/EXPLAIN.DDL
                    
    9W9itug
  2. 創(chuàng)建了 EXPLAIN 表之后,像下面這樣對查詢進(jìn)行 EXPLAIN 處理:
    SET CURRENT EXPLAIN MODE EXPLAIN;
                    SELECT EMPNO, FIRSTNME, LASTNAME, WORKDEPT, SEX, JOB, SALARY
                    FROM EMPLOYEE
                    WHERE JOB='ANALYST';
                    SET CURRENT EXPLAIN MODE NO;
                    
    9W9itug
    使用 db2exfmt 工具查看查詢執(zhí)行計劃:
    db2exfmt -d <DBNAME> -1 -g -o <FILENAME>
                    
    9W9itug
  3. 使用您喜愛的文本編輯器,您應(yīng)看到像下面這樣的查詢執(zhí)行計劃:
            2
                    TBSCAN
                    (   2)
                    30.8464
                    2
                    |
                    32
                    TABLE: SKAPOOR
                    EMPLOYEE
                    
    9W9itug

    基數(shù)估計值 2 符合實際結(jié)果。

  4. 為這個查詢添加幾個冗余的等式謂詞 :
    SELECT EMPNO, FIRSTNME, LASTNAME, WORKDEPT, SEX, JOB, SALARY
                    FROM EMPLOYEE
                    WHERE JOB='ANALYST' AND SEX='F' AND WORKDEPT='C01';
                    
    9W9itug

    此查詢返回和上面相同的結(jié)果集。但是看一下 EXPLAIN 工具生成的查詢執(zhí)行計劃,基數(shù)估計值并不符合實際結(jié)果:

        0.0761719
                    TBSCAN
                    (   2)
                    31.4115
                    2
                    |
                    32
                    TABLE: SKAPOOR
                    EMPLOYEE
                    
    9W9itug

    DB2 優(yōu)化器假設(shè)這三個謂詞是彼此獨立的,因為不存在相關(guān)的索引或列組統(tǒng)計信息。

  5. 在 JOB、WORKDEPT 和 SEX 列中收集列組統(tǒng)計信息。
    RUNSTATS ON TABLE <SCHEMA_NAME>.EMPLOYEE ON ALL COLUMNS AND COLUMNS
                    ((JOB, WORKDEPT, SEX)) WITH DISTRIBUTION;
                    
    9W9itug

    使用這三個列的列組統(tǒng)計信息,DB2 優(yōu)化器計算出一個更準(zhǔn)確的基數(shù)估計值:

         1.77778
                    TBSCAN
                    (   2)
                    31.4214
                    2
                    |
                    32
                    TABLE: SKAPOOR
                    EMPLOYEE
                    
    9W9itug

    與單一謂詞查詢計算出的結(jié)果不同,所計算出的基數(shù)估計值并不是 2,這是因為列組統(tǒng)計信息是一個一致分布統(tǒng)計信息。

示例 4:等式連接謂詞

這個示例集中關(guān)注表 ORG 和 STAFF 的連接。首先,需要在這兩個表上收集統(tǒng)計信息?,F(xiàn)在,已經(jīng)收集好了基本的統(tǒng)計信息。

RUNSTATS ON TABLE <SCHEMA_NAME>.ORG;
            RUNSTATS ON TABLE <SCHEMA_NAME>.STAFF;
            
9W9itug

下面的查詢連接 ORG 和 STAFF 表:

SELECT STAFF.NAME, ORG.DEPTNUMB, ORG.DEPTNAME, STAFF.SALARY
            FROM ORG, STAFF
            WHERE ORG.MANAGER = STAFF.ID AND ORG.DEPTNUMB = STAFF.DEPT
            ORDER BY ORG.DEPTNUMB;
            
9W9itug

這個查詢返回 8 個記錄:

NAME      DEPTNUMB DEPTNAME       SALARY
            --------- -------- -------------- ---------
            Molinare        10 Head Office     22959.20
            Hanes           15 New England     20659.80
            Sanders         20 Mid Atlantic    18357.50
            Marenghi        38 South Atlantic  17506.75
            Plotz           42 Great Lakes     18352.80
            Fraye           51 Plains          21150.00
            Lea             66 Pacific         18555.50
            Quill           84 Mountain        19818.00
            8 record(s) selected.
            
9W9itug
  1. 使用 EXPLAIN 工具查看查詢執(zhí)行計劃:
                    1
                    TBSCAN
                    (   2)
                    33.2225
                    2
                    |
                    1
                    SORT
                    (   3)
                    33.151
                    2
                    |
                    1
                    HSJOIN
                    (   4)
                    33.0248
                    2
                    /-----+-----
                    35                8
                    TBSCAN           TBSCAN
                    (   5)           (   6)
                    17.2334          15.3736
                    1                1
                    |                |
                    35                8
                    TABLE: SKAPOOR  TABLE: SKAPOOR
                    STAFF             ORG
                    
    9W9itug

    這個示例使用了收集列組統(tǒng)計信息的簡單方法。附錄 B 包含一些示例,對判定連接中的父表做了進(jìn)一步的分析。

  2. 對 STAFF 表的 ID、DEPT 列和 ORG 表的 MANAGER、DEPTNUMB 列做了連接,所以要在這兩組列中收集列組統(tǒng)計信息:
    RUNSTATS ON TABLE <SCHEMA_NAME>.STAFF ON ALL COLUMNS AND COLUMNS ((ID, DEPT));
                    RUNSTATS ON TABLE <SCHEMA_NAME>.ORG ON ALL COLUMNS AND COLUMNS ((MANAGER, DEPTNUMB));
                    
    9W9itug

DB2 優(yōu)化器使用收集到的列組統(tǒng)計信息正確地估計了基數(shù):

               8
            TBSCAN
            (   2)
            33.5658
            2
            |
            8
            SORT
            (   3)
            33.4243
            2
            |
            8
            HSJOIN
            (   4)
            33.0363
            2
            /-----+-----
            35                8
            TBSCAN           TBSCAN
            (   5)           (   6)
            17.2334          15.3736
            1                1
            |                |
            35                8
            TABLE: SKAPOOR  TABLE: SKAPOOR
            STAFF             ORG
            
9W9itug

示例 5:查看多列統(tǒng)計信息

優(yōu)化器利用兩種類型的多列統(tǒng)計信息:索引 keycard 統(tǒng)計信息和列組統(tǒng)計信息。這個示例提供了查看表中可用多列統(tǒng)計信息的步驟。

選項 1. 使用 db2look 工具

db2look 工具用來生成 DDL 語句,從而重新創(chuàng)建數(shù)據(jù)庫中定義的對象??梢允褂?-m 選項來顯示為這些對象收集的統(tǒng)計信息。

  1. 在 ORG 表中收集列組統(tǒng)計信息和索引統(tǒng)計信息:
    CREATE INDEX IX1 ON ORG (DEPTNUMB, DEPTNAME, MANAGER);
                    RUNSTATS ON TABLE <SCHEMA_NAME>.ORG ON ALL COLUMNS
                    AND COLUMNS ((DEPTNUMB, DEPTNAME, MANAGER, DIVISION, LOCATION))
                    WITH DISTRIBUTION AND INDEXES ALL;
                    
    9W9itug
  2. 使用 db2look 工具查看 ORG 表的統(tǒng)計信息:
    db2look -d sample -e -a -m -t ORG -o org.ddl
                    
    9W9itug

    注意:使用 -h 選項查看關(guān)于 DB2look 工具的信息。

  3. 在 org.ddl 文件中查看輸出。它應(yīng)該包含如下用于列組統(tǒng)計信息的 UPDATE 語句:
    UPDATE SYSSTAT.COLGROUPS SET colgroupcard = 8
                    WHERE colgroupid IN (SELECT colgroupid
                    FROM SYSCAT.COLGROUPCOLS
                    WHERE tabschema = 'SKAPOOR ' AND tabname = 'ORG'
                    AND colname = 'DEPTNUMB' AND oridnal = 1)
                    AND colgroupid IN (SELECT colgroupid
                    FROM SYSCAT.COLGROUPCOLS
                    WHERE tabschema = 'SKAPOOR ' AND tabname = 'ORG'
                    AND colname = 'DEPTNAME' AND oridnal = 2)
                    AND colgroupid IN (SELECT colgroupid
                    FROM SYSCAT.COLGROUPCOLS
                    WHERE tabschema = 'SKAPOOR ' AND tabname = 'ORG'
                    AND colname = 'MANAGER' AND oridnal = 3)
                    AND colgroupid IN (SELECT colgroupid
                    FROM SYSCAT.COLGROUPCOLS
                    WHERE tabschema = 'SKAPOOR ' AND tabname = 'ORG'
                    AND colname = 'DIVISION' AND oridnal = 4)
                    AND colgroupid IN (SELECT colgroupid
                    FROM SYSCAT.COLGROUPCOLS
                    WHERE tabschema = 'SKAPOOR ' AND tabname = 'ORG'
                    AND colname = 'LOCATION' AND oridnal = 5)
                    AND colgroupid NOT IN (SELECT colgroupid
                    FROM SYSCAT.COLGROUPCOLS
                    WHERE tabschema = 'SKAPOOR '
                    AND tabname = 'ORG' AND oridnal = 6) ;
                    
    9W9itug

    注意:在 V8 FixPak 13 中,列組統(tǒng)計信息添加到了 db2look 工具中。

    上面的 update 語句列出了 SYSCAT.COLGROUPCOLS 視圖的所有列,以及來自 SYSSTAT.COLGROUPS 的相關(guān)多列統(tǒng)計信息,它表示列集中不同組的數(shù)量。在這個示例中,以上的語句描述了列集(DEPTNUMB、DEPTNAME、MANAGER、DIVISION 和 LOCATION)具有八個不同的組。

    org.ddl 文件也包含如下用于索引統(tǒng)計信息的語句:

    UPDATE SYSSTAT.INDEXES
                    SET NLEAF=1,
                    NLEVELS=1,
                    FIRSTKEYCARD=8,
                    FIRST2KEYCARD=8,
                    FIRST3KEYCARD=8,
                    FIRST4KEYCARD=-1,
                    FULLKEYCARD=8,
                    CLUSTERFACTOR=-1.000000,
                    CLUSTERRATIO=100,
                    SEQUENTIAL_PAGES=0,
                    DENSITY=0,
                    AVERAGE_SEQUENCE_GAP=0.000000,
                    AVERAGE_SEQUENCE_FETCH_GAP=0.000000,
                    AVERAGE_SEQUENCE_PAGES=0.000000,
                    AVERAGE_SEQUENCE_FETCH_PAGES=0.000000,
                    AVERAGE_RANDOM_PAGES=1.000000,
                    AVERAGE_RANDOM_FETCH_PAGES=0.000000,
                    NUMRIDS=8,
                    NUMRIDS_DELETED=0,
                    NUM_EMPTY_LEAFS=0
                    WHERE INDNAME = 'IX1' AND INDSCHEMA = 'SKAPOOR'
                    AND TABNAME = 'ORG' AND TABSCHEMA = 'SKAPOOR';
                    
    9W9itug

    以上的 update 語句描述了下列多列統(tǒng)計信息。FIRST2KEYCARD 統(tǒng)計信息描述了列(DEPTNUMB,DEPTNAME)中不同組的數(shù)量,F(xiàn)IRST3KEYCARD 和 FULLKEYCARD 描述了完整列集(DEPTNUMB,DEPTNAME,MANAGER)中不同組的數(shù)量。FIRST4KEYCARD 的值為 -1,這是因為索引在該鍵中只有 3 列。

選項 2. 查詢目錄表

可以從 DB2 目錄表中查詢與 DB2look 工具輸出中所描述的相同的信息Y

  1. 如果尚未創(chuàng)建索引,請按選項 1 中的步驟 1 創(chuàng)建索引,在多個表中收集多個列組統(tǒng)計信息:
    RUNSTATS ON TABLE <SCHEMA_NAME>.ORG ON ALL COLUMNS
                    AND COLUMNS ((DEPTNUMB, DEPTNAME, MANAGER, DIVISION, LOCATION),
                    (DEPTNUMB, DEPTNAME), (MANAGER, DIVISION)) WITH DISTRIBUTION AND INDEXES ALL;
                    RUNSTATS ON TABLE <SCHEMA_NAME>.EMPLOYEE ON ALL COLUMNS
                    AND COLUMNS ((EMPNO, WORKDEPT), (EMPNO, WORKDEPT, JOB));
                    
    9W9itug
  2. 查詢目錄表來檢索列組統(tǒng)計信息。注意下面的查詢是一個遞歸 SQL 語句,它會導(dǎo)致一個可以忽略的 SQL0347W 警告。可以使用 “UPDATE COMMAND OPTIONS USING W OFF” 選項阻止該警告出現(xiàn)。
    WITH TMP(ID, NUM) AS
                    (
                    SELECT COLGROUPID, MAX(ORIDNAL)
                    FROM SYSCAT.COLGROUPCOLS
                    GROUP BY COLGROUPID
                    ),
                    TMP2 (ID, NAME, NUM, TNAME, TSCHEMA) AS
                    (
                    SELECT ID, CAST(RTRIM(COLNAME) AS CHAR(128)), NUM, TABNAME, TABSCHEMA
                    FROM TMP Y, SYSCAT.COLGROUPCOLS X
                    WHERE X.COLGROUPID = Y.ID
                    AND Y.NUM = X.ORIDNAL
                    UNION ALL
                    SELECT Y.ID, CAST(RTRIM(X.COLNAME) || ',' || Y.NAME AS CHAR(128)), Y.NUM-1,
                    TNAME, TSCHEMA
                    FROM TMP2 Y, SYSCAT.COLGROUPCOLS X
                    WHERE Y.ID=X.COLGROUPID
                    AND X.ORIDNAL=Y.NUM-1
                    AND Y.NUM > 1
                    AND TNAME = TABNAME
                    AND TSCHEMA = TABSCHEMA
                    )
                    SELECT SUBSTR(TSCHEMA,1,10) TABSCHEMA, SUBSTR(TNAME,1,10) TABNAME,
                    NAME COLS, COLGROUPCARD
                    FROM TMP2, SYSSTAT.COLGROUPS
                    WHERE ID = COLGROUPID
                    AND NUM = 1
                    ORDER BY TABSCHEMA, TABNAME
                    ;
                    
    9W9itug

    上面的查詢返回如下記錄:

    注意:TABSCHEMA 列中的值將是不同的。同樣,COLS 結(jié)果列并強(qiáng)制轉(zhuǎn)換為 CHAR(128),如果結(jié)果超過 128 個字符,它會將結(jié)果截斷。在這個例子中,可能需要將 CAST 修改為一個更大的字符串。

    TABSCHEMA  TABNAME    COLS                                   COLGROUPCARD
                    ---------- ---------- ------------------------------//------ -----------------
                    SKAPOOR    EMPLOYEE   EMPNO,WORKDEPT                                        32
                    SKAPOOR    EMPLOYEE   EMPNO,WORKDEPT,JOB                                    32
                    SKAPOOR    ORG        DEPTNUMB,DEPTNAME                                      8
                    SKAPOOR    ORG        MANAGER,DIVISION                                       8
                    SKAPOOR    ORG        DEPTNUMB,DEPTNAME,MANAGER,DIVISION,LOCATION            8
                    5 record(s) selected with 1 warning messages suppressed.
                    
    9W9itug

    這些記錄描述了 EMPLOYEE 表的兩列組統(tǒng)計信息和 ORG 表的三列組統(tǒng)計信息。

    注意:在上面的查詢中,注意 SYSCAT.SYSCOLGROUPCOLS 視圖中的名為 “ORIDNAL” 的列。在 DB2 9 中,其拼寫改為了 “ORDINAL”,所以,這個查詢需要按照在 DB2 9 中使用的方法更新,如下所示:

    WITH TMP(ID, NUM) AS
                    (
                    SELECT COLGROUPID, MAX(ORDINAL)
                    FROM SYSCAT.COLGROUPCOLS
                    GROUP BY COLGROUPID
                    ),
                    TMP2 (ID, NAME, NUM, TNAME, TSCHEMA) AS
                    (
                    SELECT ID, CAST(RTRIM(COLNAME) AS CHAR(128)), NUM, TABNAME, TABSCHEMA
                    FROM TMP Y, SYSCAT.COLGROUPCOLS X
                    WHERE X.COLGROUPID = Y.ID
                    AND Y.NUM = X.ORDINAL
                    UNION ALL
                    SELECT Y.ID, CAST(RTRIM(X.COLNAME) || ',' || Y.NAME AS CHAR(128)), Y.NUM-1,
                    TNAME, TSCHEMA
                    FROM TMP2 Y, SYSCAT.COLGROUPCOLS X
                    WHERE Y.ID=X.COLGROUPID
                    AND X.ORDINAL=Y.NUM-1
                    AND Y.NUM > 1
                    AND TNAME = TABNAME
                    AND TSCHEMA = TABSCHEMA
                    )
                    SELECT SUBSTR(TSCHEMA,1,10) TABSCHEMA, SUBSTR(TNAME,1,10) TABNAME, NAME COLS,
                    COLGROUPCARD
                    FROM TMP2, SYSSTAT.COLGROUPS
                    WHERE ID = COLGROUPID
                    AND NUM = 1
                    ORDER BY TABSCHEMA, TABNAME
                    ;
                    
    9W9itug
  3. 查詢目錄表以檢索索引統(tǒng)計信息。

    注意:在 TABSCHEMA='SKAPOOR' 謂詞中使用合適的模式名替換所提供的值。

    SELECT SUBSTR(COLNAMES, 1, 30) AS COLS, FIRST2KEYCARD, FIRST3KEYCARD,
                    FIRST4KEYCARD, FULLKEYCARD
                    FROM SYSSTAT.INDEXES
                    WHERE TABSCHEMA='SKAPOOR' AND TABNAME='ORG';
                    
    9W9itug

    上述查詢返回如下記錄:

    COLS                       FIRST2KEYCARD FIRST3KEYCARD FIRST4KEYCARD FULLKEYCARD
                    -------------------------- ------------- ------------- ------------- -----------
                    +DEPTNUMB+DEPTNAME+MANAGER             8             8            -1           8
                    1 record(s) selected.
                    
    9W9itug

    FIRST2KEYCARD 統(tǒng)計信息描述了在列(DEPTNUMB 和 DEPTNAME)中不同組的數(shù)量,F(xiàn)IRST3KEYCARD 和 FULLKEYCARD 描述了完整列集(DEPTNUMB,DEPTNAME 和 MANAGER)中不同組的數(shù)量。FIRST4KEYCARD 值為 -1,這是因為索引在鍵中只包含三列。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多