- Este tópico contém 11 respostas, 4 vozes e foi atualizado pela última vez 12 anos, 7 meses atrás por C_Eduardo.
-
AutorPosts
-
18 de maio de 2012 às 5:34 pm #103636ramasineParticipante
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.00Plano 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.00Plano 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
18 de maio de 2012 às 5:54 pm #103637rmanParticipante@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
18 de maio de 2012 às 5:58 pm #103638ramasineParticipanteSegue 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;18 de maio de 2012 às 6:04 pm #103639ramasineParticipanteA query é a mesma, diferente apenas na data que é passada!
Mas o resultado é diferente….18 de maio de 2012 às 6:31 pm #103640rmanParticipante@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.
18 de maio de 2012 às 6:47 pm #103641ramasineParticipanteRetirei o TO_DATE mas não adiantou usar o NLS_DATE_FORMAT…
Muito estranho!!! Continua a não usar o índice !!18 de maio de 2012 às 7:07 pm #103642rmanParticipante@ramasine
Cria um índice sem o TRUNC e testa.
18 de maio de 2012 às 9:39 pm #103643ramasineParticipanteCara,
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….!!19 de maio de 2012 às 12:07 am #103646Victor ArmbrustMestreVocê 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
Victor21 de maio de 2012 às 3:41 pm #103650ramasineParticipanteFala 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)
…..21 de maio de 2012 às 11:37 pm #103655Victor ArmbrustMestreCara,
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 indexAbs
Victor23 de maio de 2012 às 4:29 pm #103672C_EduardoParticipantePessoal
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
-
AutorPosts
- Você deve fazer login para responder a este tópico.