Tuning Update query

  • From: Lok P <loknath.73@xxxxxxxxx>
  • To: Oracle L <oracle-l@xxxxxxxxxxxxx>
  • Date: Mon, 3 May 2021 00:23:12 +0530

Hello, We have a plsql procedure in which it  updates multiple columns of
the global temporary table after loading it in different steps. It's
updated for different filter criteria and each of these UPDATES are running
for hours even if they are simple ones. I am trying to see if it's possible
to do it in an efficient fashion by combining all different updates into
one UPDATE statement or any other possible method? One initial thought was
to do it as part of the INSERT itself rather than updating it through
multiple statements at the later stage , but then I see the data
load/INSERT is happening for multiple if/else conditions which may not be
straight enough.

Attached is the sql monitor for few of the long running UPDATES. And i am
seeing this is not really spending time for updating rows but rather in
finding the eligible rows for update i.e. the SELECT part of it is actually
taking time. So wanted to understand how these UPDATES can be done faster?

Its version 11.2.0.4 of Oracle Exadata-X5.

Regards

Lok

UPDATE GTT_TAB TMP
   SET (c1,  c2,  c3, c4,c5.. c11) =
          ( (SELECT col1,col2,..col11
               FROM PRODUCT_TAB P
              WHERE     P.TID = TMP.TID
                    AND TMP.CIND = 'Y'
                    AND P.PART_DT = TMP.PART_DT
                    AND P.CODE = 'XX'))

                                        
Global Information
------------------------------
 Status                                 :  DONE                        
 Instance ID                            :  1                           
 SQL Execution ID                       :  16784210                    
 Execution Started                      :  05/02/2021 10:19:15         
 First Refresh Time                     :  05/02/2021 10:19:18         
 Last Refresh Time                      :  05/02/2021 11:26:39         
 Duration                               :  4044s                       
 PLSQL Entry Ids (Object/Subprogram)    :  87734,1                     
 PLSQL Current Ids (Object/Subprogram)  :  87734,1                     

Global Stats
=================================================================================
| Elapsed |   Cpu   |    IO    | Concurrency | Cluster  | Buffer | Read | Read  
|
| Time(s) | Time(s) | Waits(s) |  Waits(s)   | Waits(s) |  Gets  | Reqs | Bytes 
|
=================================================================================
|    4465 |    1412 |     3052 |        0.57 |     0.72 |    79M |   9M |  74GB 
|
=================================================================================

SQL Plan Monitoring Details (Plan Hash Value=1406665007)
====================================================================================================================================================================================================
| Id |               Operation                |          Name          |  Rows  
 | Cost |   Time    | Start  | Execs |   Rows   | Read | Read  | Activity |     
       Activity Detail             |
