Skip to main content

Oracle 11g result cache

One of the production system is very slow and users are giving up. when I analyze the AWR report, there are a few things that can be improved on the top "elapsed time" queries, one of the improvement is to enable the result cache on query level by adding a hint to it.


The database is running on 11.2.0.3.


1.    Change parameter result_cache_max_size from 0 to 100m
2.    Change parameter result_cache_max_result from 5 to 100

SELECT /*+ result_cache */ 1

      INTO NCOUNT
      FROM myview

  now I can see that the query statistics:



  from sqlplus:

  set autotrace traceonly

  select /*+ result_cache */ 1...

      Execution Plan

----------------------------------------------------------

Plan hash value: 2064300782



------------------------------------------------------------------------------------------------------------------

| Id  | Operation                           | Name                       | Rows  | Bytes | Cost (%CPU)| Time     |

------------------------------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT                    |                            |     1 |    80 |    15   (0)| 00:00:01 |

|   1 |  RESULT CACHE                       | 2c9dvp51sa88r414fwndn3v3df |       |       |            |          |


...
      Statistics

      ----------------------------------------------------------

          0  recursive calls

          0  db block gets

          0  consistent gets

          0  physical reads

          0  redo size


        202  bytes sent via SQL*Net to client

        361  bytes received via SQL*Net from client

          2  SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

          1  rows processed

 there are a few system views to get the result cache information:

select * from sys.V_$RESULT_CACHE_DEPENDENCY
select * from sys.V_$RESULT_CACHE_MEMORY
select * from sys.V_$RESULT_CACHE_OBJECTS;
select * from sys.V_$RESULT_CACHE_STATISTICS;

for example:

Enter value for tblname: sys.v_$result_cache_statistics

        ID NAME                                               VALUE
---------- -------------------------------------------------- ------------------------------------------
         1 Block Size (Bytes)                                 1024
         2 Block Count Maximum                                10240
         3 Block Count Current                                32
         4 Result Size Maximum (Blocks)                       10240
         5 Create Count Success                               20
         6 Create Count Failure                               0
         7 Find Count                                         9
         8 Invalidation Count                                 1
         9 Delete Count Invalid                               16
        10 Delete Count Valid                                 0
        11 Hash Chain Length                                  1
        12 Find Copy Count                                    3

 select id,type,name,namespace,status,object_no from sys.v_$result_cache_objects;

        ID TYPE       NAME                                     NAMES STATUS     OBJECT_NO
---------- ---------- ---------------------------------------- ----- --------- ----------
         0 Dependency JSUN.DROPIT                                    Published    1338279
         1 Result     select /*+ result_cache */ * from dropit SQL   Published          0

if you use bind variable in the query, then each different variable will have a new result cache.

col CACHE_ID format a40
col CACHE_KEY format a40
select id,hash,LRU_NUMBER,SPACE_OVERHEAD,SPACE_UNUSED,CACHE_ID,CACHE_KEY from sys.v_$result_cache_objects where id in (5,6);

 ID       HASH LRU_NUMBER SPACE_OVERHEAD SPACE_UNUSED CACHE_ID                                 CACHE_KEY
--- ---------- ---------- -------------- ------------ ---------------------------------------- ---------------------------
  6 2841076041         10            528          496 2c9dvp51sa88r414fwndn3v3df               7ntn14k23rg5xdw7fpwb5r7qu2
  5  653915162          9            528          496 2c9dvp51sa88r414fwndn3v3df               79rzg6ahqmbcq0pyr4xdgsttqm


Be careful when you flush the result_cache, do not forget to turn off bypass after the flush, otherwise the result cache stop working.


BEGIN
   DBMS_RESULT_CACHE.BYPASS(TRUE);
   DBMS_RESULT_CACHE.FLUSH;
DBMS_RESULT_CACHE.BYPASS(FALSE);
END;
/


Comments

Popular posts from this blog

Opatch apply/lsinventory error: oneoff is corrupted or does not exist

I am applying the quarterly patch for 19c RDBMS, I tried using napply but failed, but somehow it corrupted the inventory though nothing applied. further apply and lsinventory command ran into error like this: $ ./OPatch/opatch lsinventory Oracle Interim Patch Installer version 12.2.0.1.21 Copyright (c) 2020, Oracle Corporation.  All rights reserved. Oracle Home       : /u02/app/oracle/19.0.0 Central Inventory : /u01/app/oraInventory    from           : /u02/app/oracle/19.0.0/oraInst.loc OPatch version    : 12.2.0.1.21 OUI version       : 12.2.0.7.0 Log file location : /u02/app/oracle/19.0.0/cfgtoollogs/opatch/opatch2020-09-08_13-35-59PM_1.log Lsinventory Output file location : /u02/app/oracle/19.0.0/cfgtoollogs/opatch/lsinv/lsinventory2020-09-08_13-35-59PM.txt -------------------------------------------------------------------------------- Inventory load failed... OPatch cannot load inventory for the given Oracle Home. LsInventorySession failed: Unable to create patchObject Possible ca

non-existent process lock port on windows server

I have a database link created between oracle and sqlserver using oracle tg4odbc, the product is installed on windows server and run as service "OracleOraGtw11g_home1TNSListener", but sometime the service cannot started, the root cause of this problem is that the port number 1521 is used by an non-existent process. The first step is to use netstat -bano|find "1521" to get the process id, in my case it's 5844, which shows the connection is from my oracle server 10.8.0.169 H:\>netstat -bano|find "1521"   TCP    0.0.0.0:1521           0.0.0.0:0              LISTENING       5844   TCP    10.14.45.33:1521       10.8.0.169:42987       ESTABLISHED     5844 however the process id does not show in either task manager or process explorer. The next step is to run tcpview, which shows non-existent under process column, there are three rows, two show status as "listening", the other one shows status "established", right click and k

shell script to clean up oracle dumpfile

https://github.com/iacosta/personal/blob/master/shells/cleanhouse.sh #!/bin/ksh # # Script used to cleanup any Oracle environment. # # Cleans:      audit_file_dest #              background_dump_dest #              core_dump_dest #              user_dump_dest #              Clusterware logs # # Rotates:     Alert Logs #              Listener Logs # # Scheduling:  00 00 * * * /networkdrive/dba/scripts/purge/cleanup.sh -d 7 > /u01/dba/bin/cleanup.log 2>&1 # # Created By:  Lei Dao # # # RM="rm -f" RMDIR="rm -rf" LS="ls -l" MV="mv" TOUCH="touch" TESTTOUCH="echo touch" TESTMV="echo mv" TESTRM=$LS TESTRMDIR=$LS SUCCESS=0 FAILURE=1 TEST=0 HOSTNAME=`hostname` ORAENV="oraenv" TODAY=`date +%Y%m%d` ORIGPATH=/usr/local/bin:$PATH ORIGLD=$LD_LIBRARY_PATH export PATH=$ORIGPATH # Usage function. f_usage(){   echo "Usage: `basename $0` -d DAYS [-a DAYS] [-b DAYS] [