Pular para o conteúdo
Visualizando 5 posts - 1 até 5 (de 5 do total)
  • Autor
    Posts
  • #88617
    ramasine
    Participante

      Caros…

      Qual a saída mais completa que vc usam para formatar o trace com o TKPROF? Tem algum que seja meio que “padrão?

      #88619
      jspaulonci
      Participante

        Bom dia Ramasine, eu usso esse

        tkprof mlap_ora_9337.trc mlap_ora_9337.log explain=system/migdbmod table=sys.plan_table sys=no

        Abraços

        #88625
        David Siqueira
        Participante

          Talvez você encontre algo interessante nesse BLOG sobre TKPROF :

          https://profissionaloracle.com.br/blogs/drbs/2009/06/30/tkprof-utilizar-ou-nao-e-porque/

          Abraço!

          #88628
          ramasine
          Participante

            Galera,

            Vou postar aqui parte do TKPROF, que fiz com a sort_options= fchcpu.
            Tem o Oracle Spatial neste banco de dados!

            TKPROF: Release 10.1.0.5.0 – Production on Thu Aug 6 13:11:56 2009

            Copyright (c) 1982, 2005, Oracle. All rights reserved.

            Trace file: sigp_ora_2572382.trc
            Sort options: fchcpu
            ********************************************************************************
            count = number of times OCI procedure was executed
            cpu = cpu time in seconds executing
            elapsed = elapsed time in seconds executing
            disk = number of physical reads of buffers from disk
            query = number of buffers gotten for consistent read
            current = number of buffers gotten in current mode (usually for update)
            rows = number of rows processed by the fetch or execute call
            ********************************************************************************

            SELECT GET_INTERSECTION_POLYGON(:B1 , MIP.MIP_POLIGONO)
            FROM SIG_MIG_ITM_POL_CA2009 MIP WHERE PLA_ID = :B2 AND MIP_POLIGONO IS NOT NULL AND SDO_RELATE(MIP.MIP_POLIGONO, :B1 , ‘MASK=ANYINTERACT’) = ‘TRUE’

            call count cpu elapsed disk query current rows
            ——- —— ——– ———- ———- ———- ———- ———-
            Parse 0 0.00 0.00 0 0 0 0
            Execute 355 21.45 53.00 0 9620 710 0
            Fetch 710 1191.90 2234.48 86 1149761 0 355
            ——- —— ——– ———- ———- ———- ———- ———-
            total 1065 1213.35 2287.49 86 1159381 710 355

            Misses in library cache during parse: 0
            Optimizer mode: ALL_ROWS
            Parsing user id: 187 (PEX) (recursive depth: 1)
            error during execute of EXPLAIN PLAN statement
            ORA-06553: PLS-306: wrong number or types of arguments in call to ‘GET_INTERSECTION_POLYGON’

            parse error offset: 75

            Elapsed times include waiting on following events:
            Event waited on Times Max. Wait Total Waited
            —————————————- Waited ———- ————
            latch: row cache objects 8 0.00 0.01
            db file sequential read 48 0.00 0.05
            latch: object queue header operation 1 0.00 0.00
            latch: cache buffers chains 1 0.00 0.00
            latch: library cache 1 0.00 0.00
            ********************************************************************************

            O fato é que não consigo otimizar a query que vem logo em primeiro lugar, e com mais consumo de CPU:

            SELECT GET_INTERSECTION_POLYGON(:B1 , MIP.MIP_POLIGONO)
            FROM SIG_MIG_ITM_POL_CA2009 MIP WHERE PLA_ID = :B2 AND MIP_POLIGONO IS NOT NULL AND SDO_RELATE(MIP.MIP_POLIGONO, :B1 , ‘MASK=ANYINTERACT’) = ‘TRUE’

            Tem um erro apontado…
            tem como mudar a passagem dos argumentos, das variáveis..ou algo do tipo?

            Qq ajuda é bem-vinda!

            #88630
            ramasine
            Participante

              O GET_INTERSECTION_POLYGON é uma FUNCTION, abaixo o código dela:

              CREATE OR REPLACE FUNCTION HOR.get_intersection_polygon(p_poligono1 IN MDSYS.SDO_GEOMETRY, p_poligono2 IN MDSYS.SDO_GEOMETRY)
              RETURN SDO_GEOMETRY IS
              v_pol_valido NUMBER := 0;
              v_sdo_gtype NUMBER := 0;
              v_pol_inter SDO_GEOMETRY := null;
              v_poligono SDO_GEOMETRY := null;
              v_pol_final SDO_GEOMETRY := null;
              num_elems NUMBER := 0;
              area_pol_inv NUMBER;
              BEGIN
              v_pol_inter := SDO_GEOM.SDO_INTERSECTION(p_poligono1, p_poligono2, MISC.get_tol_inf_esp_cruzamentos);
              IF v_pol_inter IS NOT NULL THEN
              v_pol_valido := VALIDATE_GEOMETRY_SDO(v_pol_inter); — validar geometria de intercepção
              IF v_pol_valido 1 THEN — se poligono de intercepção invalido tentar corrigir o poligono
              v_pol_inter := SDO_UTIL.REMOVE_DUPLICATE_VERTICES (v_pol_inter, MISC.get_tol_inf_esp);– MISC.get_tol_inf_esp_simplify
              v_pol_inter := SDO_UTIL.SIMPLIFY(v_pol_inter,MISC.get_tol_inf_esp_simplify,MISC.get_tol_inf_esp_simplify);
              v_pol_valido := VALIDATE_GEOMETRY_SDO(v_pol_inter);
              IF v_pol_valido 1 THEN
              area_pol_inv := SDO_GEOM.sdo_area(v_pol_inter, MISC.get_tol_inf_esp_cruzamentos);
              IF area_pol_inv < 4.5 THEN
              RETURN NULL;
              ELSE
              –RAISE_APPLICATION_ERROR( -20000,'ERRO : HOR.get_intersection_polygon – poligono inválido');
              IF (area_pol_inv < 10) THEN
              v_pol_inter := SDO_UTIL.REMOVE_DUPLICATE_VERTICES (v_pol_inter, MISC.get_tol_inf_esp);– MISC.get_tol_inf_esp_simplify
              v_pol_inter := SDO_UTIL.SIMPLIFY(v_pol_inter, MISC.get_tol_inf_esp_simplify, MISC.get_tol_inf_esp_simplify); — <– tolerancia para contornar erro
              v_pol_valido := VALIDATE_GEOMETRY_SDO(v_pol_inter);
              IF v_pol_valido 1 THEN
              RAISE_APPLICATION_ERROR( -20000,’ERRO : HOR.get_intersection_polygon – poligono inválido’);
              END IF;
              ELSE
              RAISE_APPLICATION_ERROR( -20000,’ERRO : HOR.get_intersection_polygon – poligono inválido’);
              END IF;

              END IF;
              END IF;
              END IF;
              v_sdo_gtype := v_pol_inter.SDO_GTYPE;–obter tipo de geometria do poligono de intercepção
              IF v_sdo_gtype IN (2003, 2007) THEN — se geometria de intercepção é poligono ou multipoligono retorna o poligono ou multipoligono
              RETURN v_pol_inter;
              ELSIF v_sdo_gtype IN (2001,2002,2005,2006) THEN — se geometria de intercepção é ponto,linha,multiponto ou multilinha retorna null
              RETURN null;
              ELSIF v_sdo_gtype = 2004 THEN — se geometria de intercepção é uma colecção, criar multipoligono com a união dos poligonos da colecção
              num_elems := SDO_UTIL.GETNUMELEM(v_pol_inter);
              FOR i IN 1..num_elems
              LOOP
              v_poligono := SDO_UTIL.EXTRACT(v_pol_inter,i);
              v_sdo_gtype := v_poligono.SDO_GTYPE;
              IF v_sdo_gtype IN (2003,2007) THEN — se a geometria da colecção de geometrias é poligono ou multipoligono
              v_pol_final := SDO_GEOM.SDO_UNION(v_pol_final, v_poligono, MISC.get_tolerancia_inf_espacial);
              ELSIF v_sdo_gtype = 2004 THEN — em pricípio não entra neste troço pois segundo doc. oracle uma colecção não contem outra colecção
              RAISE_APPLICATION_ERROR( -20000,’ERRO : HOR.get_intersection_polygon – colecção contem outra colecção!’);
              END IF;
              END LOOP;
              v_pol_inter := v_pol_final;
              END IF;
              END IF;
              RETURN v_pol_inter;
              END get_intersection_polygon;

              Existe alguma ferramenta em que eu possa analisar esse código? E assim obter caminhos alternativos ou melhorias?

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