Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
OOW 2013
Qualifications
Co-author
1. 2. 3. 4. 5. Oracle8 Data Warehousing, 1998 John Wiley & Sons Essential Oracle8i Data Warehousing, 2000 John Wiley & Sons Oracle Insights: Tales of the Oak Table, 2004 Apress Basic Oracle SQL 2009 Apress Expert Oracle Practices: Database Administration with the Oak Table, 2010 Apress C programmer/developer, system admin, network admin (1984-1990) Consultant and technical consulting manager at Oracle (1990-1998) Independent consultant (http://www.EvDBT.com) since 1998 B of D, Rocky Mountain Oracle Users Group (http://www.RMOUG.org) since 1995 B of D, Oracle Developer Tools Users Group (http://www.ODTUG.com) since 2012 Oak Table network (http://www.OakTable.net) since 2002 Oracle ACE since 2007, Oracle ACE Director since 2012
29 years in IT
OOW 2013
Agenda
1. Dimensional data models and DW/BI apps 2. Join methods in Oracle
Cartesian, NL, SM, HA, and STAR
OOW 2013
OOW 2013
Dimensional Modeling
Customers
Suppliers
Orders
Products
Order Facts
Order Lines
Customers Dim
Time Dim
OOW 2013
Fact table
Dim Table 4
OOW 2013
Star transformation:
Filter on query set in each dimension Merge result set from all dimensions Join to the fact from merged result set, using BITMAP MERGE index scan
Dim Table 3
Dim Table 4
OOW 2013
CBO statistics
Must be gathered first
OOW 2013
OOW 2013
Because that is all that the database can do Designation subtly shifts from data warehouse or data mart to staging system Oracle is junk!
10
OOW 2013
Catch-22? Does this mean that the Oracle RDBMS cannot handle large data warehouses?
11
OOW 2013
12
OOW 2013
13
star_transformation_enabled = false
| | |* | | | | | | | | |* | |* |* | | | |* | | | | |* |* | |* |* | | | | | |* |* |* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | SELECT STATEMENT | | SORT GROUP BY | | TABLE ACCESS BY LOCAL INDEX ROWID | | NESTED LOOPS | | MERGE JOIN CARTESIAN | | MERGE JOIN CARTESIAN | | MERGE JOIN CARTESIAN | | MERGE JOIN CARTESIAN | | TABLE ACCESS BY INDEX ROWID | | BITMAP CONVERSION TO ROWIDS | | BITMAP AND | | BITMAP INDEX SINGLE VALUE | | BITMAP OR | | BITMAP INDEX SINGLE VALUE| | BITMAP INDEX SINGLE VALUE| | BUFFER SORT | | TABLE ACCESS BY INDEX ROWID | | BITMAP CONVERSION TO ROWIDS| | BITMAP INDEX SINGLE VALUE | | BUFFER SORT | | TABLE ACCESS BY INDEX ROWID | | BITMAP CONVERSION TO ROWIDS | | BITMAP AND | | BITMAP INDEX SINGLE VALUE | | BITMAP INDEX SINGLE VALUE | | BUFFER SORT | | TABLE ACCESS BY INDEX ROWID | | INDEX RANGE SCAN | | BUFFER SORT | | INDEX FAST FULL SCAN | | PARTITION RANGE ALL | | BITMAP CONVERSION TO ROWIDS | | BITMAP AND | | BITMAP INDEX SINGLE VALUE | | BITMAP INDEX SINGLE VALUE | | BITMAP INDEX SINGLE VALUE | | | W_SALES_ORDER_LINE_F | | | | | | W_DAY_D | | | W_DAY_D_M17 | | W_DAY_D_M16 | W_DAY_D_M16 | | W_USER_D | | W_USER_D_M5 | | W_INT_ORG_DH | | | W_INT_ORG_DH_M23 | W_INT_ORG_DH_M15 | | W_STATUS_D | W_STATUS_D_U2 | | W_XACT_TYPE_D_U2 | | | | W_SLS_ORD_LN_F_F26 | W_SLS_ORD_LN_F_F32 | W_SLS_ORD_LN_F_F56 | 1 1 1 1 54 1 1 1 1 | 169 | | 169 | | 46 | | 169 | | 6642 | | 105 | | 70 | | 36 | | 25 | | | | | | | | | | | | | | 11 | | 11 | | | | | | 34 | | 34 | | | | | | | | | | 35 | | 35 | | | | 36378 | | 36378 | | | | | | | | | | | | | 6455 6455 6454 6454 65 62 60 8 3 (1)| (1)| (1)| (1)| (0)| (0)| (0)| (0)| (0)| | | | | | | (0)| (0)| | | (0)| (0)| | | | | (0)| (0)| (0)| (0)| (0)| | | | | | | 00:01:57 00:01:57 00:01:57 00:01:57 00:00:02 00:00:02 00:00:02 00:00:01 00:00:01 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
OOW 2013
1 1 1 1
5 8 52 60
1 1 2 2021 2021
2 2 1 63 3
14
star_transformation_enabled = false
OOW 2013
15
star_transformation_enabled = true
| | | |* |* | | | | |* | |* |* | | | | | | | | |* | | | |* | |* |* |* | |* | | | |* | 0 1 2 3 4 5 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | SELECT STATEMENT | TEMP TABLE TRANSFORMATION | LOAD AS SELECT | TABLE ACCESS BY INDEX ROWID | INDEX SKIP SCAN | SORT GROUP BY | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | SYS_TEMP_0FD9D6674_54381A51 | | W_INT_ORG_DH | | W_INT_ORG_DH_F3 | | | W_DAY_D | | | W_DAY_D_M17 | | W_DAY_D_M16 | W_DAY_D_M16 | | W_SALES_ORDER_LINE_F | | | | | | SYS_TEMP_0FD9D6674_54381A51 | W_SLS_ORD_LN_F_F26 | | | | W_STATUS_D | | W_STATUS_D_M3 | W_SLS_ORD_LN_F_F32 | W_STATUS_D | | W_STATUS_D_M3 | SYS_TEMP_0FD9D6674_54381A51 | W_USER_D | | W_USER_D_M5 | W_XACT_TYPE_D_U2 | 1 | | | 1 | 375 | 1 | 164 | | | 34 | | 164 | 958 32 25 926 3 (1)| | | (0)| (0)| (1)| (0)| | | | | | | (0)| (0)| | | | | | (0)| | | | | (0)| | | | (0)| | | (0)| (0)| | | (0)|
OOW 2013
TABLE ACCESS BY INDEX ROWID | BITMAP CONVERSION TO ROWIDS | BITMAP AND | BITMAP INDEX SINGLE VALUE | BITMAP OR | BITMAP INDEX SINGLE VALUE | BITMAP INDEX SINGLE VALUE | PARTITION RANGE ALL | TABLE ACCESS BY LOCAL INDEX ROWID | BITMAP CONVERSION TO ROWIDS | BITMAP AND | BITMAP MERGE | BITMAP KEY ITERATION | BUFFER SORT | TABLE ACCESS FULL | BITMAP INDEX RANGE SCAN | BITMAP MERGE | BITMAP KEY ITERATION | BUFFER SORT | TABLE ACCESS BY INDEX ROWID | BITMAP CONVERSION TO ROWIDS| BITMAP INDEX SINGLE VALUE | BITMAP INDEX RANGE SCAN | TABLE ACCESS BY INDEX ROWID | BITMAP CONVERSION TO ROWIDS | BITMAP INDEX SINGLE VALUE | TABLE ACCESS FULL | TABLE ACCESS BY INDEX ROWID | BITMAP CONVERSION TO ROWIDS | BITMAP INDEX SINGLE VALUE | INDEX FAST FULL SCAN |
910 910
2 2 2
16
star_transformation_enabled = true
OOW 2013
17
star_transformation_enabled = temp_disable
| | |* | | | |* | |* |* | | | | | | | |* |* |* | | | |* | |* |* |* | |* | | |* |* |* | 0 | SELECT STATEMENT 1 | SORT GROUP BY 2 | HASH JOIN 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | W_DAY_D | | | | | | W_DAY_D_M17 | | W_DAY_D_M16 | W_DAY_D_M16 | | W_SALES_ORDER_LINE_F | | | | | | W_INT_ORG_DH | W_INT_ORG_DH_F3 | W_SLS_ORD_LN_F_F26 | | | | W_STATUS_D | | W_STATUS_D_M3 | W_SLS_ORD_LN_F_F32 | W_STATUS_D | | W_STATUS_D_M3 | W_USER_D | | W_USER_D_M5 | W_INT_ORG_DH | W_INT_ORG_DH_F3 | W_XACT_TYPE_D_U2 | 1 | 1 | 1 | 292 | 292 | 292 | 956 956 955 3 (1)|00:00:18 (1)|00:00:18 (1)|00:00:18 (0)|00:00:01 | | | | | | (0)|00:00:17 (0)|00:00:17 | | | | | (0)|00:00:01 (0)|00:00:01 | | | | (0)|00:00:01 | | | (0)|00:00:01 | | (0)|00:00:01 | | (0)|00:00:01 (0)|00:00:01 (0)|00:00:01
OOW 2013
TABLE ACCESS BY INDEX ROWID | BITMAP CONVERSION TO ROWIDS | BITMAP AND | BITMAP INDEX SINGLE VALUE | BITMAP OR | BITMAP INDEX SINGLE VALUE | BITMAP INDEX SINGLE VALUE | PARTITION RANGE ALL | TABLE ACCESS BY LOCAL INDEX ROWID | BITMAP CONVERSION TO ROWIDS | BITMAP AND | BITMAP MERGE | BITMAP KEY ITERATION | BUFFER SORT | TABLE ACCESS BY INDEX ROWID | INDEX SKIP SCAN | BITMAP INDEX RANGE SCAN | BITMAP MERGE | BITMAP KEY ITERATION | BUFFER SORT | TABLE ACCESS BY INDEX ROWID | BITMAP CONVERSION TO ROWIDS| BITMAP INDEX SINGLE VALUE | BITMAP INDEX RANGE SCAN | TABLE ACCESS BY INDEX ROWID | BITMAP CONVERSION TO ROWIDS | BITMAP INDEX SINGLE VALUE | TABLE ACCESS BY INDEX ROWID | BITMAP CONVERSION TO ROWIDS | BITMAP INDEX SINGLE VALUE | TABLE ACCESS BY INDEX ROWID | INDEX SKIP SCAN | INDEX FAST FULL SCAN |
910 910
32 25
2 2 32 25 3
18
star_transformation_enabled = temp_disable
OOW 2013
Elapsed = 00:00:13.21
Note ----- star transformation used for this statement Statistics ---------------------------------------------------------1 recursive calls 0 db block gets 271859 consistent gets 0 physical reads 808 redo size 982 bytes sent via SQL*Net to client 492 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 3 sorts (memory) 0 sorts (disk) 2 rows processed
19
OOW 2013
20
OOW 2013
Index created.
21
OOW 2013
Permissions
query rewrite or global query rewrite
Constraints
Must have PK constraint enabled on all dimension tables
CBO statistics
Must be gathered first
22
OOW 2013
where and and and and and and and and and and and and and and
23
OOW 2013
where and and and and and and and and and and and and and and
24
OOW 2013
:TQ10001
NESTED LOOPS | PX BLOCK ITERATOR | TABLE ACCESS FULL | TABLE ACCESS BY INDEX ROWID| INDEX UNIQUE SCAN | TABLE ACCESS BY INDEX ROWID | INDEX UNIQUE SCAN | TABLE ACCESS BY INDEX ROWID | INDEX UNIQUE SCAN | TABLE ACCESS BY INDEX ROWID | INDEX UNIQUE SCAN | TABLE ACCESS BY INDEX ROWID | INDEX UNIQUE SCAN | TABLE ACCESS BY INDEX ROWID | INDEX UNIQUE SCAN | TABLE ACCESS BY INDEX ROWID | INDEX UNIQUE SCAN | BUFFER SORT | PX RECEIVE | PX SEND HASH | TABLE ACCESS FULL | TABLE ACCESS BY INDEX ROWID | INDEX UNIQUE SCAN | TABLE ACCESS BY INDEX ROWID | INDEX RANGE SCAN | TABLE ACCESS BY INDEX ROWID | INDEX RANGE SCAN |
| | W_SALES_ORDER_LINE_F | WC_ORDER_TYPE_D | WC_ORDER_TYPE_D_PK | W_PAYMENT_TERMS_D | W_PAYMNT_TRM_D_P1 | W_USER_D | W_USER_D_P1 | W_BUSN_LOCATION_D | W_BUSN_LOC_D_P1 | W_XACT_TYPE_D | W_XACT_TYPE_D_P1 | W_PARTY_D | W_PARTY_D_P1 | W_CUSTOMER_LOC_D | W_CUST_LOC_D_P1 | | | :TQ10000 | WC_SALESCREDIT_REVN_H | W_EMPLOYEE_D | W_EMPLOYEE_D_P1 | W_DAY_D | W_DAY_D_M39 | W_DAY_D | W_DAY_D_M39 |
25
OOW 2013
Elapsed = 00:10:12.81
Statistics ---------------------------------------------------------3388 recursive calls 0 db block gets 2287060 consistent gets 2276872 physical reads 2116 redo size 1104 bytes sent via SQL*Net to client 1560 bytes received via SQL*Net from client 1 SQL*Net roundtrips to/from client 84 sorts (memory) 0 sorts (disk) 0 rows processed
26
OOW 2013
Index created.
27
OOW 2013
| | | | | | |* | |* | | |* |* |* | |* | |* |* |* | |* |* |* |* |* |* |* |* |* |* |*
0 1 2 3 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| | | |
| | | | | | W_SALES_ORDER_LINE_F | | W_SLS_ORD_LN_F_BJI02 | WC_SALESCREDIT_REVN_H | | X_W_SLSCR_REVN_H_F1 | W_EMPLOYEE_D | W_EMPLOYEE_D_P1 | W_PARTY_D | W_PARTY_D_P1 | W_XACT_TYPE_D | W_XACT_TYPE_D_P1 | W_BUSN_LOCATION_D | W_BUSN_LOC_D_P1 | W_CUSTOMER_LOC_D | W_CUST_LOC_D_P1 | W_PAYMENT_TERMS_D | W_PAYMNT_TRM_D_P1 | WC_ORDER_TYPE_D | WC_ORDER_TYPE_D_PK | W_USER_D | W_USER_D_P1 | W_DAY_D | W_DAY_D_P1 | W_DAY_D | W_DAY_D_P1 |
1 1 1 1
| | | |
| | | |
(2)| (2)| (2)| (0)| (0)| (0)| (0)| | | (0)| | | (0)| (0)| (0)| (0)| (0)| (0)| (0)| (0)| (0)| (0)| (0)| (0)| (0)| (0)| (0)| (0)| (0)| (0)| (0)| (0)|
NESTED LOOPS | PARTITION RANGE ALL | TABLE ACCESS BY LOCAL INDEX ROWID| BITMAP CONVERSION TO ROWIDS | BITMAP INDEX SINGLE VALUE | TABLE ACCESS BY INDEX ROWID | BITMAP CONVERSION TO ROWIDS | BITMAP INDEX SINGLE VALUE | TABLE ACCESS BY INDEX ROWID | INDEX UNIQUE SCAN | TABLE ACCESS BY INDEX ROWID | INDEX UNIQUE SCAN | TABLE ACCESS BY INDEX ROWID | INDEX UNIQUE SCAN | TABLE ACCESS BY INDEX ROWID | INDEX UNIQUE SCAN | TABLE ACCESS BY INDEX ROWID | INDEX UNIQUE SCAN | TABLE ACCESS BY INDEX ROWID | INDEX UNIQUE SCAN | TABLE ACCESS BY INDEX ROWID | INDEX UNIQUE SCAN | TABLE ACCESS BY INDEX ROWID | INDEX UNIQUE SCAN | TABLE ACCESS BY INDEX ROWID | INDEX UNIQUE SCAN | TABLE ACCESS BY INDEX ROWID | INDEX UNIQUE SCAN |
1 | 1 | 1 | | | 1 | | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
110 | 93 | 93 | | | 17 | | | 27 | | 32 | | 18 | | 28 | | 25 | | 18 | | 25 | | 11 | | 12 | | 12 | |
1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
28
OOW 2013
Elapsed = 00:00:00.17
Statistics ---------------------------------------------------------1 recursive calls 0 db block gets 127 consistent gets 15 physical reads 0 redo size 1104 bytes sent via SQL*Net to client 1560 bytes received via SQL*Net from client 1 SQL*Net roundtrips to/from client 1 sorts (memory) 0 sorts (disk) 0 rows processed
29
OOW 2013
create table w_solf_tmp tablespace dw_data as select * from w_sales_order_line_f partition (p201202) where 1 = 2;
insert /*+ append parallel */ into w_solf_tmp select ... from ... exec dbms_stats.gather_table_stats('DWUSR', 'W_SOLF_TMP', estimate_percent=>null, method_opt=>'FOR ALL COLUMNS SIZE AUTO') create bitmap index W_SLS_ORD_LN_F_F1_tmp on w_solf_tmp(ACCT_REP_WID) tablespace dw_idx compute statistics; create bitmap index W_SLS_ORD_LN_F_F2_tmp on w_solf_tmp(BOOKED_DT_WID) tablespace dw_idx compute statistics; ...creation of 40+ more indexes edited out for brevity...
30
OOW 2013
create bitmap index W_SLS_ORD_LN_F_BJI01_tmp on W_SOLF_TMP(S.W_STATUS_CODE, S.W_STATUS_CLASS, D.PER_NAME_MONTH, D.PER_NAME_WEEK, U.FULL_NAME) from W_STATUS_D S, W_DAY_D D, W_USER_D U, W_SOLF_TMP F where F.ORDER_STATUS_WID = S.ROW_WID and F.X_INVOICE_DT_WID = D.ROW_WID and F.CREATED_BY_WID = U.ROW_WID tablespace dw_idx compute statistics;
31
OOW 2013
32
OOW 2013
SQL> alter table w_sales_order_line_f 2 exchange partition p201202 3 with table w_solf_tmp 4 including indexes 5 without validation 6 update global indexes; Table altered. Elapsed: 00:00:57.02
33
OOW 2013
Summary
Dimensional data models require star transformations in Oracle Bitmap-join indexes are a mechanism to *force* or *enhance* star transformations
Think of them as materialized star transformations for indexes, similar to materialized views for tables?
34
OOW 2013
Q&A
Tim Gorman
Evergreen Database Technologies, Inc.
Evaluations
o CON7387 o Scaling To Infinity: Making Star Transformations Sing
Mon 9/23/2013
www.EvDBT.com
35