250 likes | 360 Views
Oracle 11g Results Cache Dean Richards Senior DBA, Confio Software. Who Am I?. Senior DBA for Confio Software DeanRichards@confio.com 20+ Years in Oracle, SQL Server 5+ Years in Oracle Consulting - SPG Specialize in Performance Tuning
E N D
Oracle 11g Results CacheDean Richards Senior DBA, Confio Software
Who Am I? • Senior DBA for Confio Software • DeanRichards@confio.com • 20+ Years in Oracle, SQL Server • 5+ Years in Oracle Consulting - SPG • Specialize in Performance Tuning • Review Performance of 100’s of Databases for Customers and Prospects
Example SELECT /*+ result_cache */ state, sum(order_total) FROM order_history WHERE order_date BETWEEN ’1-JAN-09’ AND ’1-JAN-10’ GROUP BY state First Execution Elapsed: 00:03:42.96 Statistics ---------------------------------------------------------- 824825 consistent gets 824791 physical reads Second Execution Elapsed: 00:00:00.10 Statistics ---------------------------------------------------------- 0 consistent gets 0 physical reads
Execution Plan Execution Plan ---------------------------------------------------------- Plan hash value: 47235625 -------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 44 | 396 | 6854 (2)| 00:01:23 | | 1 | RESULT CACHE | 7zvt0xan8bw0pgry071f7mt85s | | | | | | 2 | HASH GROUP BY | | 44 | 396 | 6854 (2)| 00:01:23 | | 3 | TABLE ACCESS FULL| T | 1739K| 14M| 6802 (1)| 00:01:22 | -------------------------------------------------------------------------------------------------- Result Cache Information (identified by operation id): ------------------------------------------------------ 1 - column-count=2; dependencies=(PROD.ORDER_HISTORY); parameters=(nls); name=“SELECT /*+ result_cache */ state, sum(order_total) FROM order_history GROUP BY state” SELECT ID, TYPE, CREATION_TIMESTAMP, BLOCK_COUNT, COLUMN_COUNT, PIN_COUNT, ROW_COUNT FROM V$RESULT_CACHE_OBJECTS WHERE CACHE_ID = '7zvt0xan8bw0pgry071f7mt85s'; ID TYPE CREATION_ BLOCK_COUNT COLUMN_COUNT PIN_COUNT ROW_COUNT -- ------ ---------- ----------- ------------ --------- --------- 2 Result 06-JAN-10 1 2 0 12
Oracle 11g Result Caches • New in Oracle 11g, Improved in 11gR2 • SQL Query Results (local and distributed) • PL/SQL Function Results • OCI Client Results • Cached Data is shared across executions • Automatically marked stale if underlying data is changed • Can Dramatically Increase Performance
Server Result Caches • Stores Results of Query or Function Call • Uses a Slice of the Shared Pool • Not Affected by Flushing Shared Pool
Parameters • RESULT_CACHE_MODE • MANUAL (default) – requires a query hint or table annotation • FORCE – every result set is cached. Not recommended because it can create significant performance and latching overhead • AUTO??? – more about this option • RESULT_CACHE_MAX_SIZE • Amount of memory allocated to server result cache • 0 (Disabled), 0.25% (memory_target), 0.5% (sga_target) and ~1% (shared_pool_size) • RESULT_CACHE_MAX_RESULT • Amount of memory for a single result set • 5% (Default)
AUTO Mode Not Supported • Oracle Error Says AUTO Mode is Supported SQL> alter system set result_cache_mode=incorrect; alter system set result_cache_mode=incorrect * ERROR at line 1: ORA-00096: invalid value INCORRECT for parameter result_cache_mode, must be from among FORCE, MANUAL, AUTO • Many notes in blogs, etc that say AUTO mode is not supported and probably never will
Using Result Cache • Database Setting result_cache_mode = FORCE (not recommended) • Query Hint select /*+ result_cache */ rep_name, sum(order_total) from orders group by rep_name • Table Annotation Mode alter table order_history result_cache (mode force) • Session Mode alter session set result_cache_mode = force
Queries that Benefit • Access Large Amount of Data • Return Few Rows • Execute Somewhat Frequently • Based on Slowly Changing Data • Limited Number of Bind Values • Results are cached by Bind Value
Restrictions • Will Not Work With • Temporary tables • SYS or SYSTEM tables • Sequences (NEXTVAL or CURRVAL) • Date/Time Functions – SYSDATE, CURRENT_DATE, SYS_TIMESTAMP, CURRENT_TIMESTAMP, etc • USERENV / SYS_CONTEXT (with non-constant variables) • SYS_GUID • Query must retrieve the most current committed state of the data • No Active Transaction Against Objects in Current Session
DBMS_RESULT_CACHE • BYPASS • Disables result cache database-wide • FLUSH • Flushes all objects from result cache • Note: flushing shared pool has no affect • MEMORY_REPORT • Nice report that shows usage of result cache • STATUS • ENABLED or NOT ENABLED • INVALIDATE • Invalidate contents of the result cache • INVALIDATE_OBJECT • Invalidates contents that rely on object passed in
MEMORY_REPORT SET SERVEROUTPUT ON EXECUTE DBMS_RESULT_CACHE.MEMORY_REPORT R e s u l t C a c h e M e m o r y R e p o r t [Parameters] Maximum Cache Size = 950272 bytes (928 blocks) Maximum Result Size = 47104 bytes (46 blocks) [Memory] Total Memory = 46340 bytes [0.048% of the Shared Pool] ... Fixed Memory = 10696 bytes [0.011% of the Shared Pool] ... State Object Pool = 2852 bytes [0.003% of the Shared Pool] ... Cache Memory = 32792 bytes (32 blocks) [0.034% of the Shared Pool] ....... Unused Memory = 30 blocks ....... Used Memory = 2 blocks ........... Dependencies = 1 blocks ........... Results = 1 blocks ............... SQL = 1 blocks
System Views • V$RESULT_CACHE_STATISTICS • How well is the cache doing? • Monitor CREATES vs. FINDS • V$RESULT_CACHE_MEMORY • Memory components and statistics • V$RESULT_CACHE_OBJECTS • Objects that are in the cache along with attributes • V$RESULT_CACHE_DEPENDENCY • Dependencies of the results in cache
V$RESULT_CACHE_STATISTICS ID NAME VALUE --- ------------------------------ ------ 1 Block Size (Bytes) 1024 2 Block Count Maximum 1856 3 Block Count Current 32 4 Result Size Maximum (Blocks) 92 5 Create Count Success 5 6 Create Count Failure 0 7 Find Count 3100016 8 Invalidation Count 0 9 Delete Count Invalid 0 10 Delete Count Valid 0 11 Hash Chain Length 1
Remote Result Sets • RESULT_CACHE_REMOTE_EXPIRATION • Expiration time (minutes) for results that depend on remote database objects • 0 (Default, Disabled) • DML on Remote Database does not Invalidate the local results cache • Must be Careful of Stale Results
PL/SQL Function Result Cache • Stores Results of Function by Parameter • Automatically Refreshed Based on Object Usage • Enabled Using “result_cache” Option create or replace function state_sales_totals (p_state in varchar2) return number result_cache as l_order_total number; begin select sum(order_total) into l_order_total from orders where to_number(order_date,'YYYYMM') between 200901 and 200903 and state = p_state; return l_order_total; end;
Benefits and Restrictions • Similar Benefits as SQL Query Results Cache • Works for Recursive Function Calls • Restrictions • No invoker’s rights or anonymous block • No pipelined table function • Does not reference dictionary tables, temporary segments, sequences or non-deterministic SQL functions • Has no OUT or IN OUT parameters • No IN parameters of type BLOB, CLOB, NCLOB, REF CURSOR, Collection, Object, Record • The Return Type is not a BLOB, NCLOB, REF CURSOR, Object, Record or collection using one of these
OCI Client Cache • Must use an OCI driver that Supports Results Cache • Must use 11g client and 11g server • Shared by All Sessions in Client Process • Subqueries and Query Blocks are not Cached • Database will Invalidate Client Result Cache • Independent of Server Result Cache
Parameters and Views • CLIENT_RESULT_CACHE_SIZE • Maximum size of client result cache • 0 – 32767 (Disabled) • CLIENT_RESULT_CACHE_LAG • 3000 ms (Default) • Forces next statement execution to check for validations • Optional Client Parameter File (SQLNET.ORA) Overrides Database Parameters • OCI_RESULT_CACHE_MAX_SIZE • OCI_RESULT_CACHE_MAX_RSET_SIZE (bytes) • OCI_RESULT_CACHE_MAX_RSET_ROWS
Views • CLIENT_RESULT_CACHE_STATS$ • One row for every client using Result Cache • Cache Settings and Statistics • DBA_TABLES, ALL_TABLES, USER_TABLES • Column to show if FORCE has been used
CLIENT_RESULT_CACHE_STATS$ NAME VALUE CACHE_ID ------- ----- -------- Block Size 256 124 Block Count Max 256 124 Block Count Current 128 124 Hash Bucket Count 1024 124 Create Count Success 10 124 Create Count Failure 0 124 Find Count 12 124 Invalidation Count 8 124 Delete Count Invalid 0 124 Delete Count Valid 0 124 SELECT * FROM GV$SESSION_CONNECT_INFO WHERE CLIENT_REGID = <cache_id>; • Look for high values of Find Count • Look for low values • Create Count Failure • Delete Count Valid
11g R1 vs. R2 • R1 Memory Grows to Maximum Size but does not Automatically Free Memory • DBMS_RESULT_CACHE.FLUSH • Latching Issues in R1 • R1 Result Cache controlled by one latch • R2 controlled by many latches • Better Table Annotation Support • PL/SQL required the RELIES_ON clause which is deprecated in R2 • OCI Client Result Cache now supports table annotation
Confio Software • Developer of Wait-Based Performance Tools • Igniter Suite – Web Based and Agentless • Ignite for Oracle, SQL Server, DB2, Sybase • Helps Identify Queries that may benefit from using Results Cache • Based in Colorado, worldwide customers • Free trial at www.confio.com
Ignite for Oracle 40% Improvement