|    |                                        |                        | 
(Estim) |      | Active(s) | Active |       | (Actual) | Reqs | Bytes |   (%)   
 |              (# samples)               |
====================================================================================================================================================================================================
|  0 | UPDATE STATEMENT                       |                        |        
 |      |      1235 |  +2153 |     1 |        0 |      |       |     0.07 | Cpu 
(1)                                |
|    |                                        |                        |        
 |      |           |        |       |          |      |       |          | 
reliable message (2)                   |
|  1 |   UPDATE                               | GTT_TAB                |        
 |      |      4044 |     +1 |     1 |        0 |      |       |    10.62 | Cpu 
(429)                              |
|  2 |    TABLE ACCESS STORAGE FULL           | GTT_TAB                |      
8G | 381K |      4042 |     +3 |     1 |      17M | 4467 |   4GB |     0.72 | 
Cpu (20)                               |
|    |                                        |                        |        
 |      |           |        |       |          |      |       |          | 
cell multiblock physical read (9)      |
|  3 |    FILTER                              |                        |        
 |      |      4042 |     +3 |   17M |       8M |      |       |     0.07 | Cpu 
(3)                                |
|  4 |     PARTITION RANGE SINGLE             |                        |       
1 |   13 |      4042 |     +3 |    8M |       8M |      |       |     0.12 | 
Cpu (5)                                |
|  5 |      TABLE ACCESS BY LOCAL INDEX ROWID | PRODUCT_TAB            |       
1 |   13 |      4043 |     +2 |    8M |       8M |   6M |  45GB |    55.79 | gc 
cr grant 2-way (1)                  |
|    |                                        |                        |        
 |      |           |        |       |          |      |       |          | Cpu 
(292)                              |
|    |                                        |                        |        
 |      |           |        |       |          |      |       |          | 
cell single block physical read (1961) |
|  6 |       INDEX RANGE SCAN                 | PROD_TAB_IX1           |       
1 |    4 |      4042 |     +3 |    8M |       8M |   3M |  25GB |    32.60 | 
Cpu (218)                              |
|    |                                        |                        |        
 |      |           |        |       |          |      |       |          | 
cell single block physical read (1099) |
====================================================================================================================================================================================================

Predicate Information (identified by operation id):
---------------------------------------------------
 
   3 - filter(:B1='Y')
   5 - filter("P"."PART_DT"=:B1)
   6 - access("P"."TID"=:B1 AND "P"."CODE"='XX')

   
 **************************************************  
   
UPDATE GTT_TAB TMP
SET EASTATUS =
          (SELECT COL14
                 FROM PRODUCT_TAB P
                WHERE     P.TID = TMP.TID
                          AND P.PART_DT = TMP.PART_DT
                          AND P.CODE = 'YY')    
                                  
                                  
(                                 
and another similar update exists as below

UPDATE GTT_TAB
   SET RNUM =
          (SELECT COL1
             FROM METHOD_TAB
            WHERE     PART_DT = GTT_TAB.PART_DT
                  AND TID = GTT_TAB.TID
                  AND MCODE = 'MM')
                                  )
                                  
Global Information
------------------------------
 Status                                 :  DONE                        
 Instance ID                            :  1                           
 SQL Execution ID                       :  16784213                    
 Execution Started                      :  05/02/2021 07:59:26         
 First Refresh Time                     :  05/02/2021 07:59:29         
 Last Refresh Time                      :  05/02/2021 09:39:49         
 Duration                               :  6023s                       
 PLSQL Entry Ids (Object/Subprogram)    :  87734,1                     
 PLSQL Current Ids (Object/Subprogram)  :  87734,1                     

Global Stats
=================================================================================
| Elapsed |   Cpu   |    IO    | Concurrency | Cluster  | Buffer | Read | Read  
|
| Time(s) | Time(s) | Waits(s) |  Waits(s)   | Waits(s) |  Gets  | Reqs | Bytes 
|
=================================================================================
|    6540 |    1627 |     4913 |        0.30 |     0.09 |   102M |  11M |  87GB 
|
=================================================================================

SQL Plan Monitoring Details (Plan Hash Value=3209483866)
===================================================================================================================================================================================================
| Id |               Operation               |          Name          |  Rows   
| Cost |   Time    | Start  | Execs |   Rows   | Read | Read  | Activity |      
      Activity Detail             |
|    |                                       |                        | (Estim) 
|      | Active(s) | Active |       | (Actual) | Reqs | Bytes |   (%)    |      
        (# samples)               |
===================================================================================================================================================================================================
|  0 | UPDATE STATEMENT                      |                        |         
|      |      5122 |   +122 |     1 |        0 |      |       |     0.15 | Cpu 
(5)                                |
|    |                                       |                        |         
|      |           |        |       |          |      |       |          | enq: 
US - contention (1)               |
|    |                                       |                        |         
|      |           |        |       |          |      |       |          | 
reliable message (3)                   |
|  1 |   UPDATE                              | GTT_TAB                |         
|      |      6022 |     +2 |     1 |        0 |      |       |     6.80 | Cpu 
(409)                              |
|  2 |    TABLE ACCESS STORAGE FULL          | GTT_TAB                |    147K 
|  377 |      6021 |     +3 |     1 |      17M | 5632 |   3GB |     0.55 | Cpu 
(25)                               |
|    |                                       |                        |         
|      |           |        |       |          |      |       |          | cell 
multiblock physical read (8)      |
|  3 |    PARTITION RANGE SINGLE             |                        |       1 
|   13 |      5922 |   +102 |   17M |       7M |      |       |     0.23 | Cpu 
(14)                               |
|  4 |     TABLE ACCESS BY LOCAL INDEX ROWID | PRODUCT_TAB            |       1 
|   13 |      5931 |    +93 |   17M |       7M |   6M |  43GB |    44.90 | Cpu 
(283)                              |
|    |                                       |                        |         
|      |           |        |       |          |      |       |          | cell 
single block physical read (2419) |
|  5 |      INDEX RANGE SCAN                 | PROD_TAB_IX1           |       1 
|    4 |      6023 |     +1 |   17M |       7M |   5M |  41GB |    47.36 | Cpu 
(356)                              |
|    |                                       |                        |         
|      |           |        |       |          |      |       |          | cell 
single block physical read (2494) |
===================================================================================================================================================================================================


Predicate Information (identified by operation id):
---------------------------------------------------
 
   4 - filter("P"."PART_DT"=:B1)
   5 - access("P"."TID"=:B1 AND "P"."CODE"='YY')

**************************************************

UPDATE GTT_TAB TMP
   SET (FS_REQ, FS_RES) =
          ( (SELECT 'ZZ' || COL4, COL5
               FROM PRODUCT_TAB P
              WHERE     P.TID = TMP.TID
                    AND P.PART_DT = TMP.PART_DT
                    AND P.CODE = 'ZZ'))


Global Information
------------------------------
 Status                                 :  DONE                        
 Instance ID                            :  1                           
 SQL Execution ID                       :  16784202                    
 Execution Started                      :  05/02/2021 09:39:54         
 First Refresh Time                     :  05/02/2021 09:39:58         
 Last Refresh Time                      :  05/02/2021 10:19:11         
 Duration                               :  2357s                       
 PLSQL Entry Ids (Object/Subprogram)    :  87734,1                     
 PLSQL Current Ids (Object/Subprogram)  :  87734,1                     

Global Stats
=================================================================================
| Elapsed |   Cpu   |    IO    | Concurrency | Cluster  | Buffer | Read | Read  
|
| Time(s) | Time(s) | Waits(s) |  Waits(s)   | Waits(s) |  Gets  | Reqs | Bytes 
|
=================================================================================
|    2581 |     968 |     1613 |        0.02 |     0.01 |    94M |   5M |  43GB 
|
=================================================================================

SQL Plan Monitoring Details (Plan Hash Value=3209483866)
===================================================================================================================================================================================================
| Id |               Operation               |          Name          |  Rows   
| Cost |   Time    | Start  | Execs |   Rows   | Read | Read  | Activity |      
      Activity Detail             |
|    |                                       |                        | (Estim) 
|      | Active(s) | Active |       | (Actual) | Reqs | Bytes |   (%)    |      
        (# samples)               |
===================================================================================================================================================================================================
|  0 | UPDATE STATEMENT                      |                        |         
|      |       863 |   +590 |     1 |        0 |      |       |     0.17 | Cpu 
(3)                                |
|    |                                       |                        |         
|      |           |        |       |          |      |       |          | 
reliable message (1)                   |
|  1 |   UPDATE                              | GTT_TAB                |         
|      |      2354 |     +4 |     1 |        0 |      |       |    14.82 | Cpu 
(349)                              |
|  2 |    TABLE ACCESS STORAGE FULL          | GTT_TAB                |      8G 
| 381K |      2354 |     +4 |     1 |      17M | 5146 |   4GB |     1.32 | Cpu 
(21)                               |
|    |                                       |                        |         
|      |           |        |       |          |      |       |          | cell 
multiblock physical read (10)     |
|  3 |    PARTITION RANGE SINGLE             |                        |       1 
|   13 |      2168 |   +136 |   17M |        0 |      |       |     0.68 | Cpu 
(16)                               |
|  4 |     TABLE ACCESS BY LOCAL INDEX ROWID | PRODUCT_TAB            |       1 
|   13 |      1576 |   +763 |   17M |        0 |      |       |     0.34 | Cpu 
(8)                                |
|  5 |      INDEX RANGE SCAN                 | PROD_TAB_IX1           |       1 
|    4 |      2358 |     +0 |   17M |        0 |   5M |  39GB |    82.68 | Cpu 
(318)                              |
|    |                                       |                        |         
|      |           |        |       |          |      |       |          | cell 
single block physical read (1629) |
===================================================================================================================================================================================================



Predicate Information (identified by operation id):
---------------------------------------------------
 
   4 - filter("P"."PART_DT"=:B1)
   5 - access("P"."TID"=:B1 AND "P"."CODE"='ZZ')                                
        
   
   
   
 ***************  Another two Updates exists areas below but i have not 
captured the sqlmonitor for below********************
   
   UPDATE GTT_TAB TMP
   SET ANUM =
          (SELECT  col5
             FROM PRODUCT_TAB P
            WHERE     P.TID = TMP.TID
                  AND P.PART_DT = TMP.PART_DT
                  AND P.PART_DT BETWEEN :B2 AND :B1
                  AND P.CODE = 'AA'
                  AND P.col5 IS NOT NULL)
 WHERE EXISTS
          (SELECT col5
             FROM PRODUCT_TAB P
            WHERE     P.TID = TMP.TID
                  AND P.PART_DT = TMP.PART_DT
                  AND P.PART_DT BETWEEN :B2 AND :B1
                  AND P.CODE = 'AA'
                  AND P.col5 IS NOT NULL)
                                  


                          

UPDATE GTT_TAB TMP
   SET EXP_MMYY =
          (SELECT COL6
             FROM PRODUCT_TAB P
            WHERE     P.TID = TMP.TID
                  AND P.PART_DT = TMP.PART_DT
                  AND P.PART_DT BETWEEN :B2 AND :B1
                  AND P.CODE = 'AA'
                  AND P.COL6 IS NOT NULL)
 WHERE EXISTS
          (SELECT COL6
             FROM PRODUCT_TAB P
            WHERE     P.TID = TMP.TID
                  AND P.PART_DT = TMP.PART_DT
                  AND P.PART_DT BETWEEN :B2 AND :B1
                  AND P.CODE = 'AA'
                  AND P.COL6 IS NOT NULL)               

Other related posts: