Analise de uma View

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
Avatar do usuário
Anderrssoon
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Qui, 15 Mar 2012 7:34 am

Bom dia pessoal, estou estudando Oracle e hoje estou com um problema nesta view, gostaria de saber de vocês se existe algum problema de sintaxe ou utilização de funções nesta viu que estou apresentando abaixo, quando realizo uma consulta nela, a consulta demora em torno de 20 segundos para me retornar a informação. Hoje esta viu retorna em torno de 87.712 linhas. Levando em consideração a quantidade de informações o tempo é este mesmo?

Agradeço a atenção de todos.

Selecionar tudo

SELECT DECODE (SS.SS_TIPOSS,
                  1, 'SERVICO',
                  2, 'MANUT',
                  3, 'LUBRIFICACAO',
                  4, 'VIBRACAO')
             TIPOSS,
          EQ.EQ_TAG,
          SS.SS_CODIGO,
          SS.SS_DTABERTURA,
          SS.SS_DTFECHAMENTO,
          SS.SS_TPMANUTENCAO,
          SS.SS_OBS,
          SS.SS_PARADAUF,
          SS.SS_DTPARADA,
          SS.SS_CODUSUARIO,
          SS.SS_STATUS,
          SS.SS_TIPOSS,
          SS.EQ_CODIGO,
          SS.AREA_CODIGO,
          SS.UF_CODIGO,
          SS.CC_CODIGO,
          SS.TPS_CODIGO,
          DECODE (SS.SS_TIPOSS, 2, EQ.UF_CODIGO, SS.UFS_CODIGO) AS UFS_CODIGO,
          SS.UN_CODIGO,
          SS.SS_DTINICIO,
          SS.SS_TPOCORRENCIA,
          UF.UF_SIGLA,
          V.PES_NOME,
          V1.PES_NOME RESP,
          TP.TPS_DESCRICAO,
          UN.UN_SIGLA,
          EQ.EQ_TAGISO,
          NVL2 (SS.SS_DTPARADA, 'SIM', 'não') PARADO,
          SS_GRAVIDADE,
          SS_URGENCIA,
          SS_TENDENCIA,
          UN.UN_DESCRICAO,
          AREA.AREA_DESCRICAO,
          UF.UF_DESCRICAO,
          UF2.UF_DESCRICAO,
          CC.CC_DESCRICAO,
          D.DEF_CODIGO,
          D.DEF_DESCRICAO,
          EQ.EQ_GRAVIDADE,
          (CASE
              WHEN SS.SS_TPOCORRENCIA > 0 AND SS.SS_TPOCORRENCIA <= 15
              THEN
                 'BAIXO'
              WHEN SS.SS_TPOCORRENCIA > 15 AND SS.SS_TPOCORRENCIA <= 30
              THEN
                 'MÉDIO'
              WHEN SS.SS_TPOCORRENCIA > 30
              THEN
                 'ALTO'
              ELSE
                 NULL
           END)
             GRAV_SERVICO,
          DECODE (EQ.EQ_GRAVIDADE,
                  '1', 'BAIXO',
                  '2', 'MÉDIO',
                  '3', 'ALTO',
                  '4', 'EXTREMO')
             GRAV_MANUT,
          D.DEF_PRAZO,
            SS.SS_DTABERTURA
          + SUBSTR (DEF_PRAZO, 1, 2) / 24
          + SUBSTR (DEF_PRAZO, 4, 2) / 1440
          + SUBSTR (DEF_PRAZO, 7, 2) / 86400
             DTPRAZO,
          OS_DATA,
          OS.OS_DTPREVISAO,
          OS.OS_DTFECHAMENTO,
          TP.TPS_PRAZOATENDIMENTO,
          TP.TPS_PRAZOSOLUCAO,
            SS.SS_DTABERTURA
          + SUBSTR (TPS_PRAZOATENDIMENTO, 1, 2) / 24
          + SUBSTR (TPS_PRAZOATENDIMENTO, 4, 2) / 1440
          + SUBSTR (TPS_PRAZOATENDIMENTO, 7, 2) / 86400
             DTPRAZOATEND_SERV,
            OS_DATA
          + SUBSTR (TPS_PRAZOSOLUCAO, 1, 2) / 24
          + SUBSTR (TPS_PRAZOSOLUCAO, 4, 2) / 1440
          + SUBSTR (TPS_PRAZOSOLUCAO, 7, 2) / 86400
             DTPRAZOSOLUCAO_SERV,
            TO_DATE (TO_CHAR (OS_DATA, 'DD/MM/YYYY HH24:MI/SS'),
                     'DD/MM/YYYY HH24:MI/SS')
          +   (  (SUBSTR (tps_prazosolucao, 1, 2) * 60 * 60)
               + (SUBSTR (tps_prazosolucao, 4, 2) * 60)
               + (SUBSTR (tps_prazosolucao, 7, 2)))
            * 75
            / 100
            / (24 * 60 * 60)
             DTAMARELASOLUCAO_SERV,
            TO_DATE (TO_CHAR (SS_DTABERTURA, 'DD/MM/YYYY HH24:MI/SS'),
                     'DD/MM/YYYY HH24:MI/SS')
          +   (  (SUBSTR (tps_prazoatendimento, 1, 2) * 60 * 60)
               + (SUBSTR (tps_prazoatendimento, 4, 2) * 60)
               + (SUBSTR (tps_prazoatendimento, 7, 2)))
            * 75
            / 100
            / (24 * 60 * 60)
             DTAMARELAATEND_SERV,
            SS.SS_DTABERTURA
          + SUBSTR (D.DEF_PRAZO, 1, 2) / 24
          + SUBSTR (D.DEF_PRAZO, 4, 2) / 1440
          + SUBSTR (D.DEF_PRAZO, 7, 2) / 86400
             DTPRAZOATEND_MANUT,
            OS_DATA
          + SUBSTR (A.ACAO_PRAZO, 1, 2) / 24
          + SUBSTR (A.ACAO_PRAZO, 4, 2) / 1440
          + SUBSTR (A.ACAO_PRAZO, 7, 2) / 86400
             DTPRAZOSOLUCAO_MANUT,
            TO_DATE (TO_CHAR (SS_DTABERTURA, 'DD/MM/YYYY HH24:MI/SS'),
                     'DD/MM/YYYY HH24:MI/SS')
          +   (  (SUBSTR (D.DEF_PRAZO, 1, 2) * 60 * 60)
               + (SUBSTR (D.DEF_PRAZO, 4, 2) * 60)
               + (SUBSTR (D.DEF_PRAZO, 7, 2)))
            * 75
            / 100
            / (24 * 60 * 60)
             DTAMARELAATEND_MANUT,
            TO_DATE (TO_CHAR (OS_DATA, 'DD/MM/YYYY HH24:MI/SS'),
                     'DD/MM/YYYY HH24:MI/SS')
          +   (  (SUBSTR (A.ACAO_PRAZO, 1, 2) * 60 * 60)
               + (SUBSTR (A.ACAO_PRAZO, 4, 2) * 60)
               + (SUBSTR (A.ACAO_PRAZO, 7, 2)))
            * 75
            / 100
            / (24 * 60 * 60)
             DTAMARELASOLUCAO_MANUT,
          DECODE (SS_TPMANUTENCAO,
                  1, 'CORRETIVA',
                  2, 'PREDITIVA',
                  3, 'PREVENTIVA',
                  NULL)
             SS_TPMANUTENCAO_DESC,
          UF2.UF_SIGLA,
          UF3.UF_SIGLA UFEQUIP,
          EQ.TUN_CODIGO,
          EQ.TUN_SIGLA,
          EQ.TUN_DESCRICAO,
          EQ.AREA_CODIGO,
          EQ.AREA_DESCRICAO,
          EQ.CC_CODIGO,
          EQ.EQ_CCDESCRICAO,
          EQ.UF_CODIGO,
          EQ.UF_SIGLA,
          EQ.UF_DESCRICAO,
          EQ.OPE_CODIGO,
          EQ.OPE_DESCRICAO,
          EQ.CONJ_CODIGO,
          EQ.CONJ_DESCRICAO,
          EQ.EQ_STATUS,
          EQ.EQ_DESCRICAO,
          EQ.EQ_OBS,
          EQ.EQA_CODIGO,
          EQ.EQA_TAG,
          EQ.EQA_TAGISO,
          EQ.EQA_DESCRICAO,
          OS.OS_CODIGO,
          (CASE
              WHEN AC.ACE_ACEITE IS NULL AND SS.SS_STATUS = 'ABERTO'
              THEN
                 'A'
              WHEN AC.ACE_ACEITE IS NULL AND SS.SS_STATUS = 'ENCERRADO'
              THEN
                 'P'
              WHEN AC.ACE_ACEITE IS NULL AND SS.SS_STATUS = 'ANDAMENTO'
              THEN
                 'D'
              WHEN AC.ACE_ACEITE = 'N' AND SS.SS_STATUS = 'ANDAMENTO'
              THEN
                 'N'
              WHEN AC.ACE_ACEITE = 'N' AND SS.SS_STATUS = 'ENCERRADO'
              THEN
                 'P'
              WHEN AC.ACE_ACEITE = 'S'
              THEN
                 'S'
              ELSE
                 NULL
           END)
             ACEITE,
          OS.OS_OBS
     FROM WEBUJU.SAMI_SS SS,
          WEBUJU.SAMI_OS OS,
          UAAWEB.VISAO_USUARIO V,
          UAAWEB.VISAO_USUARIO V1,
          WEBUJU.SAMI_EQUIPAMENTO_TRANSF EQ,
          WEBUJU.SAMI_TIPOSERVICO TP,
          WEBUJU.SAMI_UNIDADE_FUNCIONAL UF,
          WEBUJU.SAMI_UNIDADE_FUNCIONAL UF2,
          WEBUJU.SAMI_UNIDADE_FUNCIONAL UF3,
          WEBUJU.SAMI_CENTROCUSTO CC,
          WEBUJU.SAMI_UNIDADE UN,
          WEBUJU.SAMI_AREA AREA,
          WEBUJU.SAMI_DEFEITO D,
          WEBUJU.SAMI_ACAO A,
          (SELECT A1.OS_CODIGO, A1.ACE_ACEITE
             FROM SAMI_ACEITE A1
            WHERE A1.ACE_DATA >= (SELECT MAX (A2.ACE_DATA)
                                    FROM SAMI_ACEITE A2
                                   WHERE A2.OS_CODIGO = A1.OS_CODIGO)) AC
    --WEBUJU.SAMI_ACEITE AC
    WHERE     OS.ACAO_CODIGO = A.ACAO_CODIGO(+)
          AND SS.DEF_CODIGO = D.DEF_CODIGO(+)
          AND SS.TPS_CODIGO = TP.TPS_CODIGO(+)
          AND EQ.UF_CODIGO = UF3.UF_CODIGO(+)
          AND SS.EQ_CODIGO = EQ.EQ_CODIGO(+)
          AND SS.CC_CODIGO = CC.CC_CODIGO(+)
          AND SS.SS_CODUSUARIO = V.COD_USUARIO
          AND OS.OS_CODRESPONSAVEL = V1.COD_USUARIO(+)
          AND SS.UFS_CODIGO = UF2.UF_CODIGO(+)
          AND SS.SS_CODIGO = OS.SS_CODIGO(+)
          AND SS.UF_CODIGO = UF.UF_CODIGO
          AND SS.UN_CODIGO = UN.UN_CODIGO
          AND SS.AREA_CODIGO = AREA.AREA_CODIGO
          AND OS.OS_CODIGO = AC.OS_CODIGO(+);

Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Ola Anderssoon,

