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!

tunning for sql non key table join query consuming high CPU utilization

vsmDec 4 2015 — edited Dec 18 2015

Requirement comes for tunne the query in prod

query consuming high CPU utilization

sql_id : fp79wb32h7a6t

Module : AHC, P_PatientDQ()

Cost: 7

Elapsed Time : hung

Status: Hung , 35,253,460 excutions in 30 minutes interval

-- Create table

create table ahc.PATIENTVISITS

(

  ahcid               NUMBER,

  visitid             NUMBER,

  visitstatus         NVARCHAR2(100),

  visitdate           DATE,

  visitintime         DATE,

  visitouttime        DATE

)

-- Create/Recreate indexes

create index ahc.F1_PATIENTVISIT_AHCID on ahc.PATIENTVISITS (AHCID, VISITID);

create index ahc.VISITDATE_IDX on ahc.PATIENTVISITS (TRUNC(VISITDATE));

  First table total count

select count(1)  from

AHC.patientvisits pvs

--record count 1387485

create table ahc.PATIENTDEPENDENTVISITS

(

  ahcid            NUMBER(19) not null,

  packageid        NUMBER(10) not null,

  visitid          NUMBER(19) not null,

  dependentvisitid NUMBER(19) not null,

  isdiabetic       NUMBER(2)

)

-- Create/Recreate indexes

create index ahc.K1_PATIENTDEPENDENT_AHCID on ahc.PATIENTDEPENDENTVISITS (AHCID);

Second table total count

select count(1) from

AHC.patientdependentvisits pdv

--record count 774599

Original Query:

SELECT count(*)

  FROM AHC.PATIENTVISITS PVS

WHERE PVS.VISITID IN (SELECT PDV.DEPENDENTVISITID

                       FROM AHC.PATIENTDEPENDENTVISITS PDV

                       WHERE PDV.AHCID = 37

                       AND PDV.VISITID = 218

                       AND PDV.ISDIABETIC = 0)

   AND UPPER(PVS.VISITSTATUS) = 'PENDING'

   AND PVS.AHCID = 37

count(1)

-----------

1

PL/sql Developer Explain plan For original query

Description                                                    owner Objects_name                        cost cardin bytes cpucost  Io cost

SELECT STATEMENT, GOAL = ALL_ROWS7141636697
SORT AGGREGATE141
  NESTED LOOPS SEMI7141636697
   TABLE ACCESS BY INDEX ROWIDAHCPATIENTVISITS4125332954
    INDEX RANGE SCANAHCF1_PATIENTVISIT_AHCID39231643
   TABLE ACCESS BY INDEX ROWIDAHCPATIENTDEPENDENTVISITS3116303753
    INDEX RANGE SCANAHCK1_PATIENTDEPENDENT_AHCID214180932

After changing the query

SELECT /*+ FIRST_ROWS*/ COUNT(1)

  FROM AHC.PATIENTVISITS PVS

  JOIN AHC.PATIENTDEPENDENTVISITS PDV  ON  PVS.VISITID=PDV.DEPENDENTVISITID

  WHERE PVS.AHCID = PDV.AHCID

  AND PDV.AHCID = 37

  AND PDV.VISITID = 218

  AND PDV.ISDIABETIC = 0

  AND UPPER(PVS.VISITSTATUS) = 'PENDING'

count(1)

-----------

1

PL/sql Developer Explain plan For Changed  query

Description                                                    owner Objects_name                                         cost cardin bytes cpucost  Io cost

SELECT STATEMENT, GOAL = HINT: FIRST_ROWS7141592577
SORT AGGREGATE141
  NESTED LOOPS
   NESTED LOOPS7141592577
    TABLE ACCESS BY INDEX ROWIDAHCPATIENTDEPENDENTVISITS4116366464
     INDEX RANGE SCANAHCK1_PATIENTDEPENDENT_AHCID314243643
    INDEX RANGE SCANAHCF1_PATIENTVISIT_AHCID21152932
   TABLE ACCESS BY INDEX ROWIDAHCPATIENTVISITS3125226113

here after i have changed the query no improvement displaying in cost=7 io wait also=7  can any one please help for these

how to tune or rewrite non key table join bunch of multiple records on table

Thanks

vsm

This post has been answered by Paul Horth on Dec 4 2015
Jump to Answer
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Jan 15 2016
Added on Dec 4 2015
14 comments
437 views