Skip to Main Content

SQL & PL/SQL

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Fastest way to fetch DISTINCT values from partitioned table

meet_sancMay 12 2013 — edited Jun 1 2013
What is the fastest way to fetch DISTINCT values from partitioned table?
1) DISTINCT/UNIQUE
2) GROUP BY
3) PARTITION BY OVER()
4) MAX(ROWID)
Table Definition
CREATE TABLE STG_SOS_SALES_FACT_STUDY
(
  CNTRY_KEY     NUMBER,
  STUDY_ID      NUMBER,
  PRD_KEY_YEAR  NUMBER,
  PRD_KEY_WEEK  NUMBER,
  DATE_FROM     DATE,
  DATE_TO       DATE,
  STR_KEY       NUMBER,
  STR_SRVC      NUMBER,
  CTG_ID        NUMBER,
  PRDC_KEY      NUMBER,
  UNITS         NUMBER,
  DOL           NUMBER(17,2),
  FL_ID         NUMBER
)

-> PARTITION BY RANGE (PRD_KEY_YEAR, PRD_KEY_WEEK)
-> SUBPARTITION BY LIST (CNTRY_KEY)

** Local Partition Indexes
1) CN_SD_CTG_PRD_PRDC_IDX = STG_SOS_SALES_FACT_STUDY (PRD_KEY_YEAR, PRD_KEY_WEEK, CNTRY_KEY, STUDY_ID, CTG_ID, PRDC_KEY)
2) CN_SD_PRD_STR_CTG_IDX = STG_SOS_SALES_FACT_STUDY (PRD_KEY_YEAR, PRD_KEY_WEEK, CNTRY_KEY, STUDY_ID, STR_KEY)
#Query:
SELECT DISTINCT PRD_KEY_WEEK, PRD_KEY_YEAR
FROM stg_sos_sales_fact_study a
WHERE CNTRY_KEY = 484
AND ( ( (A.PRD_KEY_WEEK BETWEEN 14 AND 52 AND A.PRD_KEY_YEAR = 2012)
OR (A.PRD_KEY_WEEK BETWEEN 1 AND 14 AND A.PRD_KEY_YEAR = 2013)))
AND STUDY_ID IN (22573064, 35328585, 22573064);
** Explain Plan:
Plan
SELECT STATEMENT  ALL_ROWSCost: 6,235  Bytes: 629  Cardinality: 37  					
      8 HASH UNIQUE  Cost: 6,235  Bytes: 629  Cardinality: 37  				
         7 CONCATENATION  			
              3 PARTITION RANGE ITERATOR  Cost: 1,985  Bytes: 1,031,900  Cardinality: 60,700  Partition #: 3  Partitions accessed #194 - #207		
                  2 PARTITION LIST SINGLE  Cost: 1,985  Bytes: 1,031,900  Cardinality: 60,700  Partition #: 4  Partitions determined by Key Values	
	  1 INDEX SKIP SCAN INDEX SOS_ODS.CN_SD_PRD_STR_CTG_IDX Cost: 1,985  Bytes: 1,031,900  Cardinality: 60,700  Partition #: 4  Partitions determined by Key Values
	      6 PARTITION RANGE ITERATOR  Cost: 4,243  Bytes: 2,719,371  Cardinality: 159,963  Partition #: 6  Partitions accessed #155 - #193		
	        5 PARTITION LIST SINGLE  Cost: 4,243  Bytes: 2,719,371  Cardinality: 159,963  Partition #: 7  Partitions determined by Key Values	
	         4 INDEX SKIP SCAN INDEX SOS_ODS.CN_SD_PRD_STR_CTG_IDX Cost: 4,243  Bytes: 2,719,371  Cardinality: 159,963  Partition #: 7  Partitions determined by Key Values
The above query is taking around 6-7 minutes to fetch the data.

Edited by: meet_sanc on 12 May, 2013 11:34 AM
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Jun 29 2013
Added on May 12 2013
12 comments
3,069 views