Entendo que a resposta para sua dúvida não seria tão simples assim.

Quando falamos de performance, existe uma série de fatores que pode impactar no desempenho de uma querie ou rotina PL/SQL. Não seria algo como "100% certo ou 100% errado" na sua querie.

O hardware (CPU/MEMORIA), a versão do Oracle (11g,10g,9i, 8i), a existência ou não de índices, a cardinalidade (quantidade de valores distintos) das colunas que fazem parte do WHERE de um SELECT, as transações que se encontram em execução no momento da querie, a quantidade de registros, etc... tudo isso pode impactar positivamente ou não em uma querie.

O mais importante : não existem regras fixas relacionadas a performance. O fato de uma querie executar bem em um ambiente (ex: UNIX) não significa que a mesma terá sucesso em outro ambiente (ex: WINDOWS). O fato da sua querie levar X segundos para ser executada não significa performance ruim. Você precisa considerar os fatores que eu descrevi acima.

Pode se que uma querie outra demore o mesmo tempo que a sua, mas manipule milhões de registros, sem significar que seja um problema. Depende dos objetivos da querie, como por exemplo, se ela será usada em uma tela de consulta on-line ou em uma rotina pesada de processamento noturno.

Um outro exemplo: o fato de usar IN ou EXISTS em uma querie também não significa boa ou má performance. Se este fosse o caso, todo mundo já executaria as queries com a sintaxe que proporcionasse a melhor performance.

