Otimizar SQL que leva uns 50 minutos para executar

Visualizando 4 posts - 1 até 4 (de 4 do total)
  • Autor
    Posts
  • #95103
    Avatar de neoescolhineoescolhi
    Participante

    Fala aí galera beleza?!

    Estou executando uma consulta em uma tabela com aproximadamente (411.000.000) registros, é isso mesmo,
    411 milhões de registros. Essa consulta leva aproximadamente entre 40 a 50 minutos para executar, gostaria
    de saber por obséquio se alguem tem alguma solução para otimizar esse raio dessa consulta.


    SELECT
    entity,
    sum(duration) AS duracao
    FROM
    mne_e_cif
    WHERE
    substr(entity,3,1) in ('8','7') AND
    TO_DATE (starttime, 'DD/MM/YYY') = TO_DATE (SYSDATE -1, 'DD/MM/YYY') GROUP BY entity

    ENTITY NOT NULL VARCHAR2(31) STARTTIME NOT NULL DATE ENDTIME DATE ACCOUNT_TYPE NOT NULL NUMBER(3) DURATION NOT NULL NUMBER(15) A_NUMBER VARCHAR2(31) B_NUMBER VARCHAR2(31) DESTINATION NOT NULL VARCHAR2(31) CDR_PAYMENT_VALUE VARCHAR2(1) TRAFFIC_TYPE VARCHAR2(1) PRS VARCHAR2(2) FREEPHONE VARCHAR2(1) ORIGINATING_DEVICE VARCHAR2(2) TERMINATING_DEVICE VARCHAR2(2) DESTINATION_IDENTIFIER VARCHAR2(31) CALL_VALUE FLOAT(15) OPERATOR_CONNECTED VARCHAR2(1) REVERSE_CHARGE VARCHAR2(1) CHARGE_ADVICE VARCHAR2(1) INCOMPLETE_CALL VARCHAR2(1) CALL_DIVERT VARCHAR2(1) CALL_TRANSFER VARCHAR2(1) MULTI_PARTY VARCHAR2(1) CONF_CALL VARCHAR2(1) EMERGENCY_CALL VARCHAR2(1) DIRECTORY_CALL VARCHAR2(1) PARTIAL_CDR NUMBER(1) ROAMER NUMBER(1) IMSI VARCHAR2(15) EQUIPMENTID VARCHAR2(15) CELLID VARCHAR2(31) TERMINATING_CELL_ID VARCHAR2(31) ORIGINATING_SWITCH VARCHAR2(15) CDQ_CUSTOM_FIELD_1 VARCHAR2(31) CDQ_CUSTOM_FIELD_3 VARCHAR2(31) CDQ_CUSTOM_FIELD_6 VARCHAR2(31) RATING NUMBER(10,3) LATITUDE FLOAT(10) LONGITUDE FLOAT(10) CALL_TYPE NUMBER(5) STORED NOT NULL DATE PARTNUM NOT NULL NUMBER(10) ARCHIVED CHAR(1)

    Ir para o topo

    #95105
    Avatar de Leonardo LitzLeonardo Litz
    Participante

    Ola.

    Caso nao exista. Ja pensou em criar um indice para a seguinte condicao?

    substr(entity,3,1)

    Caso nao exista, ja pensou em particionar a tabela pela coluna starttime criando uma particacao por dia?

    Vlw Leonardo Litz

    #95106
    Avatar de vierivieri
    Participante

    rode a qury no sql plus
    com o comando..
    SET AUTOT ON EXP STATS

    #95114
    Avatar de Thiago VilhenaThiago Vilhena
    Participante

    [quote=”neoescolhi”:8w76n2vj]Fala aí galera beleza?!

    Estou executando uma consulta em uma tabela com aproximadamente (411.000.000) registros, é isso mesmo,
    411 milhões de registros. Essa consulta leva aproximadamente entre 40 a 50 minutos para executar, gostaria
    de saber por obséquio se alguem tem alguma solução para otimizar esse raio dessa consulta.

    [/quote]

    Veio qual é a versao do banco de dados? tipo fazer tunning de query, voce primeiro tem que ver como o otimizador do oracle esta agindo para resolver essa query, caso seja 10g+ para analizar isso da um set autotrace traceonly explain no sqlplus e roda essa query, ela nao vai resolver o sqlplus vai te trazer o plano de acesso dessa query.

    Como a tabela é bem grandinha, seria interessante analisar, criar e testar particionamento e subparticionamento.

    DICA: primeira coisa q iria fazer era analisar para verificar a melhor maneira de particionar e subparticionar essa tabela, faria esse teste, e verificaria o tempo de resposta da query. performance e tunning é uma missao ardua rsrs. mas persevera que voce conssegue.

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