Pular para o conteúdo

Fóruns Banco de dados Oracle Problema com sequence no 11g Problema com sequence no 11g

#100204
rman
Participante

    Acho que o diegolenhardt matou a questão.

    Realmente o parâmetro deferred_segment_creation mudou o comportamento, mas um detalhe, nada mudou em relação a sequence, o que mudou foi em relação as tabelas não particionadas e objetos dependentes da tabela como lob e índices, a tabela só é criada de fato, após a primeira inserção de registro.

    Retirado da documentação oficial:


    DEFERRED_SEGMENT_CREATION

    Property Description
    Parameter type Boolean
    Default value true
    Modifiable ALTER SESSION, ALTER SYSTEM
    Range of values true | false
    Basic No
    DEFERRED_SEGMENT_CREATION specifies the semantics of deferred segment creation. If set to true, then segments for non-partitioned tables and their dependent objects (LOBs, indexes) will not be created until the first row is inserted into the table.

    Before creating a set of tables, if it is known that a significant number of them will not be populated, then consider setting this parameter to true. This saves disk space and minimizes install time.

    Fiz alguns testes para entender melhor como funciona o parâmetro, por padrão ele é verdadeiro.


    Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
    Connected as sakamoto

    SQL> CREATE TABLE TABELA_TST (ID NUMBER(10) NOT NULL);

    Table created

    SQL> CREATE SEQUENCE SEQ_TABELA_TST INCREMENT BY 1 START WITH 1 MAXVALUE 9999999999 NOCYCLE CACHE 20;

    Sequence created

    SQL> INSERT INTO TABELA_TST (ID) VALUES (100);

    1 row inserted

    SQL> COMMIT;

    Commit complete

    SQL> SELECT T.ID FROM TABELA_TST T;

    ID

        100
    

    SQL> INSERT INTO TABELA_TST (ID) VALUES (SEQ_TABELA_TST.NEXTVAL) ;

    1 row inserted

    SQL> COMMIT;

    Commit complete

    SQL> SELECT T.ID FROM TABELA_TST T;

    ID

        100
          1
    

    Repare que eu inseri o primeiro registro com valor 100 para sabermos que foi gerado na mão, e não pela sequence. Neste momento a tabela foi criada de fato, em seguida inseri utilizando a sequence, veja que foi inserido o valor 1.

    O que acontece quando tentamos inserir direto o primeiro registro vindo da sequence ? Provavelmente a sequence gera o valor 1 e tenta inserir na tabela, por algum motivo a inserção falha, é quando a tabela é criada de verdade, então é tentado inserir novamente, é gerado o valor 2, então é inserido com sucesso.

    Pelos testes foi isso que eu conclui, posso estar falando besteira… ^^