Existem algumas ferramentas que a ORACLE proporciona onde você pode avaliar a performance de uma querie. A mais simples de todas seria o EXPLAIN PLAN, onde você pode verificar o plano de ação/execução de sua queire. A maioria das ferramentas gráficas (SQLDEVELOPER, que é free) já dispõe de opções onde você pode obter o resultado de EXPLAIN PLAN para suas queries.

Mas veja bem: se você utilizar o EXPLAIN PLAN e detectar operações de FULL SCAN não significa necessáriamente um problema. Por exemplo: eu tenho uma tabela com 5 registros e um índice associado. Pode ser que o ORACLE desdenhe o índice e faça o FULL SCAN na tabela. Por que isso? Pelo simples motivo que é mais rápido ler a tabela de 5 registros em uma única operação do que uma operação de duas etapas, envolvendo a consulta do índice e depois a da tabela.

Eu sugiro que você tente analisar a sua querie com EXPLAIN PLAN, e poste aqui o plano de ação da querie (bem como o total de registros de cada tabela acessada pela sua querie) . Acho que com estas informações os foristas poderiam lhe oferecer outras sugestões.

Abraços e boa sorte,

Sergio Coutinho
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Muito boa a resposta do Coutinho.

Concordo com tudo ali também... inclusive olhando para o código da view por alto, não consegui perceber nenhum ponto de atenção "gritante", algo que seja claramente um problema.

Uma coisa que pode ser importante: alguma das tabelas acessadas no FROM do SQL é uma view (e não uma tabela)?

Se for esse o caso, talvez dê para fazer alguma melhoria nessa "sub-view" sendo acessada, que potencialmente pode não estar otimizada com o objetivo específico da sua view.

Outra dúvida: a tabela SAMI_ACEITE possui mais ou menos quantas linhas? Você precisa de fato usar outer join em todas as ligações entre as tabelas (é um requisito)?
Avatar do usuário
fbifabio
Moderador
Moderador
Mensagens: 199
Registrado em: Ter, 22 Fev 2011 1:51 pm
Localização: São Paulo - SP
Contato:
Fábio Prado
www.fabioprado.net

Anderssoon,

A resposta do Coutinho foi ótima. Se precisar de suporte para analisar um plano de execução, sugiro a leitura do artigo http://www.fabioprado.net/2011/03/anali ... -para.html.

[]s

Fábio Prado
www.fabioprado.net
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Não tenho nada a complementar teoricamente, com as ótimas respostas dadas.
Mas por tarefa adicional, seria bom verificar se os campos de junção que você está utilizando são campos índices das tabelas envolvidas. Isso é possível verificar pelo "explain plan".
Porém, também é válido tentar, em última instância, alterar a sintaxe de sua query para a sintaxe padrão, como por ex: "LEFT OUTER JOIN .. ON". Apesar dessa sua sintaxe utilizada ser otimizada internamente, existem situações que a sintaxe padrão consegue um melhor desempenho por, de certa forma, "forçar" o uso de determinado índice que da outra forma é ignorado.
Só reforçando a idéia que o sérgio falou, o "explain plan" não é a palavra definitiva de desempenho. Um menor custo informado nele não é obrigatóriamente mais performático do que um que aparenta ser de custo mais elevado.
Avatar do usuário
Anderrssoon
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Qui, 15 Mar 2012 7:34 am

Bom dia Sergio, primeiramente quero agradecer pela quantidade de informações que você passou, este tipo de coisa que eu busco em blogs ou fóruns da internet, pessoas que estejam dispostas a passar conteúdo e que demonstram gosto em fazer isso.

Como comentei, sou iniciante em Oracle, dando pequenos passos para aprender mais sobre ele e vou estudar esta ferramenta que você indicou. E assim que tiver o plano de ação da querie eu posto aqui.

Muito obrigado.
Avatar do usuário
Anderrssoon
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Qui, 15 Mar 2012 7:34 am

fsitja escreveu:Muito boa a resposta do Coutinho.

Concordo com tudo ali também... inclusive olhando para o código da view por alto, não consegui perceber nenhum ponto de atenção "gritante", algo que seja claramente um problema.

Uma coisa que pode ser importante: alguma das tabelas acessadas no FROM do SQL é uma view (e não uma tabela)?

Se for esse o caso, talvez dê para fazer alguma melhoria nessa "sub-view" sendo acessada, que potencialmente pode não estar otimizada com o objetivo específico da sua view.

Outra dúvida: a tabela SAMI_ACEITE possui mais ou menos quantas linhas? Você precisa de fato usar outer join em todas as ligações entre as tabelas (é um requisito)?
Olá, realmente muito boa a resposta dele. Sobre o número de linhas, ela retorna 217 linhas na consulta.
Avatar do usuário
Anderrssoon
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Qui, 15 Mar 2012 7:34 am

Selecionar tudo

PLAN_TABLE_OUTPUT
Plan hash value: 220614279
 
