Em uma sequence Oracle a cláusula CACHE prealoca um conjunto de números de seqüência e os mantém na memória, na Área Global do Sistema (SGA), para que os números de seqüência possam ser acessados mais rapidamente do que eles podem ser lidos do disco.
Quando o último dos números de seqüência no cache for usado, o banco de dados lê outro conjunto de números e aloca-o no cache novamente.
Se seus aplicativos usam muitas seqüências simultaneamente, seu cache de seqüência pode não ser grande o suficiente para armazenar todas as seqüências. E nesse caso, o acesso a números de seqüência pode muitas vezes exigir leituras de disco. Neste cenário precisa ou pode ser ajustado!
Quando utilizado um cache 20 por exemplo, na instrução CREATE SEQUENCE, o Oracle cria a sequência para que 20 valores da seqüência sejam armazenados no cache.
Os primeiros 20 valores da sequencia podem então ser lidos do cache. Quando o 21º valor é acessado, os próximos 20 valores serão lidos a partir do disco.
O banco de dados pode pular números de seqüência se você optar por armazenar em cache um conjunto de números de seqüência. Por exemplo, quando uma instância é anormalmente desligada (por exemplo, quando ocorre uma falha de instância ou uma instrução SHUTDOWN ABORT é emitida), os números de seqüência que foram armazenados em cache mas não utilizados são perdidos.
Também, os números de seqüência que foram usados mas não salvos também são perdidos. O banco de dados também pode ignorar os números de seqüência em cache após uma exportação e importação.
Vamos fazer um teste de performance comparando três exemplos! Primeiro criamos uma sequence com a opção NOCYCLE que é Padrão. Ela indica que a seqüência não pode gerar mais valores após atingir seu valor máximo. Já a opção CYCLE indica que a sequencia será recomeçada ao atingir o valor maximo.
Usamos também a opção NOCACHE na instrução CREATE SEQUENCE, assim, os valores da seqüência não serão armazenados no cache de seqüência do banco. Neste caso, cada acesso à seqüência requer leitura de disco.
Connected to Oracle Database 12c Standard Edition Release 12.1.0.2.0 Connected as prod SQL> SET serveroutput ON SQL> SQL> CREATE SEQUENCE SEQ_01 MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START 2 WITH 1 NOCACHE NOCYCLE; Sequence created SQL> SQL> DECLARE 2 T NUMBER := DBMS_UTILITY.GET_TIME(); 3 V_SEQ NUMBER; 4 BEGIN 5 6 FOR I IN 1 .. 99999 LOOP 7 SELECT SEQ_01.NEXTVAL INTO V_SEQ FROM DUAL; 8 END LOOP; 9 10 DBMS_OUTPUT.PUT_LINE('hsecs=' || TO_CHAR(DBMS_UTILITY.GET_TIME() - T)); 11 END; 12 / hsecs=2394 PL/SQL procedure successfully completed
Agora criamos uma sequence com um cache de 20 e executamos o bloco com loop novamente:
SQL> SQL> CREATE SEQUENCE SEQ_02 MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START 2 WITH 1 CACHE 20 NOCYCLE; Sequence created SQL> SQL> DECLARE 2 T NUMBER := DBMS_UTILITY.GET_TIME(); 3 V_SEQ NUMBER; 4 BEGIN 5 6 FOR I IN 1 .. 99999 LOOP 7 SELECT SEQ_02.NEXTVAL INTO V_SEQ FROM DUAL; 8 END LOOP; 9 10 DBMS_OUTPUT.PUT_LINE('hsecs=' || TO_CHAR(DBMS_UTILITY.GET_TIME() - T)); 11 END; 12 / hsecs=427 PL/SQL procedure successfully completed
E por fim, criamos uma sequence com um cache de 1000 e executamos o bloco com loop novamente:
SQL> SQL> CREATE SEQUENCE SEQ_03 MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START 2 WITH 1 CACHE 1000 NOCYCLE; Sequence created SQL> SQL> DECLARE 2 T NUMBER := DBMS_UTILITY.GET_TIME(); 3 V_SEQ NUMBER; 4 BEGIN 5 6 FOR I IN 1 .. 99999 LOOP 7 SELECT SEQ_03.NEXTVAL INTO V_SEQ FROM DUAL; 8 END LOOP; 9 10 DBMS_OUTPUT.PUT_LINE('hsecs=' || TO_CHAR(DBMS_UTILITY.GET_TIME() - T)); 11 END; 12 / hsecs=310 PL/SQL procedure successfully completed SQL> SQL> DROP SEQUENCE SEQ_01; Sequence dropped SQL> DROP SEQUENCE SEQ_02; Sequence dropped SQL> DROP SEQUENCE SEQ_03; Sequence dropped
Resultado: Se compararmos o tempo de processamento dos três testes, os testes que utilizaram um cache de 20 e 1000 foram os mais rápidos. Porém, a diferença de tempo de processamento utilizando cache 20 e 1000 não é muito. Neste cenário um cache padrão talvez seja o suficiente.
Abraço,
Ronaldo
fonte: https://docs.oracle.com/cd/B28359_01/server.111/b28310/views002.htm
Nenhum comentário:
Postar um comentário