DBMS_STATS: NO_INVALIDATE e invalidação de Cursores

Ao executar alguns testes com a DBMS_SHARED_POOL, descobri que a documentação não é precisa quanto à Package DBMS_STATS (novamente).

De acordo com a documentação, usando a opção NO_INVALIDATE “The procedure invalidates the dependent cursors immediately if set to FALSE.
Fonte: https://docs.oracle.com/en/database/oracle/oracle-database/12.2/arpls/DBMS_STATS.html#GUID-B930CE9B-7461-4691-8AA9-7E424C3C2C8C

E o que é esta invalidação? Os Cursores são removidos da Shared Pool? Não, só depois descobri que há uma coluna que marca os SQLs como invalidados.

Com uma Shared Pool limpa, executo dois SQLs, e verifico que eles estão na V$SQL.

15:10:38 SYS@ORCL> ALTER SYSTEM FLUSH SHARED_POOL;

System altered.

Elapsed: 00:00:00.14
15:10:41 SYS@ORCL> SELECT /* Vamos invalidar esse SQL */ COUNT(OBJECT_ID) FROM T1;

COUNT(OBJECT_ID)
----------------
           71858

Elapsed: 00:00:00.01
15:10:52 SYS@ORCL> SELECT /* Vamos invalidar esse SQL tambem */ COUNT(OBJECT_ID) FROM T1;

COUNT(OBJECT_ID)
----------------
           71858

Elapsed: 00:00:00.00
15:10:55 SYS@ORCL> SELECT SQL_ID, LOADS, FIRST_LOAD_TIME, LAST_LOAD_TIME, INVALIDATIONS, SQL_TEXT FROM V$SQL WHERE SQL_TEXT LIKE '%Vamos%' AND SQL_TEXT NOT LIKE '%LIKE%';

SQL_ID             LOADS FIRST_LOAD_TIME     LAST_LOAD_TIME      INVALIDATIONS SQL_TEXT
------------- ---------- ------------------- ------------------- ------------- ----------------------------------------------------------------------------------------------------
3ysw7h5yjnsad          1 2018-05-07/15:10:51 2018-05-07/15:10:51             0 SELECT /* Vamos invalidar esse SQL */ COUNT(OBJECT_ID) FROM T1
028knmf07ajny          1 2018-05-07/15:10:54 2018-05-07/15:10:54             0 SELECT /* Vamos invalidar esse SQL tambem */ COUNT(OBJECT_ID) FROM T1

Elapsed: 00:00:00.02
15:10:58 SYS@ORCL>

Em seguida executo a coleta de estatísticas do objeto, com NO_INVALIDATE=>FALSE, mas os SQLs continuam na V$SQL, só sendo alterada a coluna INVALIDATIONS.

15:10:58 SYS@ORCL> EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'T1', NO_INVALIDATE=>FALSE);

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.69
15:11:11 SYS@ORCL> SELECT SQL_ID, LOADS, FIRST_LOAD_TIME, LAST_LOAD_TIME, INVALIDATIONS, SQL_TEXT FROM V$SQL WHERE SQL_TEXT LIKE '%Vamos%' AND SQL_TEXT NOT LIKE '%LIKE%';

SQL_ID             LOADS FIRST_LOAD_TIME     LAST_LOAD_TIME      INVALIDATIONS SQL_TEXT
------------- ---------- ------------------- ------------------- ------------- ----------------------------------------------------------------------------------------------------
3ysw7h5yjnsad          1 2018-05-07/15:10:51 2018-05-07/15:10:51             1 SELECT /* Vamos invalidar esse SQL */ COUNT(OBJECT_ID) FROM T1
028knmf07ajny          1 2018-05-07/15:10:54 2018-05-07/15:10:54             1 SELECT /* Vamos invalidar esse SQL tambem */ COUNT(OBJECT_ID) FROM T1

Elapsed: 00:00:00.01
15:11:13 SYS@ORCL>

E ao executar um dos SQLs novamente, vemos que as colunas LOADS (ou seja, uma compilação) e LAST_LOAD_TIME foram alteradas.

15:11:13 SYS@ORCL> SELECT /* Vamos invalidar esse SQL */ COUNT(OBJECT_ID) FROM T1;

COUNT(OBJECT_ID)
----------------
           71858

Elapsed: 00:00:00.01
15:16:58 SYS@ORCL> SELECT SQL_ID, LOADS, FIRST_LOAD_TIME, LAST_LOAD_TIME, INVALIDATIONS, SQL_TEXT FROM V$SQL WHERE SQL_TEXT LIKE '%Vamos%' AND SQL_TEXT NOT LIKE '%LIKE%';

SQL_ID             LOADS FIRST_LOAD_TIME     LAST_LOAD_TIME      INVALIDATIONS SQL_TEXT
------------- ---------- ------------------- ------------------- ------------- ----------------------------------------------------------------------------------------------------
3ysw7h5yjnsad          2 2018-05-07/15:10:51 2018-05-07/15:16:58             1 SELECT /* Vamos invalidar esse SQL */ COUNT(OBJECT_ID) FROM T1
028knmf07ajny          1 2018-05-07/15:10:54 2018-05-07/15:10:54             1 SELECT /* Vamos invalidar esse SQL tambem */ COUNT(OBJECT_ID) FROM T1

Elapsed: 00:00:00.02
15:16:59 SYS@ORCL>

2 comments

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.