-----------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                                       | Name                    | Rows  | Bytes |TempSpc| Cost (%CPU)| Time   |
-----------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                        |                           |   342K|   522M|       |   119K  (2)| 00:23:54 |
|   1 |  SORT ORDER BY                              |                       |   342K|   522M|  1070M|   119K  (2)| 00:23:54 |
|*  2 |   HASH JOIN RIGHT OUTER               |                 |   342K|   522M|       |  3689  (12)| 00:00:45|
|   3 |    VIEW                                         |                         |  4840 | 29040 |       |   321  (24)| 00:00:04 |
|*  4 |     HASH JOIN                                   |                         |  4840 |   170K|       |   321  (24)| 00:00:04 |
|   5 |      VIEW                                       | VW_SQ_1                 |   265 |  5830 |       |   178  (32)| 00:00:03 |
|   6 |       HASH GROUP BY                             |                         |   265 |  3180 |       |   178  (32)| 00:00:03 |
|   7 |        TABLE ACCESS FULL                        | SAMI_ACEITE             | 92165 |  1080K|       |   135  (10)| 00:00:02 |
|   8 |      TABLE ACCESS FULL                          | SAMI_ACEITE             | 92165 |  1260K|       |   137  (11)| 00:00:02 |
|*  9 |    HASH JOIN RIGHT OUTER                        |                         |   342K|   520M|       |  3346  (10)| 00:00:41 |
|  10 |     VIEW                                        | VISAO_USUARIO           |  2056 | 57568 |       |    93   (8)| 00:00:02 |
|  11 |      SORT ORDER BY                              |                         |  2056 |   257K|   584K|    93   (8)| 00:00:02 |
|* 12 |       HASH JOIN                                 |                         |  2056 |   257K|       |    30  (17)| 00:00:01 |
|  13 |        TABLE ACCESS FULL                        | UNIDADE_FUNCIONAL       |    95 |  3040 |       |     3   (0)| 00:00:01 |
|* 14 |        HASH JOIN                                |                         |  1991 |   186K|       |    26  (16)| 00:00:01 |
|  15 |         TABLE ACCESS FULL                       | PESSOA                  |  1953 | 56637 |       |     8   (0)| 00:00:01 |
|* 16 |         HASH JOIN                               |                         |  1956 |   127K|       |    17  (18)| 00:00:01 |
|  17 |          TABLE ACCESS FULL                      | USUARIOS                |  1934 | 38680 |       |     6   (0)| 00:00:01 |
|  18 |          MERGE JOIN                             |                         |  1941 | 91227 |       |    10  (20)| 00:00:01 |
|  19 |           INDEX FULL SCAN                       | PK_UNIDADES             |     5 |       |       |     1   (0)| 00:00:01 |
|* 20 |           SORT JOIN                             |                         |  1941 | 77640 |       |     8  (25)| 00:00:01 |
|  21 |            TABLE ACCESS FULL                    | FUNCIONARIO             |  1941 | 77640 |       |     6   (0)| 00:00:01 |
|* 22 |     HASH JOIN RIGHT OUTER                       |                         |   198K|   296M|       |  3231   (9)| 00:00:39 |
|  23 |      TABLE ACCESS FULL                          | SAMI_UNIDADE_FUNCIONAL  |   133 |  1197 |       |     3   (0)| 00:00:01 |
|* 24 |      HASH JOIN RIGHT OUTER                      |                         |   198K|   294M|       |  3215   (9)| 00:00:39 |
|  25 |       VIEW                                      | SAMI_EQUIPAMENTO_TRANSF |    37 | 37592 |       |   282  (13)| 00:00:04 |
|* 26 |        FILTER                                   |                         |       |       |       |            |          |
|  27 |         HASH GROUP BY                           |                         |    37 | 21978 |       |   282  (13)| 00:00:04 |
|* 28 |          HASH JOIN                              |                         |  2620 |  1519K|       |   280  (13)| 00:00:04 |
|* 29 |           HASH JOIN RIGHT OUTER                 |                         |   890 |   491K|       |   224  (13)| 00:00:03 |
|  30 |            TABLE ACCESS FULL                    | SAMI_UNIDADE_FUNCIONAL  |   133 |  5852 |       |     3   (0)| 00:00:01 |
|* 31 |            HASH JOIN                            |                         |   890 |   453K|       |   220  (12)| 00:00:03 |
|  32 |             TABLE ACCESS FULL                   | SAMI_CENTROCUSTO        |   125 |  3500 |       |     3   (0)| 00:00:01 |
|* 33 |             HASH JOIN RIGHT OUTER               |                         |   886 |   427K|       |   217  (12)| 00:00:03 |
|  34 |              TABLE ACCESS FULL                  | SAMI_CONJUNTO           |  2967 |   121K|       |     6   (0)| 00:00:01 |
|* 35 |              HASH JOIN RIGHT OUTER              |                         |   522 |   230K|       |   210  (12)| 00:00:03 |
|  36 |               TABLE ACCESS FULL                 | SAMI_FORNECEDORES       |   292 | 13432 |       |     4   (0)| 00:00:01 |
|* 37 |               HASH JOIN RIGHT OUTER             |                         |   363 |   143K|       |   205  (12)| 00:00:03 |
|  38 |                TABLE ACCESS FULL                | SAMI_OPERACIONAL        |   817 | 26961 |       |     3   (0)| 00:00:01 |
|* 39 |                HASH JOIN                        |                         |   266 | 99218 |       |   201  (12)| 00:00:03 |
|  40 |                 TABLE ACCESS FULL               | SAMI_FAMILIA            |   169 |  4563 |       |     3   (0)| 00:00:01 |
|* 41 |                 HASH JOIN OUTER                 |                         |   241 | 83386 |       |   198  (12)| 00:00:03 |
|  42 |                  NESTED LOOPS                   |                         |   241 | 66998 |       |   130  (13)| 00:00:02 |
|* 43 |                   HASH JOIN                     |                         |   241 | 63383 |       |   130  (13)| 00:00:02 |
|* 44 |                    HASH JOIN                    |                         |   194 | 22892 |       |    62  (15)| 00:00:01 |
|  45 |                     TABLE ACCESS FULL           | SAMI_UNIDADE            |     5 |   190 |       |     3   (0)| 00:00:01 |
|  46 |                     NESTED LOOPS OUTER          |                         |   194 | 15520 |       |    58  (14)| 00:00:01 |
|* 47 |                      TABLE ACCESS FULL          | SAMI_TRANSFERENCIA      |   194 | 11058 |       |    56  (13)| 00:00:01 |
|  48 |                      TABLE ACCESS BY INDEX ROWID| SAMI_AREA               |     1 |    23 |       |     1   (0)| 00:00:01 |
|* 49 |                       INDEX UNIQUE SCAN         | XPKSAMI_AREA            |     1 |       |       |     0   (0)| 00:00:01 |
|  50 |                    TABLE ACCESS FULL            | SAMI_EQUIPAMENTO        | 13549 |  1918K|       |    67   (9)| 00:00:01 |
|* 51 |                   INDEX UNIQUE SCAN             | XPKSAMI_UNIDADE         |     1 |    15 |       |     0   (0)| 00:00:01 |
|  52 |                  TABLE ACCESS FULL              | SAMI_EQUIPAMENTO        | 13549 |   899K|       |    66   (8)| 00:00:01 |
|* 53 |           TABLE ACCESS FULL                     | SAMI_TRANSFERENCIA      | 19394 |   530K|       |    54  (10)| 00:00:01 |
|* 54 |       HASH JOIN                                 |                         |   198K|   102M|       |  2921   (8)| 00:00:36 |
|  55 |        INDEX FULL SCAN                          | PK_UNIDADE_FUNCIONAL    |    95 |   380 |       |     1   (0)| 00:00:01 |
|* 56 |        HASH JOIN                                |                         |   192K|    98M|       |  2907   (8)| 00:00:35 |
|  57 |         TABLE ACCESS FULL                       | PESSOA                  |  1953 | 56637 |       |     8   (0)| 00:00:01 |
|* 58 |         HASH JOIN                               |                         |   188K|    91M|       |  2886   (7)| 00:00:35 |
|  59 |          INDEX FULL SCAN                        | PK_UNIDADES             |     5 |    15 |       |     1   (0)| 00:00:01 |
|* 60 |          HASH JOIN                              |                         |   188K|    90M|       |  2873   (7)| 00:00:35 |
|  61 |           TABLE ACCESS FULL                     | FUNCIONARIO             |  1941 | 31056 |       |     6   (0)| 00:00:01 |
|* 62 |           HASH JOIN                             |                         |   186K|    87M|       |  2855   (7)| 00:00:35 |
|  63 |            TABLE ACCESS FULL                    | USUARIOS                |  1934 | 15472 |       |     6   (0)| 00:00:01 |
|* 64 |            HASH JOIN                            |                         |   114K|    52M|       |  2836   (6)| 00:00:35 |
|  65 |             TABLE ACCESS FULL                   | SAMI_UNIDADE_FUNCIONAL  |   133 |  4256 |       |     3   (0)| 00:00:01 |
|* 66 |             HASH JOIN                           |                         |   114K|    49M|       |  2826   (6)| 00:00:34 |
|  67 |              TABLE ACCESS FULL                  | SAMI_AREA               |     2 |    26 |       |     3   (0)| 00:00:01 |
|* 68 |              HASH JOIN RIGHT OUTER              |                         |   114K|    47M|       |  2815   (6)| 00:00:34 |
|  69 |               TABLE ACCESS FULL                 | SAMI_ACAO               |   311 |  4043 |       |     3   (0)| 00:00:01 |
|* 70 |               HASH JOIN RIGHT OUTER             |                         |   114K|    46M|    10M|  2805   (6)| 00:00:34 |
|  71 |                TABLE ACCESS FULL                | SAMI_OS                 | 91791 |  9232K|       |   347   (9)| 00:00:05 |
|* 72 |                HASH JOIN RIGHT OUTER            |                         | 92109 |    28M|       |   479  (16)| 00:00:06 |
|  73 |                 TABLE ACCESS FULL               | SAMI_UNIDADE_FUNCIONAL  |   133 |  4256 |       |     3   (0)| 00:00:01 |
|* 74 |                 HASH JOIN                       |                         | 92109 |    25M|       |   470  (15)| 00:00:06 |
|  75 |                  TABLE ACCESS FULL              | SAMI_UNIDADE            |     5 |   130 |       |     3   (0)| 00:00:01 |
|* 76 |                  HASH JOIN RIGHT OUTER          |                         | 92109 |    23M|       |   461  (14)| 00:00:06 |
|  77 |                   TABLE ACCESS FULL             | SAMI_CENTROCUSTO        |   125 |  3250 |       |     3   (0)| 00:00:01 |
|* 78 |                   HASH JOIN RIGHT OUTER         |                         | 92109 |    20M|       |   452  (13)| 00:00:06 |
|  79 |                    TABLE ACCESS FULL            | SAMI_DEFEITO            |   344 | 12040 |       |     3   (0)| 00:00:01 |
|* 80 |                    HASH JOIN RIGHT OUTER        |                         | 92109 |    17M|       |   442  (12)| 00:00:06 |
|  81 |                     TABLE ACCESS FULL           | SAMI_TIPOSERVICO        |   282 | 11844 |       |     3   (0)| 00:00:01 |
|  82 |                     TABLE ACCESS FULL           | SAMI_SS                 | 92109 |    13M|       |   433  (11)| 00:00:06 |
-----------------------------------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   2 - access("OS"."OS_CODIGO"="AC"."OS_CODIGO"(+))
   4 - access("OS_CODIGO"="A1"."OS_CODIGO")
       filter("A1"."ACE_DATA">="VW_COL_1")
   9 - access("OS"."OS_CODRESPONSAVEL"="V1"."COD_USUARIO"(+))
  12 - access("UF"."COD_UF"="F"."COD_UF")
  14 - access("F"."PES_CODIGO"="P"."PES_CODIGO")
  16 - access("U"."COD_FUNC"="F"."COD_FUNC")
  20 - access("UN"."COD_UNIDADE"="F"."COD_UNIDADE")
       filter("UN"."COD_UNIDADE"="F"."COD_UNIDADE")
  22 - access("EQ"."UF_CODIGO"="UF3"."UF_CODIGO"(+))
  24 - access("SS"."EQ_CODIGO"="EQ"."EQ_CODIGO"(+))
  26 - filter("T"."TRANS_DATA"=MAX("T2"."TRANS_DATA") AND "T"."TRANS_CODIGO"=MAX("T2"."TRANS_CODIGO"))
  28 - access("T2"."EQ_CODIGO"="EQ"."EQ_CODIGO")
  29 - access("T"."UF_CODIGO"="UF"."UF_CODIGO"(+))
  31 - access("EQ"."CC_CODIGO"="CC"."CC_CODIGO")
  33 - access("T"."CONJ_CODIGO"="CONJ"."CONJ_CODIGO"(+))
  35 - access("EQ"."FORN_CODIGO"="FORN"."FORN_CODIGO"(+))
  37 - access("T"."OPE_CODIGO"="OP"."OPE_CODIGO"(+))
  39 - access("EQ"."FAM_CODIGO"="F"."FAM_CODIGO")
  41 - access("EQ"."EQ_EQACIONADO"="EQ2"."EQ_CODIGO"(+))
  43 - access("T"."EQ_CODIGO"="EQ"."EQ_CODIGO")
  44 - access("T"."UN_CODIGO"="TUN"."UN_CODIGO")
  47 - filter(UPPER("T"."TRANS_STATUS") LIKE 'TRANSFERIDO')
  49 - access("T"."AREA_CODIGO"="A"."AREA_CODIGO"(+))
  51 - access("U"."UN_CODIGO"="EQ"."UN_CODIGO")
  53 - filter("T2"."TRANS_STATUS" LIKE 'TRANSFERIDO')
  54 - access("UF"."COD_UF"="F"."COD_UF")
  56 - access("F"."PES_CODIGO"="P"."PES_CODIGO")
  58 - access("UN"."COD_UNIDADE"="F"."COD_UNIDADE")
  60 - access("U"."COD_FUNC"="F"."COD_FUNC")
  62 - access("SS"."SS_CODUSUARIO"="U"."COD_USUARIO")
  64 - access("SS"."UF_CODIGO"="UF"."UF_CODIGO")
  66 - access("SS"."AREA_CODIGO"="AREA"."AREA_CODIGO")
  68 - access("OS"."ACAO_CODIGO"="A"."ACAO_CODIGO"(+))
  70 - access("SS"."SS_CODIGO"="OS"."SS_CODIGO"(+))
  72 - access("SS"."UFS_CODIGO"="UF2"."UF_CODIGO"(+))
  74 - access("SS"."UN_CODIGO"="UN"."UN_CODIGO")
  76 - access("SS"."CC_CODIGO"="CC"."CC_CODIGO"(+))
  78 - access("SS"."DEF_CODIGO"="D"."DEF_CODIGO"(+))
  80 - access("SS"."TPS_CODIGO"="TP"."TPS_CODIGO"(+))
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Anderrssoon,

