久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術文章
文章詳情頁

提高商業(yè)智能環(huán)境中DB2查詢的性能(2)

瀏覽:86日期:2023-11-08 11:10:37
方法 1:在事實表與三個維度表之間定義適當的參照完整性約束在 DB2 中,可以定義主鍵和外鍵約束,以答應數據庫治理器對數據實施參照完整性約束。外鍵等參照約束還有助于提高性能。例如,假如修改 清單 2 中的查詢中的子表達式 TMP1,去掉 PRODUCT_DIM 表上的本地謂詞,那么,假如在 SALES_FACT.PRODUCT_ID 上創(chuàng)建一個外鍵約束,則優(yōu)化器會消除 SALES_FACT 和 PRODUCT_DIM 之間的連接。假如創(chuàng)建了外鍵約束,則那樣的連接被認為是無損的(lossless),可以從查詢中移除,因為查詢需要從 PRODUCT_DIM 中讀取的數據在 SALES_FACT 表中都有,在 PRODUCT_DIM 與 SALES_FACT 的連接中,只引用到 PRODUCT_DIM 的主鍵,而沒有引用 PRODUCT_DIM 的其它列。在 星型模式布局 小節(jié)中描述的星型模式中,維度中存在的每個 DATE_ID、PRODUCT_ID 和 STORE_ID 在事實表中也必須存在。每個 ID 在維度表中都是惟一的,由為每個維度表創(chuàng)建的主鍵約束標識。因此,事實表保存產品被售出時的歷史數據(定量)。下面的表描述了在這種模式中應該創(chuàng)建的主鍵和外鍵。維度中的每個惟一性 ID 在事實表中都有一個相應的外鍵約束。表 列 PK/FK 目標表(列) DATE_DIMDATE_IDPK無PRODUCT_DIMPRODUCT_IDPK無STORE_DIMSTORE_IDPK無SALES_FACTDATE_IDFKDATE_DIM (DATE_ID)SALES_FACTPRODUCT_IDFKPRODUCT_DIM (PRODUCT_ID)SALES_FACTSTORE_IDFKSTORE_DIM (STORE_ID)步驟 1A:對事實表執(zhí)行 ALTER 操作,創(chuàng)建它與維度表之間的適當的 FK 關系。通過上面的表查看事實表與維度表之間的關系。再創(chuàng)建 SALES_FACT 列(DATE_ID,STORE_ID)上的一個索引,以便與 方法 3 中描述的 MDC 方法進行比較,方法 3 使用 (DATE_ID,STORE_ID) 上的一個塊索引。清單 23. 在 SALES_FACT 表中創(chuàng)建外鍵約束和索引db2 -tvf alter_sales_fact.txt -z alter_sales_fact.log清單 24.alter_sales_fact.txt 文件的內容CONNECT TO DSS_DB;ALTER TABLE SKAPOOR.SALES_FACT ADD CONSTRAINT DATE_DIM_FK FOREIGN KEY(DATE_ID) REFERENCES DATE_DIM;ALTER TABLE SKAPOOR.SALES_FACT ADD CONSTRAINT STORE_DIM_FK FOREIGN KEY(STORE_ID) REFERENCES STORE_DIM;ALTER TABLE SKAPOOR.SALES_FACT ADD CONSTRAINT PRODUCT_DIM_FK FOREIGN KEY(PRODUCT_ID) REFERENCES PRODUCT_DIM;CREATE INDEX SKAPOOR.IND_DATE_STORE ON SKAPOOR.SALES_FACT (DATE_ID, STORE_ID);CONNECT RESET;步驟 1B:收集關于所有表的統(tǒng)計信息:優(yōu)化器根據統(tǒng)計信息適當地計算備選查詢執(zhí)行計劃(QEP)的成本,并選擇最佳計劃。在繼續(xù)下一步驟之前,我們需要收集一些統(tǒng)計信息。清單 25. 收集關于所有表的統(tǒng)計信息db2 -tvf runstats.ddl -z runstats.log清單 26. runstats.ddl 的內容CONNECT TO DSS_DB;RUNSTATS ON TABLE SKAPOOR.DATE_DIM WITH DISTRIBUTION AND INDEXES ALL;RUNSTATS ON TABLE SKAPOOR.STORE_DIM WITH DISTRIBUTION AND INDEXES ALL;RUNSTATS ON TABLE SKAPOOR.PRODUCT_DIM WITH DISTRIBUTION AND INDEXES ALL;RUNSTATS ON TABLE SKAPOOR.SALES_FACT WITH DISTRIBUTION AND INDEXES ALL;CONNECT RESET;創(chuàng)建了外鍵之后,可以看看 DB2 優(yōu)化器如何利用參照完整性來消除連接。步驟 1C:解釋查詢:清單 27. 含無損連接的查詢SELECTD.MONTH AS MONTH,S.STORE_ID AS STORE_ID,S.DISTRICT AS DISTRICT,S.REGION AS REGION,SUM(F1.QUANTITY * F1.PRICE) AS AMOUNT FROMSKAPOOR.SALES_FACT F1,SKAPOOR.DATE_DIM D,SKAPOOR.PRODUCT_DIM P,SKAPOOR.STORE_DIM S WHEREF1.DATE_ID=D.DATE_ID ANDF1.PRODUCT_ID=P.PRODUCT_ID ANDF1.STORE_ID=S.STORE_ID ANDF1.DATE_ID BETWEEN '2006-01-01' AND '2006-01-31' ANDF1.STORE_ID IN (29, 30, 42, 55, 67, 72, 82, 99, 123, 199) ANDD.MONTH = 1 GROUP BYS.STORE_ID,S.DISTRICT,S.REGION,D.MONTH)下面顯示了解釋此查詢的方法之一:db2 connect to dss_dbdb2 set current explain mode explaindb2 -tvf JOIN_ELIM_QUERY.SQL -z JOIN_ELIM_QUERY.logdb2 set current explain mode nodb2 connect reset其中 JOIN_ELIM_QUERY.SQL 的內容只包括 清單 27 中的查詢,以分號結尾。可以使用 db2exfmt 工具查看查詢執(zhí)行計劃:db2exfmt -d dss_db -g TIC -w -1 -n % -s % -# 0 -o join_elim.txt輸出在 join_elim.txt 中。要獲得關于 db2exfmt 工具的具體信息,可以使用 -h 選項。請打開 下載 小節(jié)中的 JOIN_ELIM 文件,看看查詢優(yōu)化器生成的一個訪問計劃,其中與 PRODUCT_DIM 的連接已經被消除。可以查看 db2exfmt 輸出中的 "Optimized Statement" 部分,注重 PRODUCT_DIM 表已從查詢中移除。注重:使用外鍵之類的參照約束時,插入、刪除和更新操作可能無法正常執(zhí)行。假如性能對于這些操作來說非常要害,但是連接排除優(yōu)化在查詢中也比較有用,那么可以將外鍵約束定義為純信息型(informational) 的。這個方法后面的練習就是針對這一選項的。步驟 1D:解釋和運行整個查詢。為了解釋查詢,采用與步驟 1C 中相同的步驟:db2 connect to dss_dbdb2 set current explain mode explaindb2 -tvf QUERY1.SQL -z QUERY1.logdb2 set current explain mode nodb2 connect reset其中,QUERY1.SQL 的內容只包括 清單 2 中的查詢,以分號結尾。可以使用 db2exfmt 工具查看查詢執(zhí)行計劃:db2exfmt -d dss_db -g TIC -w -1 -n % -s % -# 0 -o test1.txt查詢執(zhí)行計劃應該類似于 下載 小節(jié)中的 Test 1 所提供的查詢執(zhí)行計劃。為了運行查詢,要使用 db2batch 工具來評測性能。在此之前,應該讓 db2 實例經過一個再循環(huán)過程,以便對每種方法進行公平比較,避免其它因素影響性能(例如,后面測試的方法可能受益于之前留下的緩沖池,從而歪曲了評測結果)。注重:在運行這些測試時,我們的測試系統(tǒng)是空閑的,沒有其他活動在運行。使用 db2stop force 停止 db2,再使用 db2start 重新啟動它。使用 db2batch 獲得所用時間的信息,如下所示:db2batch -d DSS_DB -f QUERY1.SQL -i complete -iso CS -o p 5 o 5 r 0 -r test1.results.txt文件 test1.results.txt 將包含編譯和運行查詢所用的時間,如下所示:* Prepare Time is:  7.278206 seconds* Execute Time is: 107.729436 seconds* Fetch Time is: 0.000102 seconds* Elapsed Time is: 115.007744 seconds (complete)練習:在步驟 1A 中,在 SALES_FACT 表上創(chuàng)建了外鍵約束,但是,它們可能會影響插入、更新和刪除操作,因為數據庫治理器必須實施參照完整性。假如這些操作的性能很要害,并且參照完整性可由其它方法來實施,那么可以創(chuàng)建信息型約束,以繼續(xù)利用連接排除。否則,提供信息型約束會導致不正確的結果。信息型約束與參照約束的定義類似,只是最后加上了 not enforced 要害字,例如:ALTER TABLE SKAPOOR.SALES_FACT ADD CONSTRAINT DATE_DIM_FK FOREIGN KEY (DATE_ID) REFERENCES DATE_DIM NOT ENFORCED;接下來,為了完成該練習,還需撤銷在 SALES_FACT 表上創(chuàng)建的外鍵約束,并使用信息約束重復步驟 1A 至 1D。方法 2:復制維度表上的物化查詢表這里的測試使用的查詢和表與方法 1 相同,但是該方法還重復創(chuàng)建維度表上的 MQT。在方法 1 中,維度表在不同的分區(qū)中,必須在分區(qū)之間傳送數據。可以使用 MQT 將維度表復制到其它分區(qū),以支持合并連接,避免在分區(qū)之間發(fā)送數據,從而提高查詢執(zhí)行性能。步驟 2A:創(chuàng)建重復的 MQT:db2 -tvf replicated.ddl清單 28. replicated.ddl 文件的內容connect to dss_db;drop table skapoor.store_dim_rep;drop table skapoor.product_dim_rep;drop table skapoor.date_dim_rep;create table skapoor.store_dim_rep as (select * from skapoor.store_dim)data initially deferred refresh deferred in FACT_SMS replicated;create table skapoor.product_dim_rep as (select * from skapoor.product_dim)data initially deferred refresh deferred in FACT_SMS replicated;create table skapoor.date_dim_rep as (select * from skapoor.date_dim)data initially deferred refresh deferred in FACT_SMS replicated;refresh table skapoor.store_dim_rep;refresh table skapoor.product_dim_rep;refresh table skapoor.date_dim_rep;create index skapoor.store_dim_id_rep on skapoor.store_dim_rep (store_id);create index skapoor.product_dim_id_rep on skapoor.product_dim_rep (product_id);create index skapoor.date_dim_id_rep on skapoor.date_dim_rep (date_id);runstats on table skapoor.store_dim_rep with distribution and indexes all;runstats on table skapoor.product_dim_rep with distribution and indexes all;runstats on table skapoor.date_dim_rep with distribution and indexes all;connect reset;為了確保可以實現這種合并,重復的維度必須與事實表位于同一數據庫分區(qū)組中。為簡單起見,我們使用和事實表一樣的表空間,但是,只要是共用相同的數據庫分區(qū)組,也可以使用不同的表空間。而且,為了使優(yōu)化器在計算不同備選訪問計劃的成本時,重復的表與底層表一致,重復的表應該有與底層表一樣的索引,并且應該收集相同的統(tǒng)計信息。由于不能在 MQT 上創(chuàng)建惟一的索引,所以在底層表的主鍵上創(chuàng)建常規(guī)索引。復制維度表會產生該表的一個額外的副本。在 DB2 9 中,新增了行壓縮功能,以節(jié)省存儲空間。為了減少維度表的額外副本的開銷,可以對其進行壓縮。當決定使用那樣的技術時,建議也壓縮重復的 MQT。否則,優(yōu)化器可能會決定執(zhí)行與底層維度表的非合并連接,因為它們被壓縮過,在規(guī)模上小于重復的 MQT。步驟 2B:更新數據庫 DSS_DB 的數據庫配置,將 dft_refresh_age 設置為 "ANY",以便優(yōu)化器選擇重復的 MQT:清單 29. 更新數據庫配置db2_all db2 update db cfg for DSS_DB using dft_refresh_age anydb2 terminate步驟 2C:和 方法 1 中的步驟 1C 一樣,生成主查詢的 db2exfmt 輸出。查看訪問計劃,看重復的 MQT 是否被訪問(也就是說,是否選擇了 date_dim_rep、product_dim_rep 和 store_dim_rep)。打開 下載 小節(jié)中的 Test 2,看看這個訪問計劃的一個例子。在上述訪問計劃中,不存在方法 1 中那樣的連接之間的表隊列(TQ)操作符,因為優(yōu)化器選擇使用重復的維度表,從而答應合并連接。步驟 2D:確認訪問計劃中會訪問 MQT 之后,像 方法 1 中的步驟 1D 那樣,使用 db2batch 工具評測性能。在運行 db2batch 之前,應確保 db2 實例經過再循環(huán)過程。然后,記錄下結果。注重:對于該方法,要將數據庫配置參數 DFT_REFRESH_AGE 設置為 ANY on all Database Partitions。假如想再次運行方法 1 中的測試,則需要將 DFT_REFRESH_AGE 數據庫配置參數更新為 "0"。否則,就會使用重復的 MQT,而不是使用基本維度表。練習1、使用行壓縮來壓縮基本維度表 STORE_DIM、PRODUCT_DIM 和 DATE_DIM。您將需要重新收集所有這三個維度表的統(tǒng)計信息。重新收集好統(tǒng)計信息后,重復步驟 2C 至 2D。2、假如優(yōu)化器沒有選擇訪問第一個練習中的重復 MQT,則重復這個練習,并壓縮重復的 MQT。方法 3:使用重復的維度上的 MQT 的 MDC 事實表這個測試類似于 方法 2,但是用一個 MDC 事實表替代了 SALES_FACT 表。MDC 提供了自動集群表中多個維上的數據的自動化方法,假如選擇了適當的維度列和 EXTENTSIZE 大小,可以顯著提供查詢性能。步驟 3A:計算 EXTENTSIZE 大小。這里為表空間選擇 12 作為 EXTENTSIZE 大小,計算方法如下:請參閱 Info Center 中的指南,獲得 MDC 表維度方面的幫助,這里選擇 (date_id,store_id) 列作為 MDC 表的維度。下面的查詢用于計算 sales_fact 表中 (date_id, store_id) 的惟一組合的數量:清單 30. 計算 (date_id, store_id) 惟一組合的數量的查詢WITH TMP (DATE_ID, STORE_ID) AS (SELECT DISTINCT DATE_ID, STORE_ID FROM SALES_FACT)SELECT COUNT(*) AS CELL_COUNT FROM TMP;CELL_COUNT----------- 73097下面的查詢計算平均每單元行數(RPC)、最小每單元行數以及最大每單元行數。清單 31. 確定評價行數WITH CELL_TABLE(DATE_ID,STORE_ID,RPC) AS(  SELECT DISTINCT DATE_ID,STORE_ID, COUNT(*) FROM SALES_FACT  GROUP BY DATE_ID,STORE_ID)SELECTAVG(RPC) AS RPC, MIN(RPC) AS MINRPC, MAX(RPC) AS MAXRPCFROM CELL_TABLE;RPC MINRPC MAXRPC----------- ----------- -----------298  1 380 1 record(s) selected.為了計算每個單元的間距,我們使用 DB2 9 治理指南中 Space requirements for user table data 小節(jié)中的以下公式。數據庫中用于每個用戶表的 4KB 頁面的數量可以這樣來估計。首先,確定平均行長度。在我們的例子中,列采用固定數據類型,因此可以將每個列的長度相加,得到行的長度。可以使用下面的 DESCRIBE 語句獲得列長度:清單 32. DESCRIBE 語句DB2 DESCRIBE SELECT * FROM SALES_FACTSQLDA Informationsqldaid : SQLDA sqldabc: 896 sqln: 20 sqld: 6Column Informationsqltype  sqllen sqlname.datasqlname.length-------------------- ------ ------------------------------ --------------385  DATE10 DATE_ID 7497  INTEGER 4 PRODUCT_ID 10497  INTEGER 4 STORE_ID 8497  INTEGER 4 QUANTITY 8497  INTEGER 4 PRICE5453  CHARACTER 100 TRANSACTION_DETAILS 8在 DESCRIBE 語句的結果中,"sqllen" 列表明每個列的長度。計算每頁平均記錄數量的公式為:RECORDS_PER_PAGE = ROUND DOWN( 4028 / (AVG ROW SIZE + 10))在我們的例子中,AVG ROW SIZE = 126 字節(jié)(列長度的總和:10+4+4+4+4+100)。因此,RECORDS_PER_PAGE = ROUND DOWN (4028 / (126+10)) = 29。RECORDS_PER_PAGE 公式中額外的 10 個字節(jié)用于開銷。存儲 298 條記錄(清單 31 中的 RPC)所需的 4K 頁面的數量可以這樣計算:NUMBER_OF_PAGES = (NUMBER_OF_RECORDS / RECORDS_PER_PAGE) * 1.1 where NUMBER_OF_RECORDS = RPC=298NUMBER_OF_PAGES = ( 298 records / 29 records per page ) * 1.1 = 11.3 ~ 12 4K pages因此,EXTENTSIZE 為 12。步驟 3B:創(chuàng)建 EXTENTSIZE 大小為 12 的 MDC 表空間:清單 33. 創(chuàng)建 MDC 表空間db2 -tvf mdc_tablespace.ddl -z mdc_tablespace.log清單 34. mdc_tablespace.ddl 的內容CREATE REGULAR TABLESPACE FACT_SMS_MDC_EX IN DATABASE PARTITION GROUPFACT_GROUP PAGESIZE 4096 MANAGED BY SYSTEMUSING ('d:databasefact_tbsp_mdc_EX120') ON DBPARTITIONNUMS (0)USING ('d:databasefact_tbsp_mdc_EX121') ON DBPARTITIONNUMS (1)USING ('d:databasefact_tbsp_mdc_EX122') ON DBPARTITIONNUMS (2)USING ('d:databasefact_tbsp_mdc_EX123') ON DBPARTITIONNUMS (3) EXTENTSIZE 12 PREFETCHSIZE 24 BUFFERPOOL IBMDEFAULTBP OVERHEAD 7.500000 TRANSFERRATE 0.060000 NO FILE SYSTEM CACHING  DROPPED TABLE RECOVERY ON;步驟 3C:創(chuàng)建 MDC 表清單 35. 創(chuàng)建 MDC 表db2 -tvf sales_fact_mdc.ddl -z sales_fact_mdc.log清單 36. sales_fact_mdc.ddl 文件的內容CONNECT TO DSS_DB;----------------------------------------------------------- DDL Statements for table "SKAPOOR "."SALES_FACT_MDC_1"---------------------------------------------------------CREATE TABLE "SKAPOOR "."SALES_FACT_MDC_1" ( "DATE_ID" DATE , "PRODUCT_ID" INTEGER , "STORE_ID" INTEGER , "QUANTITY" INTEGER , "PRICE" INTEGER , "RESERVE" CHAR(100) )  DISTRIBUTE BY HASH("DATE_ID")   IN "FACT_SMS_MDC_EX"  ORGANIZE BY ( ( "DATE_ID" ) , ( "STORE_ID" ) ) ;COMMIT WORK;CONNECT RESET;注重:用于 MDC 表的塊索引是在事實表維列(date_id, store_id)上自動創(chuàng)建的。步驟 3D:將數據插入 MDC 表。在我們的測試環(huán)境中,將數據插入 MDC 表大約花了 4 個小時。清單 37. 將數據插入 MDC 表db2 -tvf sales_fact_mdc_insert_alter.ddl -z sales_fact_mdc_insert.log清單 38. sales_fact_mdc_insert_alter.ddl 的內容CONNECT TO DSS_DB;VALUES(CURRENT TIMESTAMP);------------------------------------- SET OPTLEVEL 0 TO FAVOUR INDEX ACCESS TO IMPROVE PERFORMANCE OF INSERT.SET CURRENT QUERY OPTIMIZATION 0;------------------------------------- INSERTING THE DATA IN THE ORDER OF THE MDC COLUMNS IMPROVES-- THE PERFORMANCE OF THE INSERT.INSERT INTO SKAPOOR.SALES_FACT_MDC_1 SELECT *FROM SKAPOOR.SALES_FACT ORDER BY DATE_ID,STORE_ID;ALTER TABLE SKAPOOR.SALES_FACT_MDC_1ADD CONSTRAINT DATE_DIM_FK FOREIGN KEY (DATE_ID) REFERENCES SKAPOOR.DATE_DIM;ALTER TABLE SKAPOOR.SALES_FACT_MDC_1ADD CONSTRAINT STORE_DIM_FK FOREIGN KEY (STORE_ID) REFERENCES SKAPOOR.STORE_DIM;ALTER TABLE SKAPOOR.SALES_FACT_MDC_1ADD CONSTRAINT PRODUCT_DIM_FK FOREIGN KEY (PRODUCT_ID)REFERENCES SKAPOOR.PRODUCT_DIM;VALUES(CURRENT TIMESTAMP);RUNSTATS ON TABLE SKAPOOR.SALES_FACT_MDC_1 WITH DISTRIBUTION AND INDEXES ALL;步驟 3E:修改 清單 2 中的查詢,將表名從 "SALES_FACT" 改為 "SALES_FACT_MDC_1",以測試 MDC 的優(yōu)點。下面的清單 39 描述了新的查詢。像方法 1 的步驟 1C 一樣,以解釋模式編譯該查詢,并生成主查詢的 db2exfmt 輸出。檢查訪問計劃是否使用了 MDC 索引,并且看上去像 下載 小節(jié)中的 Test 3。清單 39. MDC 查詢WITH TMP1 (MONTH_1,STORE,REGION,DISTRICT,AMOUNT_1) AS( SELECTD.MONTH AS MONTH,S.STORE_ID AS STORE_ID,S.DISTRICT AS DISTRICT,S.REGION AS REGION,SUM(F1.QUANTITY * F1.PRICE) AS AMOUNT FROMSKAPOOR.SALES_FACT_MDC_1 F1,SKAPOOR.DATE_DIM D,SKAPOOR.PRODUCT_DIM P,SKAPOOR.STORE_DIM S WHEREP.MODEL LIKE '%model%' ANDF1.DATE_ID=D.DATE_ID ANDF1.PRODUCT_ID=P.PRODUCT_ID ANDF1.STORE_ID=S.STORE_ID ANDF1.DATE_ID BETWEEN '2006-01-01' AND '2006-01-31' ANDF1.STORE_ID IN (29, 30, 42, 55, 67, 72, 82, 99, 123, 199) ANDD.MONTH = 1 GROUP BYS.STORE_ID,S.DISTRICT,S.REGION,D.MONTH) ,TMP2 (MONTH_11,STORE,REGION,DISTRICT,AMOUNT_11) AS(SELECTD1.MONTH AS MONTH,S1.STORE_ID AS STORE_ID,S1.DISTRICT AS DISTRICT,S1.REGION AS REGION,SUM(F2.QUANTITY * F2.PRICE) AS AMOUNTFROMSKAPOOR.SALES_FACT_MDC_1 F2,SKAPOOR.DATE_DIM D1,SKAPOOR.PRODUCT_DIM P1,SKAPOOR.STORE_DIM S1WHEREP1.MODEL LIKE '%model%' ANDF2.DATE_ID=D1.DATE_ID ANDF2.PRODUCT_ID=P1.PRODUCT_ID ANDF2.STORE_ID=S1.STORE_ID ANDF2.DATE_ID BETWEEN '2006-11-01' AND '2006-11-30' ANDF2.STORE_ID IN (29, 30, 42, 55, 67, 72, 82, 99, 123, 199) ANDD1.MONTH=11GROUP BYS1.STORE_ID,S1.DISTRICT,S1.REGION,D1.MONTH)SELECTA.*,B.*FROMTMP1 A LEFT OUTER JOIN TMP2 B ON (A.STORE=B.STORE AND A.REGION=B.REGION AND A.DISTRICT=B.DISTRICT)ORDER BY A.AMOUNT_1 DESC, B.AMOUNT_11 DESC;步驟 3F:像 方法 1 中的步驟 1D 那樣,將實例再循環(huán),然后使用 db2batch 工具評測性能。注重:QUERY1.SQL 文件中的查詢被更改,以反映 清單 39 中的查詢。記錄下結果。方法 4:表分區(qū)和重復的維度上的 MQT這個測試類似于 方法 2,但是用一個表分區(qū)事實表替代了 SALES_FACT 表。表分區(qū)是 DB2 9 中的新功能。它是一種數據組織模式,按照這種模式,根據一個或多個表列中的值,表數據被劃分到多個被稱作數據分區(qū)的存儲對象中。每個數據分區(qū)是一個單獨的物理實體,可以在不同的表空間中,也可以在相同的表空間中,或者兩者相結合。這種模式對于 BI 環(huán)境中非常大的表比較有益,它可以簡化數據的轉入(roll-in)和轉出(roll-out),根據應用的謂詞避免掃描不需要訪問的分區(qū),從而提高查詢執(zhí)行效率。步驟 4A:創(chuàng)建分區(qū)表第一步是確定適當的分區(qū)范圍。日期經常用于作為分區(qū)范圍,因此我們將根據 SALES_FACT 的 DATE_ID 列對表進行分區(qū)。Info Center 提供了關于定義分區(qū)表范圍的更多具體信息。 由于 SALES_FACT 表由全年的事務組成,而我們的查詢是比較各個月份的銷售量,因此每個范圍由一個月的數據組成。為了演示分區(qū)表對數據轉入的簡化作用,先從包含一月份這個范圍的分區(qū)表開始,然后附加表示接下來每個月的分區(qū):清單 40. 創(chuàng)建分區(qū) SALES_FACT 表db2 -tvf tablepart.ddl -z tablepart.log清單 41. tablepart.ddl 的內容CONNECT TO DSS_DB;CREATE REGULAR TABLESPACE FACT_TPART_SMS IN DATABASE PARTITION GROUP FACT_GROUPPAGESIZE 4096 MANAGED BY SYSTEM USING ('d:databasefact_tpart_tbsp0') ON DBPARTITIONNUMS (0) USING ('d:databasefact_tpart_tbsp1') ON DBPARTITIONNUMS (1) USING ('d:databasefact_tpart_tbsp2') ON DBPARTITIONNUMS (2) USING ('d:databasefact_tpart_tbsp3') ON DBPARTITIONNUMS (3) EXTENTSIZE 32 PREFETCHSIZE AUTOMATIC BUFFERPOOL IBMDEFAULTBP OVERHEAD 7.500000 TRANSFERRATE 0.060000 NO FILE SYSTEM CACHING;-- CREATE THE SALES_FACT TABLE PARTITIONED ON DATE_ID-- WITH A SINGLE PARTITION TO START WITH, CONTAINING-- ALL SALES FROM JANUARYCREATE TABLE "SKAPOOR "."SALES_FACT_TPART" ( "DATE_ID" DATE , "PRODUCT_ID" INTEGER , "STORE_ID" INTEGER , "QUANTITY" INTEGER , "PRICE" INTEGER , "TRANSACTION_DETAILS" CHAR(100) ) DISTRIBUTE BY HASH("DATE_ID")   IN "FACT_TPART_SMS" PARTITION BY ("DATE_ID")(PART Jan STARTING ('1/1/2006') ENDING ('1/31/2006'))VALUES (CURRENT TIMESTAMP);-- POPULATE THE SALES FROM JANINSERT INTO "SKAPOOR"."SALES_FACT_TPART"SELECT * FROM "SKAPOOR"."SALES_FACT"WHERE DATE_ID BETWEEN '1/1/2006' AND '1/31/2006';commit work;VALUES (CURRENT TIMESTAMP);-- CREATE TABLES FOR SALES FROM EACH MONTH-- WHICH WILL THEN BE ATTACHED TO SALES_FACT_TPART TABLECREATE TABLE "SKAPOOR"."SALES_FEB" ( "DATE_ID" DATE , "PRODUCT_ID" INTEGER , "STORE_ID" INTEGER , "QUANTITY" INTEGER , "PRICE" INTEGER , "TRANSACTION_DETAILS" CHAR(100) ) DISTRIBUTE BY HASH("DATE_ID")  IN "FACT_TPART_SMS";CREATE TABLE "SKAPOOR"."SALES_MAR" ( "DATE_ID" DATE , "PRODUCT_ID" INTEGER , "STORE_ID" INTEGER , "QUANTITY" INTEGER , "PRICE" INTEGER , "TRANSACTION_DETAILS" CHAR(100) ) DISTRIBUTE BY HASH("DATE_ID")  IN "FACT_TPART_SMS";CREATE TABLE "SKAPOOR"."SALES_APR" ( "DATE_ID" DATE , "PRODUCT_ID" INTEGER , "STORE_ID" INTEGER , "QUANTITY" INTEGER , "PRICE" INTEGER , "TRANSACTION_DETAILS" CHAR(100) ) DISTRIBUTE BY HASH("DATE_ID")  IN "FACT_TPART_SMS";CREATE TABLE "SKAPOOR"."SALES_MAY" ( "DATE_ID" DATE , "PRODUCT_ID" INTEGER , "STORE_ID" INTEGER , "QUANTITY" INTEGER , "PRICE" INTEGER , "TRANSACTION_DETAILS" CHAR(100) ) DISTRIBUTE BY HASH("DATE_ID")  IN "FACT_TPART_SMS";CREATE TABLE "SKAPOOR"."SALES_JUN" ( "DATE_ID" DATE , "PRODUCT_ID" INTEGER , "STORE_ID" INTEGER , "QUANTITY" INTEGER , "PRICE" INTEGER , "TRANSACTION_DETAILS" CHAR(100) ) DISTRIBUTE BY HASH("DATE_ID")  IN "FACT_TPART_SMS";CREATE TABLE "SKAPOOR"."SALES_JUL" ( "DATE_ID" DATE , "PRODUCT_ID" INTEGER , "STORE_ID" INTEGER , "QUANTITY" INTEGER , "PRICE" INTEGER , "TRANSACTION_DETAILS" CHAR(100) ) DISTRIBUTE BY HASH("DATE_ID")  IN "FACT_TPART_SMS";CREATE TABLE "SKAPOOR"."SALES_AUG" ( "DATE_ID" DATE , "PRODUCT_ID" INTEGER , "STORE_ID" INTEGER , "QUANTITY" INTEGER , "PRICE" INTEGER , "TRANSACTION_DETAILS" CHAR(100) ) DISTRIBUTE BY HASH("DATE_ID")  IN "FACT_TPART_SMS";CREATE TABLE "SKAPOOR"."SALES_SEP" ( "DATE_ID" DATE , "PRODUCT_ID" INTEGER , "STORE_ID" INTEGER , "QUANTITY" INTEGER , "PRICE" INTEGER , "TRANSACTION_DETAILS" CHAR(100) ) DISTRIBUTE BY HASH("DATE_ID")  IN "FACT_TPART_SMS";CREATE TABLE "SKAPOOR"."SALES_OCT" ( "DATE_ID" DATE , "PRODUCT_ID" INTEGER , "STORE_ID" INTEGER , "QUANTITY" INTEGER , "PRICE" INTEGER , "TRANSACTION_DETAILS" CHAR(100) ) DISTRIBUTE BY HASH("DATE_ID")  IN "FACT_TPART_SMS";CREATE TABLE "SKAPOOR"."SALES_NOV" ( "DATE_ID" DATE , "PRODUCT_ID" INTEGER , "STORE_ID" INTEGER , "QUANTITY" INTEGER , "PRICE" INTEGER , "TRANSACTION_DETAILS" CHAR(100) ) DISTRIBUTE BY HASH("DATE_ID")  IN "FACT_TPART_SMS";CREATE TABLE "SKAPOOR"."SALES_DEC" ( "DATE_ID" DATE , "PRODUCT_ID" INTEGER , "STORE_ID" INTEGER , "QUANTITY" INTEGER , "PRICE" INTEGER , "TRANSACTION_DETAILS" CHAR(100) ) DISTRIBUTE BY HASH("DATE_ID")  IN "FACT_TPART_SMS";VALUES (CURRENT TIMESTAMP);-- POPULATE EACH TABLE WITH SALES FOR THE CORRESPONDING MONTHINSERT INTO "SKAPOOR"."SALES_FEB"SELECT * FROM "SKAPOOR"."SALES_FACT"WHERE DATE_ID BETWEEN '2/1/2006' AND '2/28/2006';commit work;INSERT INTO "SKAPOOR"."SALES_MAR"SELECT * FROM "SKAPOOR"."SALES_FACT"WHERE DATE_ID BETWEEN '3/1/2006' AND '3/31/2006';commit work;INSERT INTO "SKAPOOR"."SALES_APR"SELECT * FROM "SKAPOOR"."SALES_FACT"WHERE DATE_ID BETWEEN '4/1/2006' AND '4/30/2006';commit work;INSERT INTO "SKAPOOR"."SALES_MAY"SELECT * FROM "SKAPOOR"."SALES_FACT"WHERE DATE_ID BETWEEN '5/1/2006' AND '5/31/2006';commit work;INSERT INTO "SKAPOOR"."SALES_JUN"SELECT * FROM "SKAPOOR"."SALES_FACT"WHERE DATE_ID BETWEEN '6/1/2006' AND '6/30/2006';commit work;INSERT INTO "SKAPOOR"."SALES_JUL"SELECT * FROM "SKAPOOR"."SALES_FACT"WHERE DATE_ID BETWEEN '7/1/2006' AND '7/31/2006';commit work;INSERT INTO "SKAPOOR"."SALES_AUG"SELECT * FROM "SKAPOOR"."SALES_FACT"WHERE DATE_ID BETWEEN '8/1/2006' AND '8/31/2006';commit work;INSERT INTO "SKAPOOR"."SALES_SEP"SELECT * FROM "SKAPOOR"."SALES_FACT"WHERE DATE_ID BETWEEN '9/1/2006' AND '9/30/2006';commit work;INSERT INTO "SKAPOOR"."SALES_OCT"SELECT * FROM "SKAPOOR"."SALES_FACT"WHERE DATE_ID BETWEEN '10/1/2006' AND '10/31/2006';commit work;INSERT INTO "SKAPOOR"."SALES_NOV"SELECT * FROM "SKAPOOR"."SALES_FACT"WHERE DATE_ID BETWEEN '11/1/2006' AND '11/30/2006';commit work;INSERT INTO "SKAPOOR"."SALES_DEC"SELECT * FROM "SKAPOOR"."SALES_FACT"WHERE DATE_ID BETWEEN '12/1/2006' AND '12/31/2006';commit work;VALUES (CURRENT TIMESTAMP);-- Attach SALES from February and MarchALTER TABLE "SKAPOOR"."SALES_FACT_TPART" ATTACH PARTITION Feb STARTING FROM '2/1/2006' ENDING AT '2/28/2006' FROM "SKAPOOR"."SALES_FEB";ALTER TABLE "SKAPOOR"."SALES_FACT_TPART" ATTACH PARTITION Mar STARTING FROM '3/1/2006' ENDING AT '3/31/2006' FROM "SKAPOOR"."SALES_MAR";-- Make the partitions visibleSET INTEGRITY FOR "SKAPOOR"."SALES_FACT_TPART"IMMEDIATE CHECKED;commit work;-- Attach SALES from April to JuneALTER TABLE "SKAPOOR"."SALES_FACT_TPART" ATTACH PARTITION Apr STARTING FROM '4/1/2006' ENDING AT '4/30/2006' FROM "SKAPOOR"."SALES_APR";ALTER TABLE "SKAPOOR"."SALES_FACT_TPART" ATTACH PARTITION May STARTING FROM '5/1/2006' ENDING AT '5/31/2006' FROM "SKAPOOR"."SALES_MAY";ALTER TABLE "SKAPOOR"."SALES_FACT_TPART" ATTACH PARTITION Jun STARTING FROM '6/1/2006' ENDING AT '6/30/2006' FROM "SKAPOOR"."SALES_JUN";SET INTEGRITY FOR "SKAPOOR"."SALES_FACT_TPART"IMMEDIATE CHECKED;commit work;-- Attach SALES from July to DecALTER TABLE "SKAPOOR"."SALES_FACT_TPART" ATTACH PARTITION Jul STARTING FROM '7/1/2006' ENDING AT '7/31/2006' FROM "SKAPOOR"."SALES_JUL";ALTER TABLE "SKAPOOR"."SALES_FACT_TPART" ATTACH PARTITION Aug STARTING FROM '8/1/2006' ENDING AT '8/31/2006' FROM "SKAPOOR"."SALES_AUG";ALTER TABLE "SKAPOOR"."SALES_FACT_TPART" ATTACH PARTITION Sep STARTING FROM '9/1/2006' ENDING AT '9/30/2006' FROM "SKAPOOR"."SALES_SEP";ALTER TABLE "SKAPOOR"."SALES_FACT_TPART" ATTACH PARTITION Oct STARTING FROM '10/1/2006' ENDING AT '10/31/2006' FROM "SKAPOOR"."SALES_OCT";ALTER TABLE "SKAPOOR"."SALES_FACT_TPART" ATTACH PARTITION Nov STARTING FROM '11/1/2006' ENDING AT '11/30/2006' FROM "SKAPOOR"."SALES_NOV";ALTER TABLE "SKAPOOR"."SALES_FACT_TPART" ATTACH PARTITION Dec STARTING FROM '12/1/2006' ENDING AT '12/31/2006' FROM "SKAPOOR"."SALES_DEC";SET INTEGRITY FOR "SKAPOOR"."SALES_FACT_TPART"IMMEDIATE CHECKED;yocommit work;VALUES(CURRENT TIMESTAMP);RUNSTATS ON TABLE SKAPOOR.SALES_FACT_TPART WITH DISTRIBUTION;commit work;CONNECT RESET;在我們的測試環(huán)境中,填充所有分區(qū)花了大約 3 個小時。而將表附加(attach)到每個分區(qū)則比較快。表一旦被附加到分區(qū)之后,它就成為 SALES_FACT_TPART 表的一個物理實體,不能再將其當作單獨的表來查詢。假如想那樣做的話,必須將表與 SALES_FACT_TPART 表分離開來。步驟 4B:修改 清單 2 中的查詢,將表名從 "SALES_FACT" 改為 "SALES_FACT_TPART",以測試分區(qū)消除的優(yōu)點。下面的清單 42 描述了這個新的查詢。像 方法 1 的步驟 1C 那樣,以解釋模式編譯該查詢,并生成主查詢的 db2exfmt 輸出。檢查訪問計劃是否使用了分區(qū)表,這就像 下載 小節(jié)中的 TPART。清單 42. 分區(qū)表查詢WITH TMP1 (MONTH_1,STORE,REGION,DISTRICT,AMOUNT_1) AS( SELECTD.MONTH AS MONTH,S.STORE_ID AS STORE_ID,S.DISTRICT AS DISTRICT,S.REGION AS REGION,SUM(F1.QUANTITY * F1.PRICE) AS AMOUNT FROMSKAPOOR.SALES_FACT_TPART F1,SKAPOOR.DATE_DIM D,SKAPOOR.PRODUCT_DIM P,SKAPOOR.STORE_DIM S WHEREP.MODEL LIKE '%model%' ANDF1.DATE_ID=D.DATE_ID ANDF1.PRODUCT_ID=P.PRODUCT_ID ANDF1.STORE_ID=S.STORE_ID ANDF1.DATE_ID BETWEEN '2006-01-01' AND '2006-01-31' ANDF1.STORE_ID IN (29, 30, 42, 55, 67, 72, 82, 99, 123, 199) ANDD.MONTH = 1 GROUP BYS.STORE_ID,S.DISTRICT,S.REGION,D.MONTH) ,TMP2 (MONTH_11,STORE,REGION,DISTRICT,AMOUNT_11) AS(SELECTD1.MONTH AS MONTH,S1.STORE_ID AS STORE_ID,S1.DISTRICT AS DISTRICT,S1.REGION AS REGION,SUM(F2.QUANTITY * F2.PRICE) AS AMOUNTFROMSKAPOOR.SALES_FACT_TPART F2,SKAPOOR.DATE_DIM D1,SKAPOOR.PRODUCT_DIM P1,SKAPOOR.STORE_DIM S1WHEREP1.MODEL LIKE '%model%' ANDF2.DATE_ID=D1.DATE_ID ANDF2.PRODUCT_ID=P1.PRODUCT_ID ANDF2.STORE_ID=S1.STORE_ID ANDF2.DATE_ID BETWEEN '2006-11-01' AND '2006-11-30' ANDF2.STORE_ID IN (29, 30, 42, 55, 67, 72, 82, 99, 123, 199) ANDD1.MONTH=11GROUP BYS1.STORE_ID,S1.DISTRICT,S1.REGION,D1.MONTH)SELECTA.*,B.*FROMTMP1 A LEFT OUTER JOIN TMP2 B ON (A.STORE=B.STORE AND A.REGION=B.REGION AND A.DISTRICT=B.DISTRICT)ORDER BY A.AMOUNT_1 DESC, B.AMOUNT_11 DESC;在 db2exfmt 輸出中,關于分區(qū)表訪問的具體信息表明是否發(fā)生了分區(qū)排除以及訪問了哪些分區(qū):14) TBSCAN: (Table Scan)Cumulative Total Cost: 15378Cumulative CPU Cost: 8.77067e+008Cumulative I/O Cost: 15213Cumulative Re-Total Cost: 15378Cumulative Re-CPU Cost: 8.77065e+008Cumulative Re-I/O Cost: 15213Cumulative First Row Cost: 8.22883Cumulative Comm Cost:0Cumulative First Comm Cost:0Estimated Bufferpool Buffers: 15213Arguments:---------DPESTFLG: (Number of data partitions accessed are Estimated)FALSEDPLSTPRT: (List of data partitions accessed)10DPNUMPRT: (Number of data partitions accessed)1...DP Elim Predicates:------------------Range 1)Stop Predicate: (Q10.DATE_ID <= '11/30/2006')Start Predicate: ('11/01/2006' <= Q10.DATE_ID)...DPESTFLG 參數指示是估計分區(qū)消除(TRUE)還是在編譯時精確計算分區(qū)消除(FALSE)。假如已估計,那么在運行時確定實際的分區(qū)消除。在這個例子中,分區(qū)消除是在編譯時計算的。DPLSTPRT 參數指示訪問哪些分區(qū),DPNUMPRT 指示所訪問的分區(qū)的數量。假如 DPESTFLG 為 TRUE,那么這兩個值由優(yōu)化器估算。在這個例子中,只有一個分區(qū),即分區(qū) 10 被訪問。其余分區(qū)被忽略。DP Elim Predicates 部分列出了用于確定訪問哪些分區(qū)的謂詞。步驟 4C:像 方法 1 中的步驟 1D 那樣,對實例進行再循環(huán),并使用 db2batch 工具評測性能。注重:QUERY1.SQL 文件中的查詢被修改,以反映清單 42 中的查詢。記錄下結果。練習1、索引可以幫助提高使用分區(qū)表 SALES_FACT_TPART 的查詢的性能。創(chuàng)建一個或多個可能有用的索引,并重復步驟 4B 和 4C。別忘了收集關于索引的統(tǒng)計信息。2、試著將一個或多個分區(qū)與 SALES_FACT_TPART 表分離開來,感覺一下如何通過使用分區(qū)表輕松而有效地轉出數據。方法 5:表分區(qū)、MDC 和重復的維度上的 MQT這個測試類似于 方法 4,但是用一個分區(qū) MDC 事實表替代了 SALES_FACT_TPART 表。可以將 MDC 和表分區(qū)相結合,進一步提高查詢的性能。與 方法 3 采用了相同的技術,使用 DATE_ID 和 STORE_ID 列作為維列,采用了與方法 4 一樣的范圍和 DATE_ID。步驟 5A:創(chuàng)建分區(qū) MDC 表清單 43. 創(chuàng)建分區(qū) MDC SALES_FACT 表db2 -tvf tablepart_mdc.ddl -z tablepart_mdc.log清單 44. tablepart_mdc.ddl 的內容CONNECT TO DSS_DB;CREATE TABLE "SKAPOOR "."SALES_FACT_TPART_MDC" ( "DATE_ID" DATE ,"PRODUCT_ID" INTEGER ,"STORE_ID" INTEGER ,"QUANTITY" INTEGER ,"PRICE" INTEGER ,"TRANSACTION_DETAILS" CHAR(100))DISTRIBUTE BY HASH("DATE_ID")  PARTITION BY RANGE("DATE_ID") (PART "JAN" STARTING('2006-01-01') ENDING('2006-01-31') IN "FACT_TPART_SMS",  PART "FEB" STARTING('2006-02-01') ENDING('2006-02-28') IN "FACT_TPART_SMS",  PART "MAR" STARTING('2006-03-01') ENDING('2006-03-31') IN "FACT_TPART_SMS",  PART "APR" STARTING('2006-04-01') ENDING('2006-04-30') IN "FACT_TPART_SMS",  PART "MAY" STARTING('2006-05-01') ENDING('2006-05-31') IN "FACT_TPART_SMS",  PART "JUN" STARTING('2006-06-01') ENDING('2006-06-30') IN "FACT_TPART_SMS",  PART "JUL" STARTING('2006-07-01') ENDING('2006-07-31') IN "FACT_TPART_SMS",  PART "AUG" STARTING('2006-08-01') ENDING('2006-08-31') IN "FACT_TPART_SMS",  PART "SEP" STARTING('2006-09-01') ENDING('2006-09-30') IN "FACT_TPART_SMS",  PART "OCT" STARTING('2006-10-01') ENDING('2006-10-31') IN "FACT_TPART_SMS",  PART "NOV" STARTING('2006-11-01') ENDING('2006-11-30') IN "FACT_TPART_SMS",  PART "DEC" STARTING('2006-12-01') ENDING('2006-12-31') IN "FACT_TPART_SMS")ORGANIZE BY (DATE_ID,STORE_ID)COMMIT WORK ;INSERT INTO SKAPOOR.SALES_FACT_TPART_MDC SELECT * FROM SKAPOOR.SALES_FACT_MDC_1;COMMIT WORK;RUNSTATS ON TABLE SKAPORR.SALES_FACT_TPART_MDC WITH DISTRIBUTION AND INDEXES ALL;COMMIT WORK;CONNECT RESET;步驟 5B: 修改 清單 2 中的查詢,將表名從 "SALES_FACT" 改為 "SALES_FACT_TPART_MDC",以測試將 MDC 與分區(qū)消除相結合的優(yōu)點。下面的清單 45 描述了這個新的查詢。像 方法 1 的步驟 1C 那樣,以解釋模式編譯該查詢,并生成主查詢的 db2exfmt 輸出。檢查訪問計劃是否使用了分區(qū)表和塊索引,它看上去像 下載 小節(jié)中的 TPART_MDC 一樣 。清單 45. 分區(qū) MDC 表查詢WITH TMP1 (MONTH_1,STORE,REGION,DISTRICT,AMOUNT_1) AS( SELECTD.MONTH AS MONTH,S.STORE_ID AS STORE_ID,S.DISTRICT AS DISTRICT,S.REGION AS REGION,SUM(F1.QUANTITY * F1.PRICE) AS AMOUNT FROMSKAPOOR.SALES_FACT_TPART_MDC F1,SKAPOOR.DATE_DIM D,SKAPOOR.PRODUCT_DIM P,SKAPOOR.STORE_DIM S WHEREP.MODEL LIKE '%model%' ANDF1.DATE_ID=D.DATE_ID ANDF1.PRODUCT_ID=P.PRODUCT_ID ANDF1.STORE_ID=S.STORE_ID ANDF1.DATE_ID BETWEEN '2006-01-01' AND '2006-01-31' ANDF1.STORE_ID IN (29, 30, 42, 55, 67, 72, 82, 99, 123, 199) ANDD.MONTH = 1 GROUP BYS.STORE_ID,S.DISTRICT,S.REGION,D.MONTH) ,TMP2 (MONTH_11,STORE,REGION,DISTRICT,AMOUNT_11) AS(SELECTD1.MONTH AS MONTH,S1.STORE_ID AS STORE_ID,S1.DISTRICT AS DISTRICT,S1.REGION AS REGION,SUM(F2.QUANTITY * F2.PRICE) AS AMOUNTFROMSKAPOOR.SALES_FACT_TPART_MDC F2,SKAPOOR.DATE_DIM D1,SKAPOOR.PRODUCT_DIM P1,SKAPOOR.STORE_DIM S1WHEREP1.MODEL LIKE '%model%' ANDF2.DATE_ID=D1.DATE_ID ANDF2.PRODUCT_ID=P1.PRODUCT_ID ANDF2.STORE_ID=S1.STORE_ID ANDF2.DATE_ID BETWEEN '2006-11-01' AND '2006-11-30' ANDF2.STORE_ID IN (29, 30, 42, 55, 67, 72, 82, 99, 123, 199) ANDD1.MONTH=11GROUP BYS1.STORE_ID,S1.DISTRICT,S1.REGION,D1.MONTH)SELECTA.*,B.*FROMTMP1 A LEFT OUTER JOIN TMP2 B ON (A.STORE=B.STORE AND A.REGION=B.REGION AND A.DISTRICT=B.DISTRICT)ORDER BY A.AMOUNT_1 DESC, B.AMOUNT_11 DESC;步驟 5C:像 方法 1 中的步驟 1D 那樣,將實例再循環(huán),然后使用 db2batch 工具評測性能。注重:QUERY1.SQL 文件中的查詢被更改,以反映清單 39 中的查詢。記錄下結果。方法 6:使用 MQT 預先計算聚合結果這個測試類似于 方法 1,但是增加 MQT,以便預先計算聚合值。使用 MQT 物化表達為聚合的結果可以顯著提高查詢性能。在 清單 2 中描述的每個查詢中,向外連接的每個分支由相同連接上的一個聚合組成。惟一的不同是應用于事實表的本地謂詞。假如可以在執(zhí)行查詢之前預先計算連接,則可以顯著提高查詢執(zhí)行性能。步驟 6A:創(chuàng)建和刷新 MQT清單 46. 創(chuàng)建 MQT 表db2 -tvf mqt2.ddl -z mqt2.log清單 47. mqt2.ddl 文件的內容CONNECT TO DSS_DB;-------------------------------------------------- DDL STATEMENTS FOR TABLE "SKAPOOR "."MQT2"CREATE TABLE SKAPOOR.MQT2 AS( SELECT D.MONTH AS MONTH, S.STORE_ID AS STORE_ID, S.DISTRICT AS DISTRICT, S.REGION AS REGION, SUM(F1.QUANTITY * F1.PRICE) AS AMOUNT , F1.DATE_ID FROM SKAPOOR.SALES_FACT F1, SKAPOOR.DATE_DIM D, SKAPOOR.PRODUCT_DIM P, SKAPOOR.STORE_DIM S WHERE F1.DATE_ID=D.DATE_ID AND F1.PRODUCT_ID=P.PRODUCT_ID AND F1.STORE_ID=S.STORE_ID AND P.MODEL LIKE '%MODEL%' GROUP BY S.STORE_ID,S.DISTRICT,S.REGION,D.MONTH, F1.DATE_ID)DATA INITIALLY DEFERRED REFRESH DEFERRED IN FACT_SMS;REFRESH TABLE "SKAPOOR "."MQT2";-- DDL STATEMENTS FOR INDEXES ON TABLE "SKAPOOR "."MQT2"CREATE INDEX "SKAPOOR "."MQT2_IND3" ON "SKAPOOR "."MQT2"("MONTH" ASC, "DATE_ID" ASC)ALLOW REVERSE SCANS;-- DDL STATEMENTS FOR INDEXES ON TABLE "SKAPOOR "."MQT2"CREATE INDEX "SKAPOOR "."MQT2_IND4" ON "SKAPOOR "."MQT2"("DATE_ID" ASC, "STORE_ID" ASC, "DISTRICT" ASC, "REGION" ASC, "MONTH" ASC, "AMOUNT" ASC)ALLOW REVERSE SCANS;清單 41 中創(chuàng)建的兩個索引 MQT2_IND3 和 MQT2_IND4 用于提高從 MQT 訪問數據的性能。步驟 6B: 收集關于 MQT 統(tǒng)計信息,并調整模式,以符合您的環(huán)境:清單 48. 收集關于 MQT 表的統(tǒng)計信息DB2 RUNSTATS ON TABLE SKAPOOR.MQT2 WITH DISTRIBUTION AND INDEXES ALL步驟 6C:像 方法 1 的 STEP 1C 那樣,解釋 清單 2 中的查詢,并生成 db2exfmt 輸出。然后,查看訪問計劃。應該可以看到,訪問計劃選擇 MQT 和 MQT2,并使用一個連接操作符,以完成兩個 MQT 的向外連接。這個訪問計劃看上去應該類似于 下載 小節(jié)中的 Test 6。假如沒有選擇 MQT,則應確保在所有數據庫分區(qū)上的數據庫配置中 DFT_REFRESH_AGE 被設為 "ANY";否則,優(yōu)化器不會考慮 MQT。STEP 6D: 像 方法 1 中的步驟 1D 那樣,將實例再循環(huán),并使用 db2batch 工具評測性能。現在,記錄下結果。考察每種方法對查詢執(zhí)行性能的效果注重:所有測試都是在沒有其它其他活動在運行的環(huán)境中執(zhí)行的。下面的表列出了在我們的系統(tǒng)上使用 db2batch 工具測到的每種方法所用的時間(單位為秒)。方法 查詢 所用時間(秒) 1. 參照完整性約束清單 2115.002. 重復的 MQT清單 2103.423. 多維集群和重復的 MQT清單 3938.364. 表分區(qū)和重復的 MQT清單 42197.745. 表分區(qū)、MDC 和重復的 MQT清單 4532.216. 使用 MQT 預先計算聚合結果清單 27.61結果表明,使用 MQT 預先計算聚合結果可以提高查詢性能的效果最為顯著。與 方法 1 中基本的星型模式布局相比,多維集群,以及表分區(qū)與 MDC 的組合,也可以顯著提高查詢性能。在我們的環(huán)境中,重復的維度表可以略微提高性能。這是因為所有 4 個數據庫分區(qū)都是邏輯分區(qū),是在同一臺物理機器上創(chuàng)建的。假如為數據庫分區(qū)使用多臺物理機器,那么這種方法應該可以顯著提高性能,尤其是當數據庫分區(qū)之間需要大量傳送數據時,這種方法的效果尤為明顯。表分區(qū)本身實際上會使性能變得更糟。我們的測試中未創(chuàng)建任何索引來比較分區(qū)消除。事實表上的附加謂詞進一步過濾向外連接每個分支中訪問的分區(qū)。在表上創(chuàng)建一個或多個索引的另一個優(yōu)點是可以取得更好的性能。這是 方法 4 中留給讀者的一個練習。這些測試表明,使用 DB2 9 中的各種特性可以提高 BI 查詢的性能。結束語本文中討論的這些方法只是提高 BI 環(huán)境中查詢性能的一部分方法。請動手完成下一小節(jié)及本文各處所提供的練習。
標簽: DB2 數據庫
主站蜘蛛池模板: 国产精品毛片一区二区三区 | 亚洲一区中文字幕在线观看 | 国精产品一区二区三区黑人免费看 | 日本激情视频一区二区三区 | 亚洲 精品 综合 精品 自拍 | 91天堂| 日日人人| 91人人爽人人爽人人精88v | 国产一区二区视频免费看 | 成人精品二区 | 国产精精品 | 亚洲精品在线免费 | 美女h在线观看 | 成人精品一区二区 | 欧美成人精品 | 欧美free性 | 成人精品福利视频 | 欧美 国产精品 | 久久美女视频 | 久久99精品久久久久久琪琪 | 操操操操操操操操操操操操操操 | 欧美成人一区二区三区片免费 | 久久久久久久精 | 伊人色综合久久久天天蜜桃 | 久久91精品 | 国产精品高清在线 | av女人的天堂 | 久久久久久网站 | 一区二区日本 | 欧美精产国品一二三区 | 亚洲精品一区二区三区中文字幕 | 久久精品免费一区二区三区 | 青青久草 | 午夜国产羞羞视频免费网站 | 亚洲欧美一区二区三区在线 | 欧美乱操 | 国产精品18久久久久久久久久久久 | 亚洲精品视频免费观看 | 伊人啪啪 | 中文字幕亚洲一区二区三区 | 91久久国产综合久久 | 黄色片网站在线免费观看 | 国产精品久久久久无码av | 天堂色网 | 蜜臀精品 | 午夜久久 | 色橹橹欧美在线观看视频高清 | 欧美精品一区二区在线观看 | 日韩一区精品 | 亚洲av毛片 | 在线观看免费视频亚洲 | 在线观看中文 | 色综合99| 亚洲综合无码一区二区 | 男人av网 | 国产网址在线 | 色综合色综合网色综合 | 婷婷色国产偷v国产偷v小说 | 欧美色视频在线观看 | 99国产精品久久久久久久 | 98久久久| 欧美日韩国产中文字幕 | 久久精品色欧美aⅴ一区二区 | 欧美女优在线视频 | 中文字幕大全 | 国产女爽123视频.cno | 一区二区色 | 在线观看国产wwwa级羞羞视频 | 国产成人午夜 | 久久成人国产视频 | 日批的视频| 成人一级黄色大片 | 精品少妇一区二区三区在线播放 | 日韩一区二区三区在线 | 日本在线视频一区二区 | 美女一级| 欧美色综合| 高清xxxx | 欧美精品在线一区 | 欧美亚洲专区 | 欧美三级在线视频 | 亚洲午夜精品一区二区三区他趣 | 99热最新网站 | 成人乱人乱一区二区三区 | 亚洲一区二区黄 | 黄色av网站在线免费观看 | 亚洲一区二区三区四区五区午夜 | 欧美三级在线 | 亚洲成人一区 | 久久久中文字幕 | 欧美激情欧美激情在线五月 | 求av网站| 欧美视频在线观看不卡 | 国产精品网站在线观看 | 亚洲第一中文字幕 | 一区二区三区国产视频 | 日韩手机专区 | 国产一级视频在线观看 | 91精品久久久久久久久久 | 午夜爽爽爽 | 国产亚洲精品一区二区 | 精品免费视频一区二区 | 日本超碰在线 | 久久久久综合 | 视频一区在线 | 欧美日韩中文在线观看 | 91中文字幕在线 | 久久久久久久国产精品 | 国产一区二区在线免费观看 | 久久久精品免费看 | 久久久久国产亚洲日本 | 精品一区视频 | 成人黄色av| 国产黄色在线观看 | 久久99精品久久久水蜜桃 | 欧美成人午夜视频 | 中文字幕第一页在线 | 欧美福利在线 | 国产精品178页 | 国产精品成人在线 | 午夜色福利 | 欧美日韩成人在线播放 | 操操操av| 中文字幕日韩欧美一区二区三区 | 中文字幕在线永久在线视频 | 91在线免费观看 | 黄色毛片av | 色综合一区二区三区 | 欧洲一级黄| 亚洲二区在线 | 成人免费视频网站在线观看 | 日韩视频在线观看一区 | 久久久久久久国产精品 | 欧美日韩国产精品 | 免费一二区 | 亚洲狠狠 | 欧美精品网站 | 四虎5151久久欧美毛片 | 日韩乱码中文字幕 | 欧美日韩成人在线观看 | av片在线观看网站 | 国产欧美综合一区二区三区 | 欧美一区二区三区黄 | 国产精品亚洲精品日韩已方 | 羞羞视频在线免费 | 婷婷综合激情 | 免费av电影网站 | 91精品久久久久久久久 | 欧美日韩亚洲视频 | 精品久久久久久亚洲精品 | 视频一区二区三区在线播放 | 国产视频一区二区 | 日韩大片免费播放 | 偷拍自拍第一页 | 99热在线播放| 欧美日本国产 | 天天看天天爽 | 一级视频黄色 | 中文字幕一区二区三区不卡 | 国产福利视频 | 久久精品网 | 久久国产精品久久久久久久久久 | 91啦 | 中文字幕亚洲一区 | 国产亚洲精品v | 亚洲美乳中文字幕 | 日韩免费高清视频 | 成人1区2区 | 日韩一级大片 | 久久国语| 久久国产欧美日韩精品 | 久久久久久艹 | 亚洲成av人片在线观看无码 | 国产视频一区二区 | 亚洲国产精品成人 | 国产欧美一区二区精品忘忧草 | 国产午夜精品久久 | 亚洲第一色片 | 北条麻妃99精品青青久久 | 亚洲xx站| 日韩色综合 | 91视频免费看片 | 免费黄色在线看 | 久久精品视频网站 | 四虎影音| 色综合天天综合网国产成人网 | 国产猛男猛女超爽免费视频网站 | 日韩三区视频 | 人人草视频在线观看 | 69黄在线看片免费视频 | 在线免费中文字幕 | 久久精品手机视频 | 国产成人在线看 | 欧美大成色www永久网站婷 | 国产高潮失禁喷水爽网站 | 精品一区在线 | 国产美女黄色片 | 在线婷婷| 超碰在线一区二区三区 | 欧洲视频一区二区三区 | ririsao久久精品一区 | 91色视频在线观看 | 欧美综合在线一区 | 成人免费crm在线观看 | 91小视频网站| 国产乱码精品一区二区三区中文 | 欧一区二区 | 亚洲一区二区三区视频 | 中文字幕一区二区三区不卡 | 国产在线一区二区三区 | 国产精品美女www爽爽爽软件 | 精品亚洲视频在线 | 国产一区二区精品 | 国产欧美日韩综合精品一 | 成人区一区二区三区 | 日本a v在线播放 | 亚洲午夜免费视频 | 国产精品一区二区三区免费 | www.一级电影 | 国产在线精品一区 | 亚洲一二 | 日韩成人高清 | 久久久久一区二区 | 美女久久久| 国产第99页 | a国产在线观看 | 国产精品女教师av久久 | 99爱视频| 亚洲91| 性一交一乱一透一a级 | 精品毛片| 毛片搜索 | 一本色道精品久久一区二区三区 | 大陆毛片 | 欧美一级毛片日韩一级 | 精品91在线 | 色婷婷综合久久久中文字幕 | 亚洲精品一区二区网址 | 亚州精品成人 | 成人免费国产 | 久久精品久久久久久久久久久久久 | 免费激情av | 少妇无套高潮一二三区 | 国产精品高清在线 | 欧美精品tv | 欧美理论在线观看 | 国产欧美日韩综合精品一区二区 | 美女午夜影院 | 中文字幕日韩在线 | 国产成人亚洲综合 | 国产精品久久久久一区二区三区 | 国产精品毛片 | 欧美成人精品一区二区三区 | 色精品| av官网在线 | 欧美国产精品一区 | 免费看的毛片 | 福利视频网站 | 国产精品毛片久久久久久久 | 日韩国产在线 | 狠狠操狠狠干 | 亚洲激情视频在线播放 | 九九天堂网 | 亚洲视频在线播放 | 亚洲精品一区二区网址 | 亚洲综合无码一区二区 | 一区日韩 | 国产一区欧美 | 久久99精品久久久久久琪琪 | 免费一区 | 日韩爱爱视频 | 一区二区久久 | 日韩在线播放一区 | 国产高清不卡在线 | 国产xxxx成人精品免费视频频 | 午夜剧 | 爱草在线| 亚洲韩国精品 | 欧美精品亚洲精品 | 伦理自拍 | 欧美精品一二三 | 香蕉成人啪国产精品视频综合网 | 久久精品国产99国产 | 日韩一区二区三区在线视频 | 亚洲视频一区二区三区 | av免费网站在线观看 | 久久久久久毛片免费观看 | 日韩毛片| 在线免费一级片 | 天天干狠狠干 | 欧美一级二级三级视频 | 国产免费av网站 | 碰在线视频| 精品欧美日韩 | 午夜午夜精品一区二区三区文 | 国产亚洲欧美一区二区 | 精品一二三四区 | 三级视频在线 | 国产精品久久久久一区二区三区 | 久草免费在线 | 欧美一级淫片免费看 | 欧美亚洲国产一区二区三区 | 国产一区二区在线播放 | 欧美第8页| 国产精品九九久久99视频 | 中文字幕一区在线观看 | 欧美福利一区二区 | 欧美日韩成人在线观看 | 精品美女一区 | 国产成人精品免费视频大全最热 | 国产日韩精品在线 | 国产情侣91| 色性av | 黄色大片网站在线观看 | 亚洲第一se情网站 | 国产精品久久久久久久久久久久久 | 欧美一区久久 | 91观看在线视频 | 亚洲一级视频在线 | 欧美国产日韩一区二区 | 欧美在线xxx| 日韩三区 | 久久成人一区 | 国产精彩视频 | 先锋久久| 亚洲成人免费在线 | 亚洲国产精品精华液网站 | 亚洲一二三区电影 | 天天天堂 | 日韩精品一区二区三区中文在线 | 日本三级在线观看中文字 | 国产网站视频 | 久久久久久一区 | 狠狠艹| 国产成人在线电影 | 久久国| 欧美视频免费在线 | 久久免费99精品久久久久久 | 狠狠狠狠狠狠干 | 精品国产一区二区在线 | 中国特级黄色片 | 国产精品美女久久久久久久网站 | 精品国产污网站污在线观看15 | 狠狠干av| 日韩视频二区 | 亚洲国产自产 | 久久人人爽爽爽人久久久 | 亚洲一区播放 | 最新久久精品 | 日韩精品视频三区 | 国产精品久久久 | 国产午夜视频 | 欧美国产综合 | 欧美成人精品在线观看 | 亚洲一区二区三区高清 | 国产一区二区视频在线 | 亚洲欧美日韩在线 | 古风h啪肉1v1摄政王 | 国产精品久久免费视频在线 | 国产精品天天干 | 福利片中文字幕 | 国产一区二区三区在线免费观看 | 精品一区二区三区三区 | 亚洲精品乱码久久久久久久久 | 免费观看一级特黄欧美大片 | 欧美久久久久久久久久伊人 | 在线观看精品自拍私拍 | 午夜精品久久久久久久 | 日韩免费在线 | 亚洲精品久久一区二区三区 | 激情婷婷 | 日韩福利一区二区 | 亚洲午夜精品久久久久久app | 久热精品视频 | 一级全黄性色生活片 | 欧美狠狠操 | 亚洲国产精品久久 | 亚洲av毛片 | 国产乱码久久久久久一区二区 | 国产精品九九九 | 成人三级视频网站 | 日韩在线播放一区二区三区 | 欧美精品一区二区三区中文字幕 | 超碰在线一区二区三区 | 免费一区二区三区 | 日本视频免费高清一本18 | 亚洲综合视频 | 91视频在线免费观看 | 久久久久综合 | 中文字幕一区二区三区日韩精品 | 日韩毛片在线视频 | 婷婷色国产偷v国产偷v小说 | 中国毛片基地 | 国产一区精品电影 | 亚洲一区视频 | 欧美一级做性受免费大片免费 | 亚洲欧美一区二区三区在线 | 日韩毛片一级 | 国产精品久久久久久久久久久久久久 | 99精品一区二区三区 | 性视频一区二区 | 一区二区三区在线播放 | 国产精品亚洲成在人线 | 国产成人黄色 | 亚洲精彩视频在线观看 | 国产精品久久久久一区二区三区 | 伊人影院在线观看 | 日韩精品免费在线观看 | av看片网| 一区二区成人在线 | 久久久久久久影院 | 99视频免费看 | 亚洲一区二区三区免费观看 | 在线欧美成人 | 九九福利 | 午夜影院在线观看视频 | 亚洲久久一区 | 国产精品日本一区二区在线播放 | 日本乱偷中文字幕 | 久久免费小视频 | 一级黄色影片在线观看 | 欧美久久精品 | 欧美视频一区 | 亚洲一区二区免费 | 国产精品久久久久久二区 | www国产成人免费观看视频,深夜成人网 | 一区二区三区 在线 | 91色乱码一区二区三区 | 美女操网站 | 精品在线一区二区 | 久久久精 | 国产超碰人人爽人人做人人爱 | 亚洲毛片| 中文字幕在线观看一区二区三区 | 91一区二区三区久久国产乱 | 国产aaaaav久久久一区二区 | 欧美高清视频在线观看 | 性培育学校羞耻椅子调教h 欧美精品网站 | 国产一区二区三区久久 | 91精品国产色综合久久 | www.成人在线视频 | 2020天天操| 国产91av视频在线观看 | 国内精品久久久久久影视8 91一区二区在线观看 | 欧美日韩中文字幕 | 国产91久久精品一区二区 | jizz国产免费 | 色综合一区 | 久久久夜夜夜 | 精品久久久久久久久久久久 | 全黄大全大色全免费大片 | 免费不卡视频 | 精品免费国产一区二区三区四区 | 欧美一级二级三级 | 在线观看毛片网站 | av片网站| 玖玖精品在线 | 中文字幕91 | 欧美日韩不卡在线 | 一级久久久 | 一区二区三区四区在线 | 亚洲一区二区三区久久久 | 久久久www成人免费精品 | 国产在线视频网 | 一区久久 | 在线看一区二区 | 久久久久久久国产 | 午夜欧美精品久久久久 | 中文字幕日韩久久 | 日韩一区精品视频 | 在线碰 | 久久亚洲91| 欧美日韩在线精品 | 黄色一级片在线看 | 免费一级毛片 | 久久一级 | 国产中文在线 | 男女视频在线 | a国产在线观看 | 91成人在线视频 | 亚洲a网| 91偷拍精品一区二区三区 | 欧美日韩电影一区二区 | 中文字幕av高清 | 亚洲精品日韩综合观看成人91 | 亚洲精品在线播放 | 欧美日韩在线看 | 久久成人一区 | 一级片在线免费观看视频 | 欧美一区二区三区精品 | 99福利视频 | 日本一二三视频 | 久久小视频 | 国产精品国产精品国产专区不卡 | 不卡视频一区 | 免费毛片网 | 第一色站| 精品久 | 精品不卡| 天堂网中文在线 | 欧美日韩中文 | 中字一区 | 黄网站免费在线 | 国产一区二区三区免费观看 | 福利视频网址导航 | 91精品国产乱码久久久久久久久 | 98精品国产高清在线xxxx天堂 | 天堂一区二区三区 | 日日草夜夜草 | 龙珠z在线观看 | av片在线免费观看 | 精品久久久久香蕉网 | 日本三级做a全过程在线观看 | 日韩av入口 | 欧美成人高清 | 国产精品免费看 | 国产免费拔擦拔擦8x高清在线人 | 亚洲精品99| 一区二区三区免费看 | 欧美一区免费 | 国产一区二区黑人欧美xxxx | 中文字幕第一页在线视频 | 国产欧美精品 | 国产一区二区av | 波多野结衣电影一区 | 成人亚洲一区二区 | 在线观看免费视频日韩 | 久久精品成人 | 欧美日韩国产一区二区三区 | 九九热视频在线 | 亚洲精品视频在线观看免费视频 | 日韩一区二区三区在线视频 | 亚洲欧美视频 | 免费二区 | xx视频在线观看 | 欧美一二三区 | 国产欧美精品一区二区三区 | 亚洲精品第一区在线观看 | 黄p在线看 | 2019国产精品| 91资源在线 | www.成人.com| 国产成人一区二区三区 | 日韩精品在线播放 | 99精品欧美一区二区蜜桃免费 | 九色av | caoporn免费 | 国产成人99久久亚洲综合精品 | 精品www| 999成人网 | 中文字幕 亚洲一区 | 亚洲视频中文字幕 | 午夜精品福利在线观看 | 色综合激情 | 99爱在线观看 | 国产精品女教师av久久 | 久草电影网 | 久久久一区二区三区 | 91不卡 | 亚洲免费在线观看 | 欧美精品在线视频 | 亚洲成av人片一区二区梦乃 | 夜夜久久 | 亚洲最黄视频 | 日韩电影中文字幕 | 日韩欧美专区 | 一区毛片 | 男女羞羞视频免费看 | 日韩专区一区二区三区 | 国产在线视频网 | 亚洲永久免费 | 日韩一级免费在线观看 | 免费看一区二区三区 | 国产专区在线视频 | av在线成人 | 免费国产网站 | 国产精品永久免费自在线观看 | www.久久 | 色九九 | 日韩视频国产 | 日本成人小视频 | 久久久久久免费看 | 91久久久精品视频 | 最近中文字幕免费观看 | 很黄很色很爽的视频 | 亚洲成人一区二区 | 丝袜 亚洲 另类 欧美 综合 | 手机看片亚洲 | 蜜桃视频一区二区 | 国产99一区二区 | 91视频18| 国产精品视频一二三 | 成人免费的视频 | 精品久久久蜜桃 | 在线中文视频 | 中文字幕亚洲字幕一区二区 | 激情婷婷 | 日韩专区一区二区三区 | 一区二区视频 | 日韩精品一区二区三区中文字幕 | 国产精品久久久久久福利一牛影视 | 国产精品视频一区二区三区 | 一本久久a久久精品亚洲 | 99久久久久 | 国产亚洲女人久久久久毛片 | 在线观看91 | 91欧美激情一区二区三区成人 | 欧美日韩国产精品一区二区亚洲 | 国产免费看 | 91激情视频 | 久草福利| 日日久| 精品在线看 | 看毛片网站 | 国产精品粉嫩白浆在线观看 |