- Este tópico contém 4 respostas, 3 vozes e foi atualizado pela última vez 16 anos, 7 meses atrás por
ramasine.
-
AutorPosts
-
6 de agosto de 2009 às 2:46 pm #88617
ramasine
ParticipanteCaros…
Qual a saída mais completa que vc usam para formatar o trace com o TKPROF? Tem algum que seja meio que “padrão?
6 de agosto de 2009 às 3:41 pm #88619jspaulonci
ParticipanteBom 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
6 de agosto de 2009 às 4:19 pm #88625David Siqueira
ParticipanteTalvez 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!
6 de agosto de 2009 às 4:34 pm #88628ramasine
ParticipanteGalera,
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 355Misses 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!
6 de agosto de 2009 às 4:45 pm #88630ramasine
ParticipanteO 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?
-
AutorPosts
- Você deve fazer login para responder a este tópico.