Eu dei uma olhada no seu plano de ação. Ele realmente faz muitas operações de FULL SCAN, mas você precisa levar em conta que você está fazendo muitas operações de OUTER JOIN (+).

Notei que você também relaciona algumas tabelas mais de uma vez na querie. Talvez porque precise obter informações diferentes para as colunas.

Se acha que realmente você está tendo problemas de performance, talvez você pudesse reescrever a querie, levando em conta o seguinte:

- Tente desmembrar esta querie unica em várias queries menores, cada uma delas obtendo uma parte das colunas
que compõe o resultado final;
- Neste primeiro momento, pode deixar de fora os NVL, DECODES e demais cálculos. Certifique-se de que
as colunas que você irá precisar para os calculos, CASE, DECODE, etc estejam relacionadas. não se esqueca de
adicionar outras colunas para permitir o join entre as subqueries (ver passo mais à frente);
- Verifique para cada uma das queries menores se haveria uma forma de você aplicar filtros BEM restritivos, que
realmente filtrassem dados (ex: COLUNA = <VALOR>"), evitando que um grande volume de dados desnecessários
sejam retornados;
- Se puder aplicar filtros, veja se valeria a pena indexar as colunas que são usadas nos filtros;
- Faça um EXPLAIN PLAN para cada uma destas queries pequenas .. veja se pode melhorar as mesmas;
- Por ultimo, monte uma querie unica, onde cada uma das queries pequenas são como "tabelas/views" da querie
principal. É como se elas fossem subqueries da querie principal.

Selecionar tudo

SELECT ...
                     CASE ..
                     DECODE ...
                     NVL...
                     NVL2 ...
                     ....
           FROM  (SELECT ... FROM .... WHERE ..) A, /*sub-querie "especialista" A */
                      (SELECT ... FROM .... WHERE ..) B, /*sub-querie "especialista" B */
                      .........
                      (SELECT ... FROM .... WHERE ..) Z  /*sub-querie "especialista" Z */
           WHERE  A. ... = B ... (+)
               AND  B. ..   = ...    (+)
               AND  ....
- Nesta querie única, os CASE, DECODE, NVL, CALCULOS estariam presentes, bem como os OUTER JOINS.;
- Compare esta nova querie com a anterior. Houve melhora?

Isso é mais uma sugestão, que talvez nem seja seguida por outros foristas.

Eu prefiro, ao invés de criar uma única querie gigante, quebrar a mesma sem "subqueries especialistas" para obter determinadas colunas da querie final.

Creio que assim fica mais fácil de interpretar a querie e fazer manutenções na mesma, caso necessário.

Abraços,

Sergio Coutinho
marlonsc
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Ter, 28 Ago 2012 4:33 pm
Localização: São Paulo
Contato:

Anderson, bom dia,

Qual o desempenho desta fração da consulta?

Selecionar tudo

SELECT A1.OS_CODIGO, A1.ACE_ACEITE
  FROM SAMI_ACEITE A1
 WHERE A1.ACE_DATA >= (SELECT MAX (A2.ACE_DATA)
                         FROM SAMI_ACEITE A2
                        WHERE A2.OS_CODIGO = A1.OS_CODIGO);
Se ela estiver lenta você pode precisar criar um índice por

Selecionar tudo

SAMI_ACEITE (A1.OS_CODIGO, A1.ACE_ACEITE, A1.ACE_DATA)
Tem uma forma mais radical utilizando a forma analítica:

Selecionar tudo

SELECT A1.OS_CODIGO, 
       MAX(A1.ACE_ACEITE) OVER (PARTITION BY A1.OS_CODIGO ORDER BY A1.ACE_DATA)
  FROM SAMI_ACEITE A1;
Saudações,

Marlon Costa
http://www.marlonscdba.com
Avatar do usuário
Anderrssoon
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Qui, 15 Mar 2012 7:34 am

Bom dia Marlon. O desempenho desta fração de consulta esta bom, retorna um grande número de linhas em pouco tempo.
Avatar do usuário
Anderrssoon
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Qui, 15 Mar 2012 7:34 am

Bom dia stcoutinho, ainda não consegui resolver o problema desta view, meu conhecimento relacionado ao itens que você comentou é bem pequeno, teria como você entrar em detalhes?

Eu utilizo esta view em uma consulta como por exemplo:

Selecionar tudo

  SELECT * 
  FROM  WEBUJU.SAMI_VIEW_SS 
WHERE  UF_CODIGO = 139 
     AND  SS_TIPOSS = 2 
     AND  UN_CODIGO = 6 
     AND  ACEITE = 'A' 
     AND SS_TPMANUTENCAO = COALESCE(TO_NUMBER(''),  SS_TPMANUTENCAO)   
 ORDER BY EQ_GRAVIDADE DESC, SS_CODIGO 
Esta consulta esta demorando em torna de 1 a 1 minuto e meio para retornar as informações.
Avatar do usuário
Anderrssoon
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Qui, 15 Mar 2012 7:34 am

E a mesma consulta só que passando valores diferentes demora 6 segundos para trazer as informações.

Selecionar tudo

SELECT * 
  FROM  WEBUJU.SAMI_VIEW_SS 
WHERE  UF_CODIGO = 10 
    AND   SS_TIPOSS = 2 
    AND   UN_CODIGO = 1 
    AND  ACEITE = 'A'  
    AND SS_TPMANUTENCAO = COALESCE(TO_NUMBER(''),  SS_TPMANUTENCAO)   
    
    
ORDER BY EQ_GRAVIDADE DESC, SS_CODIGO 
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 11 visitantes