Pular para o conteúdo
  • Este tópico contém 11 respostas, 4 vozes e foi atualizado pela última vez 12 anos, 7 meses atrás por C_Eduardo.
Visualizando 12 posts - 1 até 12 (de 12 do total)
  • Autor
    Posts
  • #103636
    ramasine
    Participante

      Pessoal, deem uma olhada nisso!

      Conecto em um de nossos bancos DW e vejo o custo das duas queries abaixo!

      Uma usa o indice e a outra não usa… Alguém saberia me dizer qual o motivo? A tb só recebe inserts!!!!!

      Primeira query:

      10:30:34 sql@bdrjdw_new > set autotrace traceonly explain
      10:30:39 sql@bdrjdw_new > SELECT *
      10:30:48 2 FROM TB_CMS_ECHI PP
      10:30:48 3 WHERE TRUNC(PP.SEGSTART) = TO_DATE(’10/05/2012′,’DD/MM/YYYY’);
      Decorrido: 00:00:00.00

      Plano de Execução
      ———————————————————-
      Plan hash value: 1670301511

      —————————————————————————————————
      | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
      —————————————————————————————————
      | 0 | SELECT STATEMENT | | 988K| 230M| 747K (1)| 02:54:25 | | |
      | 1 | PARTITION RANGE ALL| | 988K| 230M| 747K (1)| 02:54:25 | 1 | 3 |
      | 2 | PARTITION HASH ALL| | 988K| 230M| 747K (1)| 02:54:25 | 1 | 10 |
      |* 3 | TABLE ACCESS FULL| TB_CMS_ECHI | 988K| 230M| 747K (1)| 02:54:25 | 1 | 30 |
      —————————————————————————————————

      Predicate Information (identified by operation id):
      —————————————————

      3 – filter(TRUNC(INTERNAL_FUNCTION(“PP”.”SEGSTART”))=TO_DATE(‘ 2012-05-10 00:00:00’,
      ‘syyyy-mm-dd hh24:mi:ss’))

      Segunda Query:

      10:30:53 sql@bdrjdw_new > SELECT *
      10:31:25 2 FROM TB_CMS_ECHI PP
      10:31:25 3 WHERE TRUNC(PP.SEGSTART) = TO_DATE(’16/05/2012′,’DD/MM/YYYY’);
      Decorrido: 00:00:00.00

      Plano de Execução
      ———————————————————-
      Plan hash value: 3829593730

      —————————————————————————————————-
      | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
      —————————————————————————————————-
      | 0 | SELECT STATEMENT | | 66928 | 15M| 72057 (1)| 00:16:49 | | |
      | 1 | PARTITION RANGE ALL | | 66928 | 15M| 72057 (1)| 00:16:49 | 1 | 3 |
      | 2 | PARTITION HASH ALL | | 66928 | 15M| 72057 (1)| 00:16:49 | 1 | 10 |
      | 3 | TABLE ACCESS BY LOCAL INDEX ROWID| TB_CMS_ECHI | 66928 | 15M| 72057 (1)| 00:16:49 |
      |* 4 | INDEX RANGE SCAN | IX_OT_CMS_ECHI_03 | 66928 | | 14943 (1)| 00:03:30 | 1 |
      —————————————————————————————————-

      Predicate Information (identified by operation id):
      —————————————————

      4 – access(TRUNC(INTERNAL_FUNCTION(“SEGSTART”))=TO_DATE(‘ 2012-05-16 00:00:00’, ‘syyyy-mm-dd hh24

      #103637
      rman
      Participante

        @ramasine

        Posta a DDL de criação do índice IX_OT_CMS_ECHI_03.

        Como você está usando função no WHERE para que o índice seja utilizado é necessário criar o índice sobre função. E aplique a a mesma função dos 2 lados.


        CREATE INDEX INDICE_FUNCAO ON TB_CMS_ECHI (TO_DATE('SEGSTART','DD/MM/YYYY'));


        SELECT *
        FROM TB_CMS_ECHI PP
        WHERE TO_DATE('PP.SEGSTART','DD/MM/YYYY') = TO_DATE('10/05/2012','DD/MM/YYYY');

        Faça o teste desta forma e poste o resultado

        #103638
        ramasine
        Participante

          Segue rman, o ddl do indice!

          CREATE INDEX DW_ECHI.IX_OT_CMS_ECHI_03 ON DW_ECHI.TB_CMS_ECHI
          (TRUNC(“SEGSTART”))
          PCTFREE 10
          INITRANS 2
          MAXTRANS 255
          LOCAL (
          PARTITION I_FEV_2012
          NOLOGGING
          NOCOMPRESS
          TABLESPACE TSECHII1
          PCTFREE 10
          INITRANS 2
          MAXTRANS 255
          STORAGE (
          BUFFER_POOL DEFAULT
          )
          STORE IN (TSECHII1,TSECHII1,TSECHII1,TSECHII1,TSECHII1,TSECHII1,TSECHII1,TSECHII1,TSECHII1,TSECHII1),
          PARTITION I_ABR_2012
          NOLOGGING
          NOCOMPRESS
          TABLESPACE TSECHII2
          PCTFREE 10
          INITRANS 2
          MAXTRANS 255
          STORAGE (
          BUFFER_POOL DEFAULT
          )
          STORE IN (TSECHII2,TSECHII2,TSECHII2,TSECHII2,TSECHII2,TSECHII2,TSECHII2,TSECHII2,TSECHII2,TSECHII2),
          PARTITION I_ATUAIS
          NOLOGGING
          NOCOMPRESS
          TABLESPACE TSECHII3
          PCTFREE 10
          INITRANS 2
          MAXTRANS 255
          STORAGE (
          BUFFER_POOL DEFAULT
          )
          STORE IN (TSECHII3,TSECHII3,TSECHII3,TSECHII3,TSECHII3,TSECHII3,TSECHII3,TSECHII3,TSECHII3,TSECHII3)
          )
          NOPARALLEL;

          #103639
          ramasine
          Participante

            A query é a mesma, diferente apenas na data que é passada!
            Mas o resultado é diferente….

            #103640
            rman
            Participante

              @ramasine

              Bom, o índice IX_OT_CMS_ECHI_03 foi criado sobre a função TRUNC. O que está estranho é que no filtro você usa a função TO_DATE.

              Utilize os parâmetros NLS_DATE_FORMAT e NLS_TIMESTAMP_FORMAT para formatar a data, isso evita o uso da função TO_DATE.

              #103641
              ramasine
              Participante

                Retirei o TO_DATE mas não adiantou usar o NLS_DATE_FORMAT…
                Muito estranho!!! Continua a não usar o índice !!

                #103642
                rman
                Participante

                  @ramasine

                  Cria um índice sem o TRUNC e testa.

                  #103643
                  ramasine
                  Participante

                    Cara,

                    Se eu colocar o trunc no lugar do to_date dá o mesmo efeito, mesmo recriando o índice!!
                    A parada é que se ficar até dois dias atras, fica com indice, caso contrário eh full…. já fiz o analyze do indice e das subpartições.. mas nada….!!

                    #103646
                    Victor Armbrust
                    Mestre

                      Você está Usando RANGE-HASH nessa tabela?
                      Por quais campos?
                      Como está particionada a tabela?
                      Posta o DDL da tabela por gentileza (Sem constraints, indices, etc) somente o CREATE TABLE (…)
                      vamos ver qualé que é desse index…

                      Abs
                      Victor

                      #103650
                      ramasine
                      Participante

                        Fala varmbrust!!!
                        Segue abaixo, a tabela usa partição por hash..

                        CREATE TABLE DW_ECHI.TB_CMS_ECHI
                        (
                        CALLID NUMBER(12),
                        ACWTIME NUMBER(12),
                        ANSHOLDTIME NUMBER(12),
                        CONSULTTIME NUMBER(12),
                        DISPTIME NUMBER(12),
                        DURATION NUMBER(12),
                        SEGSTART DATE,
                        SEGSTOP DATE,
                        TALKTIME NUMBER(12),
                        NETINTIME NUMBER(12),
                        ORIGHOLDTIME NUMBER(12),
                        DISPIVECTOR NUMBER(12),
                        DISPSPLIT NUMBER(6),
                        FIRSTVECTOR NUMBER(6),
                        SPLIT1 NUMBER(6),
                        SPLIT2 NUMBER(6),
                        SPLIT3 NUMBER(6),
                        TKGRP NUMBER(6),
                        EQ_LOCID NUMBER(6),
                        ORIG_LOCID NUMBER(6),
                        ANS_LOCID NUMBER(6),
                        OBS_LOCID NUMBER(6),
                        ASSIST CHAR(1 BYTE),
                        AUDIO CHAR(1 BYTE),
                        CONFERENCE CHAR(1 BYTE),
                        DA_QUEUED CHAR(1 BYTE),
                        HOLDABN CHAR(1 BYTE),
                        MALICIOUS CHAR(1 BYTE),
                        OBSERVINGCALL CHAR(1 BYTE),
                        TRANSFERRED CHAR(1 BYTE),
                        AGT_RELEASED CHAR(1 BYTE),
                        ACD NUMBER(6),
                        DISPOSITION NUMBER(6),
                        DISPPRIORITY NUMBER(6),
                        HELD NUMBER(6),
                        SEGMENT NUMBER(6),
                        ANSREASON NUMBER(6),
                        ORIGREASON NUMBER(6),
                        DISPSKLEVEL NUMBER(6),
                        EVENT1 NUMBER(6),
                        EVENT2 NUMBER(6),
                        EVENT3 NUMBER(6),
                        EVENT4 NUMBER(6),
                        EVENT5 NUMBER(6),
                        EVENT6 NUMBER(6),
                        EVENT7 NUMBER(6),
                        EVENT8 NUMBER(6),
                        EVENT9 NUMBER(6),
                        UICD VARCHAR2(21 BYTE),
                        DISPVDN VARCHAR2(8 BYTE),
                        EQLOC VARCHAR2(10 BYTE),
                        FIRSTVDN VARCHAR2(8 BYTE),
                        ORIGLOGIN VARCHAR2(10 BYTE),
                        ANSLOGIN VARCHAR2(10 BYTE),
                        LASTOBSERVER VARCHAR2(10 BYTE),
                        DIALED_NUM VARCHAR2(25 BYTE),
                        CALLING_PTY VARCHAR2(13 BYTE),
                        LASTDIGITS VARCHAR2(17 BYTE),
                        LASTCWC VARCHAR2(17 BYTE),
                        CALLING_II VARCHAR2(3 BYTE),
                        CWC1 VARCHAR2(17 BYTE),
                        CWC2 VARCHAR2(17 BYTE),
                        CWC3 VARCHAR2(17 BYTE),
                        CWC4 VARCHAR2(17 BYTE),
                        CWC5 VARCHAR2(17 BYTE),
                        CD_PABX NUMBER(1),
                        VDN2 VARCHAR2(8 BYTE),
                        VDN3 VARCHAR2(8 BYTE),
                        VDN4 VARCHAR2(8 BYTE),
                        VDN5 VARCHAR2(8 BYTE),
                        VDN6 VARCHAR2(8 BYTE),
                        VDN7 VARCHAR2(8 BYTE),
                        VDN8 VARCHAR2(8 BYTE),
                        VDN9 VARCHAR2(8 BYTE),
                        QUEUETIME NUMBER(12),
                        RINGTIME NUMBER(12),
                        ASAIUUI VARCHAR2(100 BYTE),
                        UUI_LEN NUMBER(4),
                        ECHI_VERSION NUMBER(10),
                        ECHI_SEQUENCE NUMBER(10),
                        NU_PROTOCOLO NUMBER,
                        DT_CARGA DATE DEFAULT SYSDATE,
                        NU_TRANSFERENCIA NUMBER,
                        NM_ARQUIVO_ORIGEM VARCHAR2(100 BYTE)
                        )
                        TABLESPACE TSECHID1
                        PCTUSED 0
                        PCTFREE 10
                        INITRANS 1
                        MAXTRANS 255
                        PARTITION BY RANGE (SEGSTART)
                        SUBPARTITION BY HASH (DISPSPLIT)
                        …..

                        #103655
                        Victor Armbrust
                        Mestre

                          Cara,

                          Existe um particionamento sobre o campo “SEGSTART” via RANGE. Qual é o intervalo? você não postou isso no “CREATE TABLE”… Tem que ver o intervalo em Dias, Meses, Anos que está nesse particionamento.

                          POsta ai:
                          – Qual o particionanmento usado no campo “SEGSTART”
                          – Qual o intervalo que deseja pesquisar
                          – Qual o intervalo que NAO usa index
                          – Qual o intervalo que USA index

                          Abs
                          Victor

                          #103672
                          C_Eduardo
                          Participante

                            Pessoal

                            E se forçar o uso do índice, para ver o comportamento?

                            Pela experiencia de vcs será que pode ter alguma informação nova?

                            Abs

                            Carlos Eduardo

                          Visualizando 12 posts - 1 até 12 (de 12 do total)
                          • Você deve fazer login para responder a este tópico.
                          plugins premium WordPress