黄a在线观看-黄a在线-黄a大片-黄色片在线看-黄色毛片免费-黄色大片网站

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

提高商業智能環境中DB2查詢的性能(2)

瀏覽:94日期:2023-11-08 11:10:37
方法 1:在事實表與三個維度表之間定義適當的參照完整性約束在 DB2 中,可以定義主鍵和外鍵約束,以答應數據庫治理器對數據實施參照完整性約束。外鍵等參照約束還有助于提高性能。例如,假如修改 清單 2 中的查詢中的子表達式 TMP1,去掉 PRODUCT_DIM 表上的本地謂詞,那么,假如在 SALES_FACT.PRODUCT_ID 上創建一個外鍵約束,則優化器會消除 SALES_FACT 和 PRODUCT_DIM 之間的連接。假如創建了外鍵約束,則那樣的連接被認為是無損的(lossless),可以從查詢中移除,因為查詢需要從 PRODUCT_DIM 中讀取的數據在 SALES_FACT 表中都有,在 PRODUCT_DIM 與 SALES_FACT 的連接中,只引用到 PRODUCT_DIM 的主鍵,而沒有引用 PRODUCT_DIM 的其它列。在 星型模式布局 小節中描述的星型模式中,維度中存在的每個 DATE_ID、PRODUCT_ID 和 STORE_ID 在事實表中也必須存在。每個 ID 在維度表中都是惟一的,由為每個維度表創建的主鍵約束標識。因此,事實表保存產品被售出時的歷史數據(定量)。下面的表描述了在這種模式中應該創建的主鍵和外鍵。維度中的每個惟一性 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:對事實表執行 ALTER 操作,創建它與維度表之間的適當的 FK 關系。通過上面的表查看事實表與維度表之間的關系。再創建 SALES_FACT 列(DATE_ID,STORE_ID)上的一個索引,以便與 方法 3 中描述的 MDC 方法進行比較,方法 3 使用 (DATE_ID,STORE_ID) 上的一個塊索引。清單 23. 在 SALES_FACT 表中創建外鍵約束和索引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:收集關于所有表的統計信息:優化器根據統計信息適當地計算備選查詢執行計劃(QEP)的成本,并選擇最佳計劃。在繼續下一步驟之前,我們需要收集一些統計信息。清單 25. 收集關于所有表的統計信息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;創建了外鍵之后,可以看看 DB2 優化器如何利用參照完整性來消除連接。步驟 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 工具查看查詢執行計劃:db2exfmt -d dss_db -g TIC -w -1 -n % -s % -# 0 -o join_elim.txt輸出在 join_elim.txt 中。要獲得關于 db2exfmt 工具的具體信息,可以使用 -h 選項。請打開 下載 小節中的 JOIN_ELIM 文件,看看查詢優化器生成的一個訪問計劃,其中與 PRODUCT_DIM 的連接已經被消除。可以查看 db2exfmt 輸出中的 "Optimized Statement" 部分,注重 PRODUCT_DIM 表已從查詢中移除。注重:使用外鍵之類的參照約束時,插入、刪除和更新操作可能無法正常執行。假如性能對于這些操作來說非常要害,但是連接排除優化在查詢中也比較有用,那么可以將外鍵約束定義為純信息型(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 工具查看查詢執行計劃:db2exfmt -d dss_db -g TIC -w -1 -n % -s % -# 0 -o test1.txt查詢執行計劃應該類似于 下載 小節中的 Test 1 所提供的查詢執行計劃。為了運行查詢,要使用 db2batch 工具來評測性能。在此之前,應該讓 db2 實例經過一個再循環過程,以便對每種方法進行公平比較,避免其它因素影響性能(例如,后面測試的方法可能受益于之前留下的緩沖池,從而歪曲了評測結果)。注重:在運行這些測試時,我們的測試系統是空閑的,沒有其他活動在運行。使用 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 表上創建了外鍵約束,但是,它們可能會影響插入、更新和刪除操作,因為數據庫治理器必須實施參照完整性。假如這些操作的性能很要害,并且參照完整性可由其它方法來實施,那么可以創建信息型約束,以繼續利用連接排除。否則,提供信息型約束會導致不正確的結果。信息型約束與參照約束的定義類似,只是最后加上了 not enforced 要害字,例如:ALTER TABLE SKAPOOR.SALES_FACT ADD CONSTRAINT DATE_DIM_FK FOREIGN KEY (DATE_ID) REFERENCES DATE_DIM NOT ENFORCED;接下來,為了完成該練習,還需撤銷在 SALES_FACT 表上創建的外鍵約束,并使用信息約束重復步驟 1A 至 1D。方法 2:復制維度表上的物化查詢表這里的測試使用的查詢和表與方法 1 相同,但是該方法還重復創建維度表上的 MQT。在方法 1 中,維度表在不同的分區中,必須在分區之間傳送數據。可以使用 MQT 將維度表復制到其它分區,以支持合并連接,避免在分區之間發送數據,從而提高查詢執行性能。步驟 2A:創建重復的 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;為了確保可以實現這種合并,重復的維度必須與事實表位于同一數據庫分區組中。為簡單起見,我們使用和事實表一樣的表空間,但是,只要是共用相同的數據庫分區組,也可以使用不同的表空間。而且,為了使優化器在計算不同備選訪問計劃的成本時,重復的表與底層表一致,重復的表應該有與底層表一樣的索引,并且應該收集相同的統計信息。由于不能在 MQT 上創建惟一的索引,所以在底層表的主鍵上創建常規索引。復制維度表會產生該表的一個額外的副本。在 DB2 9 中,新增了行壓縮功能,以節省存儲空間。為了減少維度表的額外副本的開銷,可以對其進行壓縮。當決定使用那樣的技術時,建議也壓縮重復的 MQT。否則,優化器可能會決定執行與底層維度表的非合并連接,因為它們被壓縮過,在規模上小于重復的 MQT。步驟 2B:更新數據庫 DSS_DB 的數據庫配置,將 dft_refresh_age 設置為 "ANY",以便優化器選擇重復的 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)。打開 下載 小節中的 Test 2,看看這個訪問計劃的一個例子。在上述訪問計劃中,不存在方法 1 中那樣的連接之間的表隊列(TQ)操作符,因為優化器選擇使用重復的維度表,從而答應合并連接。步驟 2D:確認訪問計劃中會訪問 MQT 之后,像 方法 1 中的步驟 1D 那樣,使用 db2batch 工具評測性能。在運行 db2batch 之前,應確保 db2 實例經過再循環過程。然后,記錄下結果。注重:對于該方法,要將數據庫配置參數 DFT_REFRESH_AGE 設置為 ANY on all Database Partitions。假如想再次運行方法 1 中的測試,則需要將 DFT_REFRESH_AGE 數據庫配置參數更新為 "0"。否則,就會使用重復的 MQT,而不是使用基本維度表。練習1、使用行壓縮來壓縮基本維度表 STORE_DIM、PRODUCT_DIM 和 DATE_DIM。您將需要重新收集所有這三個維度表的統計信息。重新收集好統計信息后,重復步驟 2C 至 2D。2、假如優化器沒有選擇訪問第一個練習中的重復 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 小節中的以下公式。數據庫中用于每個用戶表的 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 字節(列長度的總和:10+4+4+4+4+100)。因此,RECORDS_PER_PAGE = ROUND DOWN (4028 / (126+10)) = 29。RECORDS_PER_PAGE 公式中額外的 10 個字節用于開銷。存儲 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:創建 EXTENTSIZE 大小為 12 的 MDC 表空間:清單 33. 創建 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:創建 MDC 表清單 35. 創建 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)上自動創建的。步驟 3D:將數據插入 MDC 表。在我們的測試環境中,將數據插入 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 的優點。下面的清單 39 描述了新的查詢。像方法 1 的步驟 1C 一樣,以解釋模式編譯該查詢,并生成主查詢的 db2exfmt 輸出。檢查訪問計劃是否使用了 MDC 索引,并且看上去像 下載 小節中的 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 那樣,將實例再循環,然后使用 db2batch 工具評測性能。注重:QUERY1.SQL 文件中的查詢被更改,以反映 清單 39 中的查詢。記錄下結果。方法 4:表分區和重復的維度上的 MQT這個測試類似于 方法 2,但是用一個表分區事實表替代了 SALES_FACT 表。表分區是 DB2 9 中的新功能。它是一種數據組織模式,按照這種模式,根據一個或多個表列中的值,表數據被劃分到多個被稱作數據分區的存儲對象中。每個數據分區是一個單獨的物理實體,可以在不同的表空間中,也可以在相同的表空間中,或者兩者相結合。這種模式對于 BI 環境中非常大的表比較有益,它可以簡化數據的轉入(roll-in)和轉出(roll-out),根據應用的謂詞避免掃描不需要訪問的分區,從而提高查詢執行效率。步驟 4A:創建分區表第一步是確定適當的分區范圍。日期經常用于作為分區范圍,因此我們將根據 SALES_FACT 的 DATE_ID 列對表進行分區。Info Center 提供了關于定義分區表范圍的更多具體信息。 由于 SALES_FACT 表由全年的事務組成,而我們的查詢是比較各個月份的銷售量,因此每個范圍由一個月的數據組成。為了演示分區表對數據轉入的簡化作用,先從包含一月份這個范圍的分區表開始,然后附加表示接下來每個月的分區:清單 40. 創建分區 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;在我們的測試環境中,填充所有分區花了大約 3 個小時。而將表附加(attach)到每個分區則比較快。表一旦被附加到分區之后,它就成為 SALES_FACT_TPART 表的一個物理實體,不能再將其當作單獨的表來查詢。假如想那樣做的話,必須將表與 SALES_FACT_TPART 表分離開來。步驟 4B:修改 清單 2 中的查詢,將表名從 "SALES_FACT" 改為 "SALES_FACT_TPART",以測試分區消除的優點。下面的清單 42 描述了這個新的查詢。像 方法 1 的步驟 1C 那樣,以解釋模式編譯該查詢,并生成主查詢的 db2exfmt 輸出。檢查訪問計劃是否使用了分區表,這就像 下載 小節中的 TPART。清單 42. 分區表查詢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 輸出中,關于分區表訪問的具體信息表明是否發生了分區排除以及訪問了哪些分區: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 參數指示是估計分區消除(TRUE)還是在編譯時精確計算分區消除(FALSE)。假如已估計,那么在運行時確定實際的分區消除。在這個例子中,分區消除是在編譯時計算的。DPLSTPRT 參數指示訪問哪些分區,DPNUMPRT 指示所訪問的分區的數量。假如 DPESTFLG 為 TRUE,那么這兩個值由優化器估算。在這個例子中,只有一個分區,即分區 10 被訪問。其余分區被忽略。DP Elim Predicates 部分列出了用于確定訪問哪些分區的謂詞。步驟 4C:像 方法 1 中的步驟 1D 那樣,對實例進行再循環,并使用 db2batch 工具評測性能。注重:QUERY1.SQL 文件中的查詢被修改,以反映清單 42 中的查詢。記錄下結果。練習1、索引可以幫助提高使用分區表 SALES_FACT_TPART 的查詢的性能。創建一個或多個可能有用的索引,并重復步驟 4B 和 4C。別忘了收集關于索引的統計信息。2、試著將一個或多個分區與 SALES_FACT_TPART 表分離開來,感覺一下如何通過使用分區表輕松而有效地轉出數據。方法 5:表分區、MDC 和重復的維度上的 MQT這個測試類似于 方法 4,但是用一個分區 MDC 事實表替代了 SALES_FACT_TPART 表。可以將 MDC 和表分區相結合,進一步提高查詢的性能。與 方法 3 采用了相同的技術,使用 DATE_ID 和 STORE_ID 列作為維列,采用了與方法 4 一樣的范圍和 DATE_ID。步驟 5A:創建分區 MDC 表清單 43. 創建分區 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 與分區消除相結合的優點。下面的清單 45 描述了這個新的查詢。像 方法 1 的步驟 1C 那樣,以解釋模式編譯該查詢,并生成主查詢的 db2exfmt 輸出。檢查訪問計劃是否使用了分區表和塊索引,它看上去像 下載 小節中的 TPART_MDC 一樣 。清單 45. 分區 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 那樣,將實例再循環,然后使用 db2batch 工具評測性能。注重:QUERY1.SQL 文件中的查詢被更改,以反映清單 39 中的查詢。記錄下結果。方法 6:使用 MQT 預先計算聚合結果這個測試類似于 方法 1,但是增加 MQT,以便預先計算聚合值。使用 MQT 物化表達為聚合的結果可以顯著提高查詢性能。在 清單 2 中描述的每個查詢中,向外連接的每個分支由相同連接上的一個聚合組成。惟一的不同是應用于事實表的本地謂詞。假如可以在執行查詢之前預先計算連接,則可以顯著提高查詢執行性能。步驟 6A:創建和刷新 MQT清單 46. 創建 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 中創建的兩個索引 MQT2_IND3 和 MQT2_IND4 用于提高從 MQT 訪問數據的性能。步驟 6B: 收集關于 MQT 統計信息,并調整模式,以符合您的環境:清單 48. 收集關于 MQT 表的統計信息DB2 RUNSTATS ON TABLE SKAPOOR.MQT2 WITH DISTRIBUTION AND INDEXES ALL步驟 6C:像 方法 1 的 STEP 1C 那樣,解釋 清單 2 中的查詢,并生成 db2exfmt 輸出。然后,查看訪問計劃。應該可以看到,訪問計劃選擇 MQT 和 MQT2,并使用一個連接操作符,以完成兩個 MQT 的向外連接。這個訪問計劃看上去應該類似于 下載 小節中的 Test 6。假如沒有選擇 MQT,則應確保在所有數據庫分區上的數據庫配置中 DFT_REFRESH_AGE 被設為 "ANY";否則,優化器不會考慮 MQT。STEP 6D: 像 方法 1 中的步驟 1D 那樣,將實例再循環,并使用 db2batch 工具評測性能。現在,記錄下結果。考察每種方法對查詢執行性能的效果注重:所有測試都是在沒有其它其他活動在運行的環境中執行的。下面的表列出了在我們的系統上使用 db2batch 工具測到的每種方法所用的時間(單位為秒)。方法 查詢 所用時間(秒) 1. 參照完整性約束清單 2115.002. 重復的 MQT清單 2103.423. 多維集群和重復的 MQT清單 3938.364. 表分區和重復的 MQT清單 42197.745. 表分區、MDC 和重復的 MQT清單 4532.216. 使用 MQT 預先計算聚合結果清單 27.61結果表明,使用 MQT 預先計算聚合結果可以提高查詢性能的效果最為顯著。與 方法 1 中基本的星型模式布局相比,多維集群,以及表分區與 MDC 的組合,也可以顯著提高查詢性能。在我們的環境中,重復的維度表可以略微提高性能。這是因為所有 4 個數據庫分區都是邏輯分區,是在同一臺物理機器上創建的。假如為數據庫分區使用多臺物理機器,那么這種方法應該可以顯著提高性能,尤其是當數據庫分區之間需要大量傳送數據時,這種方法的效果尤為明顯。表分區本身實際上會使性能變得更糟。我們的測試中未創建任何索引來比較分區消除。事實表上的附加謂詞進一步過濾向外連接每個分支中訪問的分區。在表上創建一個或多個索引的另一個優點是可以取得更好的性能。這是 方法 4 中留給讀者的一個練習。這些測試表明,使用 DB2 9 中的各種特性可以提高 BI 查詢的性能。結束語本文中討論的這些方法只是提高 BI 環境中查詢性能的一部分方法。請動手完成下一小節及本文各處所提供的練習。
標簽: DB2 數據庫
主站蜘蛛池模板: 国产剧情自拍 | 99久久婷婷国产综合亚洲 | 久久久久久国产精品免费播放 | 欧美三级免费看 | 爽爽窝窝午夜精品一区二区 | 一级特黄aaa毛片在线视频 | 四虎地址8848精品 | 天天干天天爽天天射 | 玖玖久久 | 国产a免费 | 岛国av中文字幕 | 男人的天堂毛片 | 97精品伊人久久久大香线蕉97如何观看 | 娇妻玩4p被三个男人伺候电影 | 男人的天堂无码动漫av | 色婷婷婷婷| 亚洲天堂免费视频 | 亚洲乱码一区av黑人高潮 | 午夜av亚洲翘臀国产精网 | 中文娱乐综合网777 中文在线第一页 | 毛片在线观看视频 | 天天爽夜夜爽夜夜爽精品视频 | 欧美最猛黑人xxxx黑人猛交 | 亚洲成人av免费在线观看 | 国产精品内射视频免费 | 天堂8在线天堂资源bt | 狠狠色婷婷久久一区二区三区 | 欧美成人三级在线视频 | a级大胆欧美人体大胆666 | 人与禽性视频77777 | 久久人人爽人人爽人人av | 波多野结av衣东京热无码专区 | 亚洲一区二区高潮无套美女 | 亚欧无线一线二线三线区别 | 在线www| 69精品国产| 日日噜噜夜夜狠狠 | 欧美精品偷拍 | 奶罩不戴乳罩邻居hd播放 | 夜夜性日日交xxx性视频 | 久久精品一区二区三区中文字幕 | 99国产午夜精品一区二区天美 | 丝袜理论片在线观看 | 色婷婷一区二区三区av免费看 | 97视频在线观看播放 | 国产精品888| 人妻夜夜爽天天爽三区丁香花 | 可以直接观看的av | 在线看片人成视频免费无遮挡 | 亚洲欧美一区二区爽爽爽 | 蜜桃视频成人在线观看 | 刺激鲁cijilu在线观看 | 天天躁日日躁狠狠躁免费麻豆 | 巨肉超污巨黄h文小短文 | 欧美看片| 日本精品视频一区二区 | 麻豆aⅴ精品无码一区二区 午夜福制92视频 | 夜夜精品视频 | 国产性xxxx18免费观看视频 | 久久青青草视频 | 一级片视频在线观看 | 免费的av | 国产又粗又黄又长又爽动漫 | 国产视频第一页 | 在线免费观看黄网站 | 国产成人欧美综合在线影院 | 国产一二在线观看 | 久操网站| 肉色超薄丝袜脚交一区二区蜜av | 国产精品高潮久久久久 | 日韩高清专区 | 91精品国产综合久久久蜜臀 | 日批视频在线看 | 黄色av免费播放 | 交视频在线播放 | 国产理论片 | 影音先锋男人色 | 欧美一级三级在线观看 | 亚洲天堂性 | 亚洲熟女乱色综合亚洲小说 | 中文在线а天堂中文在线新版 | 美丽姑娘免费观看在线观看 | 香蕉视频官网 | 国产精品久久久久久久久久久久久久久久 | 国产精品久久久久久模特 | 国产午夜性爽视频男人的天堂 | 亚洲国产精品福利片在线观看 | 国产高潮久久久 | 成人性生交大片免费看视频hd | 乡野欲潮:绝色村妇 | 国产白丝精品91爽爽久 | 直接在线观看的三级网址 | 丰满白嫩欧洲美女图片 | 特黄特色大片免费观看播放器 | 亚洲精品一区在线 | 成人国产精品久久久春色 | 国产精品一区二区人人爽79欧美 | 国产精品久久久久久久妇 | 91精产国品一二三产区区 | 国产亚洲综合在线 | 国产高潮好爽受不了了夜夜做 | 精品国产一区二 | 日本熟妇色一本在线视频 | 色婷婷综合久久久中文字幕 | 亚洲一级伦理 | 成年人福利视频 | 一二三四视频社区在线 | 91调教打屁股xxxx网站 | 美女国内精品自产拍在线播放 | 18禁超污无遮挡无码免费游戏 | 国产精品成人免费一区久久羞羞 | 中国极品少妇xxxxx小艳 | 色老大视频 | av成人天堂 | 久久久国产精品亚洲一区 | 日韩欧美一级片 | 欧美性久久久久 | 国产亚洲精品久久久久久移动网络 | 精品人伦一区二区三区潘金莲 | 久久99精品久久久久久无毒不卡8 | 亚洲综合在线视频 | 亚洲自拍偷拍另类 | 国产丰满农村老妇女乱 | 日本在线播放视频 | 免费观看日批视频 | 黄色免费的视频 | 久久精品国语 | 国产黄色一区 | 国产一区二区三区在线观看 | 免费一级做a爰片性色毛片 免费一级做a爰片性视频 | 亚洲成人生活片 | 一级片免费观看 | 99蜜桃臀久久久欧美精品网站 | 国产精品入口麻豆www | 九九久久精品国产av片国产 | 亚洲v欧美v日韩v国产v | 日韩中文字幕免费看 | 欧美巨波霸乳影院 | 狠狠躁天天躁夜夜躁婷婷 | 海角社区在线视频播放观看 | 久久婷婷丁香 | 国产成人无码精品午夜福利a | 日日夜夜爽爽 | 正在播放木下凛凛88av | 精品视频久久久久久久 | 国产精品爱久久久久久久电影蜜臀 | 亚洲国产成人a精品不卡在线 | 在线观看肉片av网站免费 | 国产一级爱c视频 | 五月天激情综合 | 国产aⅴ激情无码久久久无码 | 国色天香中文字幕在线视频 | 亚洲深夜福利视频 | 精品国产成人av在线免 | 亚洲第一av网 | 日韩成人在线网站 | 国精产品一区一区三区视频 | 亚洲色播永久网址大全 | 秋霞在线中文字幕 | 凹凸精品熟女在线观看 | 手机在线看片国产 | www日| 午夜婷婷在线观看 | 国产一区二区三区精品视频 | 国产成人精品一二三区 | 国产精品毛片一区二区在线看舒淇 | 亚洲日韩看片无码超清 | 色婷婷一区二区三区av免费看 | 五月99久久婷婷国产综合亚洲 | 国产精品伦一区二区 | 狠狠干天天干 | 免费人成网站视频在线观看 | 日韩欧美麻豆 | 日本高清视频网站www | 又粗又硬又猛又黄网站在线观看高清观看视频 | 男女猛烈xx00免费视频试看 | 摸少妇的奶她呻吟不断爽视频 | 99久热在线精品 | 亚洲国产精品综合久久网各 | 欧美放荡的少妇 | 成年人黄色大片大全 | 亚洲免费小视频 | 成人毛片100免费观看 | 国产精品亚韩精品无码a在线 | 开心激情婷婷 | 久久久精品美女 | 波多野结衣不卡 | 国产乱码一区 | 中文字幕人乱码中文 | 五月天综合激情 | 中国免费毛片 | 欧美夜夜爽| 疯狂做受xxxx欧美肥白少妇 | 91精彩视频 | 性淫影院 | 国产一区二区3区 | 亚洲欧美中文日韩在线 | 亚洲最大成人网色 | 91正在播放 | 婷婷九九| 黄色一区二区三区 | 国产成人秘密网站视频999 | 国产成人无码a区在线观看导航 | 日韩精品亚洲人成在线观看 | 五月香婷婷| 伊人天堂av| 成年人视频免费看 | 欧美性色黄大片a级毛片视频 | 91久久精品国产91性色69 | 日本美女色片 | 曰本女人与公拘交酡免费视频 | 日韩免费av片 | 看全色黄大色黄大片大学生 | 热久久久久久久 | 免费观看日韩毛片 | 丁香啪啪综合成人亚洲小说 | 久久久久九九九 | 扒开女人内裤猛进猛出免费视频 | 欧美三日本三级三级在线播放 | 亚洲欧美网站 | 深夜免费福利视频 | 成人高潮片免费软件69视频 | 国产精品aaa| 草草影院发布页 | 久久久在线视频 | 亚洲午夜精品在线观看 | 成熟妇人a片免费看网站 | 欧美日韩在线成人 | 国产精品女丝袜白丝袜 | 秋霞福利片 | 欧美成人精品一区二区三区 | 久久亚洲人成网站 | 久久久国产99久久国产久灭火器 | 久久精品一区 | 久久综合激的五月天 | 国内精品久久久久久久久久久 | 国产在线无码精品电影网 | 免费无码成人av片在线在线播放 | 探花视频免费观看高清视频 | 99精品欧美一区二区三区综合在线 | 成年人视频网址 | 任你操这里只有精品 | 午夜福利伦伦电影理论片在线观看 | 欧美黄色性视频 | 在线观看免费黄色av | 亚洲老妈激情一区二区三区 | 久草在线青青草 | 4438x成人网全国最大 | a视频在线播放 | 一级黄色片久久 | 国产成人无码av | av永久在线 | 国产成人无码一区二区三区 | 亚洲天堂黄 | 欧美三级不卡 | 国产精品白丝喷水在线观看 | 国产嫩草影院久久久久 | 欧美色淫 | 美女内射视频www网站午夜 | 欧美日韩中文国产 | 护士的小嫩嫩好紧好爽 | 在线免费观看成人 | 亚洲成人一区二区在线观看 | 日本大学生三级三少妇 | 国产98在线 | 欧美 | 樱花草涩涩www在线播放 | 国内精品久久久久伊人av | 蜜桃91麻豆精品一二三区 | 性色av无码久久一区二区三区 | 91免费影片| 色婷婷18| 99久久综合狠狠综合久久止 | 粗壮挺进人妻水蜜桃成熟 | 大肉大捧一进一出好爽mba | 浴室里强摁做开腿呻吟男男 | 精品一区二区三区av | 日韩精品第二页 | 白嫩少妇和二男三p爽的大声呻吟 | 中文字幕一区二区人妻电影 | 国产欧美黑寡妇久久久 | 色激情五月 | www.国产二区 | 天海翼一区二区三区四区演员表 | 国产日韩欧美中文字幕 | www在线视频| 天堂中文av在线 | 国产精品成人av片免费看最爱 | 国产精品片一区二区三区 | 中文日韩一区二区 | 亚洲日韩欧美一区二区在线 | 亚洲www.| 日本一区二区三区视频在线 | 欧美精品aa | 97久久精品人人 | 欧美一级大黄 | 精品国产成人一区二区三区 | 91精品国自产 | 麻豆chinese | 成人av专区| 国产成人啪精品 | 久久久久久久岛国免费网站 | 亚洲精品午夜aaa久久久 | 亚洲精品v日韩精品 | 天天躁夜夜躁天干天干2020 | 中文字幕天天躁日日躁狠狠躁免费 | 久久春色| 亚洲精品乱码久久久久久蜜桃 | 精品视频网站 | 欧美第一视频 | 国精产品一区二区三区黑人免费看 | 久久久久久一区国产精品 | 男女一边摸一边做爽爽 | 国产在热线精品av | www17ccom喷水少妇 | 亚洲伦理99热久久 | 欧美日韩一区免费 | 岛国片免费在线观看 | 看片网址国产福利av中文字幕 | 国产精品视频免费看人鲁 | 少妇口述偷人好爽的一次 | 欧美三级成人理伦 | 日本福利一区二区 | 日日夜夜天天 | 中文字幕1 | 午夜精品久久久久久久四虎 | 一本色道无码道dvd在线观看 | 国产又大又长又粗 | 久久久久久亚洲国产 | 亚洲国产人午在线一二区 | 黄色高清无遮挡 | 91在线视频免费观看 | 久久久久人妻精品一区三寸 | 男女爽爽| 九色综合网 | 日本免费黄色小视频 | 99噜噜噜在线播放 | 激情五月婷婷色 | 久久免费高清视频 | 国产偷国产偷精品高清尤物 | 三级黄毛片 | 国产精品亚洲аv无码播放 露脸内射熟女--69xx | www片香蕉内射在线88av8 | 久久久一本 | 3d成人动漫在线观看 | 国产在线视频一区二区三区 | 国产精品无码无卡无需播放器 | 女人精69xxxⅹxx猛交 | 狠狠亚洲超碰狼人久久 | 亚洲一区在线免费 | 国产成人av大片大片在线播放 | 无码精品a∨在线观看中文 亚洲熟妇自偷自拍另欧美 无码少妇a片一区二区三区 | 成人精品亚洲人成在线 | 性免费网站 | 国产视频麻豆 | 水野朝阳av一区二区三区 | 日本在线免费观看视频 | 日韩av一二区 | 愉拍自拍第43页免费 | 粗暴肉开荤高h文农民工免费视频 | 国产精品久久久久久久久久久久午夜片 | 分分操免费视频在线观看 | 欧美国产一二三区 | 亚洲aⅴ在线无码播放毛片一线天 | 日本福利社 | 91另类| 麻豆tube | 欧美中字 | 中文字幕综合网 | 无码任你躁久久久久久久 | 国产精品久久久久久久久夜色 | 超碰人人草 | 99国产精品无码专区 | 欧美色视频网站 | 国产精品刘玥久久一区 | 国产麻豆md传媒视频 | 日韩少妇内射免费播放18禁裸乳 | 色婷婷一区二区三区av免费看 | 日韩新片王网 | 国产精品igao视频网 | 亚洲中文无码永久免费 | 久久乐国产精品亚洲综合 | 久久久久久久久久久国产 | 男女做aj视频免费的网站 | 免费人成在线观看网站 | 国产一区91精品张津瑜 | 亚洲综合免费视频 | 亚洲不卡视频 | 精品伦一区二区三区免费视频 | 污污视频网站在线免费观看 | 沈阳熟女露脸对白视频 | 欧美性xxxx极品hd欧美风情 | 亚洲国产av无码综合原创国产 | 99久久99这里只有免费费精品 | 精品国产一区二区三区久久 | 亚洲精品国品乱码久久久久 | 亚洲色大成网站www国产 | 亚洲18在线看污www麻豆 | 91极品国产 | 人禽l交视频在线播放 视频 | 国产精品高清网站 | 欧美激情第1页 | 国产免费久久精品国产传媒 | 深夜成人福利 | 日韩av高清在线播放 | 在线国产区 | 亚洲特黄 | 日韩成人av在线播放 | 国产精品久久久久一区二区国产 | 亚洲国产成人久久精品大牛影视 | 高清久久久 | 美女隐私黄www网站免费 | 国产黄色录像 | 亚洲综合色吧 | 国产精强码久久久久影片at | 大陆极品少妇内射aaaaa | 77777_亚洲午夜久久多人 | 亚洲天堂免费 | 中文字日产幕乱五区 | 久久精品无码一区二区小草 | 怡红院成人av| 精品视频国产香蕉尹人视频 | 白嫩大乳丰满美女白嫩白嫩 | 色撸撸在线观看 | 91porn国产成人福利论坛 | 精品无码一区二区三区的天堂 | 国产jizz18高清视频 | 热99在线观看| 97精品超碰一区二区三区 | 日本理论片 | 色噜噜狠狠一区二区三区 | 免费av一区二区 | 欧美性jizz18性欧美肥胖脸 | a级毛片在线免费 | 巨胸爆乳美女露双奶头挤奶 | 国产艳妇疯狂做爰视频 | 欧美激情久久久久久 | 久久精品视频3 | 欧美顶级少妇做爰hd | 中国女人啪啪69xxⅹ偷拍 | 亚洲精品久久久久久久蜜桃 | 久久强奷乱码老熟女网站 | 性欧美在线视频观看 | 国产v亚洲v天堂a无码99 | 亚洲国产一区二区精品 | 777欧美| 中文字幕制服诱惑 | 国产精品久久久久久无码 | 国产成人在线一区二区 | 亚洲成人第一区 | 国精品无码一区二区三区左线 | 久久99精品久久久久子伦 | 又大又长粗又爽又黄少妇毛片 | 女仆乖h调教跪趴1v1 | 国产精品原创av片国产日韩 | 亚洲色欲在线播放一区二区三区 | 亚洲国产aⅴ成人精品无吗 亚洲国产aaa | 国产成人a v | 日韩有码专区 | 少妇饥渴难耐 | 人妻无码视频一区二区三区 | 美女二区| 800av在线视频 | 国产激情综合在线观看 | 国产18毛片 | 乌克兰丰满少妇毛片 | 成人av在线影院 | 激情综合色五月六月婷婷 | 69精品久久久久久久 | 国产成人毛毛毛片 | 福利一区二区三区视频在线观看 | 精品蜜桃一区二区三区 | 日韩在线一二三 | 久久久久久999 | 噜噜噜av | 农村乡下女人毛片 | 快灬快灬一下爽69 | 狠狠婷| 中文字幕精品一区二区精品 | 图书馆的女友动漫在线观看 | 免费黄色国产 | 久久影院国产 | 伊人成人免费视频 | 欧美日韩精品在线视频 | 日韩的一区二区 | 军人粗大的内捧猛烈进出视频 | 亚洲人成网站在线播放942 | 久久久精品波多野结衣av | 亚洲图片另类小说 | 天天综合入口 | 欧美日韩一区二区三区在线 | 女被男啪到哭的视频网站 | 丰满岳妇乱一区二区三区 | 欧美性插插 | 亚洲美女视频网站 | 日本大尺度吃奶做爰过程 | 亚洲色图150p | 影音先锋中文字幕在线播放 | 国产日韩av在线播放 | 岛国精品在线观看 | 中文字幕亚洲乱码熟女在线萌芽 | 国内精品一区二区三区不卡 | 91色乱码一区二区三区 | 国产成人三级在线 | 亚洲天堂一区二区 | 日批免费网站 | bbbbbbbbb毛片大片按摩 | 国产在线视欧美亚综合 | 天堂va在线| 无码av专区丝袜专区 | 日韩福利在线播放 | 日韩中文一区二区三区 | 青青草视频成人 | 国产传媒一区二区三区 | 欧洲精品一区二区三区 | 亚洲 中文字幕 日韩 无码 | 久久久久久久亚洲精品 | 午夜无码人妻av大片色欲 | 久久久亚洲色 | 欧洲av片| 成人动漫在线观看视频 | 丰满少妇理论片在线观看 | 亚洲欧洲日韩在线 | 免费看污的网站 | 久久久999久久久 | 欧美一级不卡视频 | 国产精品女同 | 欧美在线观看网站 | 老女人伦理中文字幕 | 9l视频自拍蝌蚪9l视频成人 | 在线看网站 | 区二三区四区精华日产一线二线三 | 久久久精品免费 | 久久久久久久91 | aaa少妇高潮大片免费看 | 精品国产一区二区三区av爱情岛 | 中文字幕在线观看亚洲视频 | 国产美女高潮一区二区三区 | 国产精品www老牛影视 | 久久久久香蕉国产线看观看伊 | 国产v在线观看 | 大色综合色综合网站 | 久久狼人亚洲精品一区 | 国产欧美日韩精品a在线观看 | 69亚洲精品久久久蜜桃 | 日本老熟妇毛茸茸 | 欧美乱妇无乱码大黄a片 | 成人性生交大片免费网站 | 一区二区三区免费观看视频 | 波多野结衣美乳人妻hd电影欧美 | 日韩裸体人体欣赏pics | 国产精品久久久久aaaa九色 | 毛片无码国产 | 久久成人免费网 | 韩国和日本免费不卡在线v 婷婷俺也去俺也去官网 | 红杏成人免费视频 | 久久99精品国产99久久6男男 | 午夜乱码爽中文一区二区 | 日韩毛片在线视频 | 日日草草| 欧亚乱熟女一区二区在线 | 妹子干综合网 | 国产成人无码专区 | 91av毛片| 97国产资源 | 色拍拍欧美视频在线看 | 粉嫩粉嫩一区二区三区在线播放 | 成人影片在线 | 婷婷超碰| 欧美肥妇多毛bbw | 朝鲜一级特黄真人毛片 | 亚洲色欲一区二区三区在线观看 | 欧美在线a | 日韩精品一区二区av在线 | 少妇久久久久久被弄高潮 | 99国产欧美另类久久久精品 | 韩国三级bd高清中字2021 | 国产无遮挡裸体免费视频在线观看 | 野花国产精品入口 | 特黄少妇60分钟在线观看播放 | 理论片毛片 | 国产精品久久久久久久久久久久久久 | 初尝人妻少妇中文字幕 | 精品福利一区二区 | 日本一区免费视频 | 夜夜春很很躁夜夜躁 | 久久久1| 欧美久久网| 永久黄网站色视频免费 | 日产一二三四五六七区麻豆 | 成人免费毛片男人用品 | 成人夜夜 | 成人在线免费高清视频 | 天天爽 | 乳女教师の诱惑julia | www国产精品| 日韩av高清 | juliaann精品艳妇在线 | 国产毛片高清 | 日本人乱人乱亲乱色视频观看 | 婷婷精品国产欧美精品亚洲人人爽 | 久久综合给合久久狠狠狠97色69 | av噜噜在线观看 | 中文字幕最新在线 | 女神思瑞女神久久一区二区 | 精品国产第一国产综合精品 | 亚洲欧洲中文字幕 | 久久精品老司机 | 狠狠干狠狠撸 | 祥仔av免费一区二区三区四区 | 波多野结衣91 | 少妇久久精品 | 国产毛片精品一区二区 | 日韩久久久久 | 午夜av在线免费观看 | 2019中文字幕在线 |