Oracle - insert into select

 
Vista:

insert into select

Publicado por CUARES (17 intervenciones) el 05/03/2010 00:49:24
saludo foreros.
tengo el siguiente problema.
una consulta que tarda 11 segundos en presentarme datos pero cuando esa misma consulta la meto en un insert into tabla temporal y mi query tarda 50 minutos en meter los datos

ya revise mi consulta esta bien, el plan de ejecucion esta bien pero el problema es al insertar los dato, lo intente con el create table y a los 20 minutos cancele el proceso ,al igual lo hice con una vista e intente insertar y el tiempo es muy elevado existe algun metodo que me permita realizar mas rapido.

no se si emito algo o solo me presenta algunos datos en pantalla al hacer mi consulta y no toda la informacion, son 170,144 registros.

si alguien tiene alguna pista lo agradeceria saludos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:insert into select

Publicado por Alvaro (3 intervenciones) el 10/03/2010 14:31:13
pon la query por aqui, q simpre habra alguien q la optimice hombre!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:insert into select

Publicado por cuares (17 intervenciones) el 10/03/2010 16:32:03
ok les pongo el query, tengo poco tiempo con oracle pero lo que sigo soin entender por que si la consulto la visualizo muy rapido por que el insert tarda tanto, espero que alguien me pueda orientar un poco.
saludos.
INSERT INTO REP_EMI_CONSOLIDADO
SELECT
CVE_SUBRAMO, SUBRAMO,MOVIMIENTO, F_INICIO_VIG, F_FIN_VIG,PCT_COMISION, PCT_ADMON, PCT_ADQUI, PCT_UTILIDAD, PCT_DESCTO_VOL,
FORMA_PAGO, NUM_AGENTE,Tipo_Agente, Prima_Cobro,RAZON_SOCIAL,CONTRATANTE,IMP_PN_BON, IMP_DEREMIS_TOT, FH_EMISION,
IMP_RCGO_FPAGO, IMP_IVA, IMP_PT, IMP_COMIS_BON_PN,IMP_COMIS_PF,IMP_COMIS_PM,POLIZA, num_endoso,COBERTURA,PRODUCTO,
ID_UNIDAD_NEGOCIO,ID_EMISOR,ID_COTIZACION,ID_RENOVACION, ID_SOL_ENDOSO,F_INICIO_VIG_POL, F_FIN_VIG_POL, FH_EMISION_POL,
F_INICIO_VIG_END, F_FIN_VIG_END, FH_EMISION_END,FH_EMISION_DOCTO, MES_EMISION,PPLAN, NUMASEG,TIPO_EMISION, NUM_RECIBO,
F_INI_COB_REC, NOMBRE, A_PATERNO, A_MATERNO, F_NACIMIENTO, GENERO,PARENTESCO,CODIGO_POSTAL , CVE_EDO_CIVIL, ID_EMPLEADO,
0 TITULARES, 0 DEPENDIENTES, GTOS_ADMON, GTOS_ADQUI, GTOS_UTILIDAD, PRIMA_RIESGO,ID_INCISO,NOM_EJECUTIVO,POLIZA_AGRP, pct_rcgo_fpago, tipo_movimiento
FROM (
SELECT /*+ index (cont pk_emi_contratante) index(DETCON pk_con_det_concepto) index(pol pk_emi_poliza) index(pro pk_pro_producto) index(agte pk_ae_agente) index(pfp pk_pro_forma_pago) */
'1' tipo_movimiento, DETCON.CLAVE_DET_CONCEPTO AS CVE_SUBRAMO, DETCON.DET_CONCEPTO AS SUBRAMO,'POLIZA' AS MOVIMIENTO,
TO_CHAR(POL.F_INICIO_VIG,'DD/MM/YYYY')F_INICIO_VIG, TO_CHAR(POL.F_FIN_VIG,'DD/MM/YYYY')F_FIN_VIG,
POL.ID_UNIDAD_NEGOCIO,POL.ID_EMISOR,POL.ID_COTIZACION,POL.ID_RENOVACION, 0 ID_SOL_ENDOSO,
POL.PCT_COMISION, POL.PCT_ADMON, POL.PCT_ADQUI, POL.PCT_UTILIDAD, POL.PCT_DESCTO_VOL,
PFP.FORMA_PAGO FORMA_PAGO, AGTE.NUM_AGENTE NUM_AGENTE,
DECODE(AGTE.CVE_TIPO_AGENTE, 'TA_PRO', 'MORAL ', 'FÍSICA')TIPO_AGENTE,
case when REC.CVE_ORIGEN_RECIBO in ('CO_POL', 'CO_END') then DECODE(REC.FOLIO, 1, DESG.IMP_PN_BON,0) else 0 end Prima_Cobro,
PERCONT.RAZON_SOCIAL,PERCONT.RAZON_SOCIAL CONTRATANTE,
DESG.IMP_PN_BON, DESG.IMP_DEREMIS_TOT,TO_CHAR(POL.FH_EMISION,'YYYY/MM/DD') FH_EMISION,
DESG.IMP_RCGO_FPAGO, DESG.IMP_IVA, DESG.IMP_PT, DESG.IMP_COMIS_BON_PN,
PKG_REPORTES.FNC_COMIS_AGTE(POL.ID_AGENTE, DESG.IMP_COMIS_BON_PN, 'F') IMP_COMIS_PF,
PKG_REPORTES.FNC_COMIS_AGTE(POL.ID_AGENTE, DESG.IMP_COMIS_BON_PN, 'M') IMP_COMIS_PM,
POL.NUM_POLIZA || '-' || POL.ID_RENOVACION AS POLIZA,'0000000100000000' num_endoso,
CASE WHEN DECODE(INSTR(UPPER(PRO.PRODUCTO), 'DENTAL'), 0, 0, 1) = 1 THEN 'DENTAL'
WHEN DECODE(INSTR(UPPER(PRO.PRODUCTO), 'VISION'), 0, 0, 1) = 1 THEN 'VISION'
ELSE 'ERROR EN PRODUCTO' END COBERTURA,PRO.PRODUCTO,
TO_CHAR(POL.F_INICIO_VIG,'DD/MM/YYYY') F_INICIO_VIG_POL,TO_CHAR(POL.F_FIN_VIG,'DD/MM/YYYY') F_FIN_VIG_POL, TO_CHAR(POL.FH_EMISION,'DD/MM/YYYY') FH_EMISION_POL,
'0' F_INICIO_VIG_END,'0' F_FIN_VIG_END, '0' FH_EMISION_END,
TO_CHAR(POL.FH_EMISION,'DD/MM/YYYY') FH_EMISION_DOCTO,
to_char(POL.FH_EMISION,'YYYYMM') MES_EMISION,
substr(pkg_funciones.regresa_plan_inciso(pol.id_unidad_negocio,pol.id_emisor,pol.id_cotizacion,pol.id_renovacion,inc.id_inciso,pol.id_producto,pol.id_version),1,100) PPLAN,
substr(pkg_funciones.REGRESA_NUMASEG_DOC(pol.id_unidad_negocio,pol.id_emisor,pol.id_cotizacion,pol.id_renovacion,0,'POL'),1,100) NUMASEG,
case when to_char(to_number(pol.id_cotizacion))=pol.num_folio_sol then 'Póliza Nueva' Else pol.num_folio_sol end TIPO_EMISION,
REC.NUM_RECIBO,REC.F_INICIO_COBERTURA AS F_INI_COB_REC, INC.NOMBRE, INC.A_PATERNO, INC.A_MATERNO, INC.F_NACIMIENTO,
DECODE(INC.CVE_GENERO,'SX_MAS','MASCULINO','SX_FEM','FEMENINO') GENERO,
DECODE(INC.CVE_PARENTESCO,'CP_ABU','ABUELO','CP_CON','CONYUGE','CP_HER','HERMANO(A)','CP_HIJ','HIJO(A)','CP_OTR','OTRO','CP_PAD','PADRE(MADRE)','CP_SUE','SUEGRO(A)','CP_TIT','TITULAR','ERROR') PARENTESCO,
INC.CODIGO_POSTAL , INC.CVE_EDO_CIVIL, INC.ID_EMPLEADO,INC.ID_INCISO,
(DESG.IMP_PN_BON * POL.PCT_ADMON) as GTOS_ADMON, (DESG.IMP_PN_BON * POL.PCT_ADQUI) AS GTOS_ADQUI,
(DESG.IMP_PN_BON * POL.PCT_UTILIDAD) AS GTOS_UTILIDAD ,
(DESG.IMP_PN_BON-(DESG.IMP_PN_BON * POL.PCT_ADMON)-(DESG.IMP_PN_BON * POL.PCT_ADQUI)-(DESG.IMP_PN_BON * POL.PCT_UTILIDAD)) AS PRIMA_RIESGO,
POL.NOM_EJECUTIVO ,'000' POLIZA_AGRP ,pol.pct_rcgo_fpago
FROM EMI_RECIBO_DESGLOSADO DESG, EMI_RECIBO REC, EMI_POLIZA POL, EMI_PERSONA PERCONT,EMI_INCISO INC,EMI_CONTRATANTE CONT,
PRO_PRODUCTO PRO, AE_AGENTE AGTE, PRO_FORMA_PAGO PFP, CON_DET_CONCEPTO DETCON
WHERE REC.CVE_ORIGEN_RECIBO = 'CO_POL'
AND REC.CVE_TIPO_RECIBO ='CTR_RN'
AND REC.ID_SOL_ENDOSO IS NULL
AND REC.NUM_RECIBO = DESG.NUM_RECIBO

AND REC.ID_VERSION_RECIBO = DESG.ID_VERSION_RECIBO
AND DESG.ID_VERSION_RECIBO = PKG_FUNCIONES.STP_CON_AJUSTE(rec.num_recibo,to_date('31/01/2010'))
AND REC.ID_UNIDAD_NEGOCIO = POL.ID_UNIDAD_NEGOCIO
AND REC.ID_EMISOR = POL.ID_EMISOR
AND REC.ID_COTIZACION = POL.ID_COTIZACION
AND REC.ID_RENOVACION = POL.ID_RENOVACION
AND POL.ID_CONTRATANTE = CONT.ID_CONTRATANTE
AND POL.ID_UNIDAD_NEGOCIO = PERCONT.ID_UNIDAD_NEGOCIO(+)
AND POL.ID_EMISOR = PERCONT.ID_EMISOR(+)
AND POL.ID_COTIZACION = PERCONT.ID_COTIZACION(+)
AND POL.ID_RENOVACION = PERCONT.ID_RENOVACION(+)
AND (CONT.ID_PERSONA = PERCONT.ID_PERSONA OR PERCONT.ID_PERSONA IS NULL)
AND DESG.ID_CONCEPTO = DETCON.ID_CONCEPTO
AND DESG.ID_DET_CONCEPTO = DETCON.ID_DET_CONCEPTO
AND INC.ID_UNIDAD_NEGOCIO = DESG.ID_UNIDAD_NEGOCIO
AND INC.ID_EMISOR= DESG.ID_EMISOR
AND INC.ID_COTIZACION = DESG.ID_COTIZACION
AND INC.ID_RENOVACION = DESG.ID_RENOVACION
AND INC.ID_INCISO = DESG.ID_INCISO
AND POL.ID_AGENTE = AGTE.ID_AGENTE
AND PRO.ID_UNIDAD_NEGOCIO=POL.ID_UNIDAD_NEGOCIO
AND PRO.ID_PRODUCTO=POL.ID_PRODUCTO
and pro.id_moneda = pol.id_moneda
AND POL.ID_FORMA_PAGO = PFP.ID_FORMA_PAGO
AND TRUNC(POL.FH_EMISION) BETWEEN to_date('01/01/2010') AND to_date('31/01/2010')
AND POL.CVE_TIPO_POLIZA = 'TP_PE'
)

--------------aca pongo mi plan de ejecucion.------------------------------------
Statement Id=12 Type=INSERT STATEMENT Cost=14174 TimeStamp=10-MAR-10::09:26:57
2.1 FILTER
3.1 NESTED LOOPS
4.2 TABLE ACCESS(BY INDEX ROWID) - EMI_INCISO
5.1 INDEX(UNIQUE SCAN) - PK_EMI_INCISO(UNIQUE)
4.1 NESTED LOOPS
5.2 TABLE ACCESS(BY INDEX ROWID) - CON_DET_CONCEPTO
6.1 INDEX(UNIQUE SCAN) - PK_CON_DET_CONCEPTO(UNIQUE)
5.1 NESTED LOOPS
6.2 TABLE ACCESS(BY INDEX ROWID) - EMI_RECIBO_DESGLOSADO
7.1 INDEX(RANGE SCAN) - IX03_REC_NUM_RECIBO(NON-UNIQUE)
6.1 NESTED LOOPS
7.2 TABLE ACCESS(BY INDEX ROWID) - EMI_RECIBO
8.1 INDEX(RANGE SCAN) - IX04_EMI_REC_SOL(NON-UNIQUE)
7.1 NESTED LOOPS
8.2 TABLE ACCESS(BY INDEX ROWID) - PRO_PRODUCTO
9.1 INDEX(UNIQUE SCAN) - PK_PRO_PRODUCTO(UNIQUE)
8.1 NESTED LOOPS
9.2 TABLE ACCESS(BY INDEX ROWID) - EMI_CONTRATANTE
10.1 INDEX(UNIQUE SCAN) - PK_EMI_CONTRATANTE(UNIQUE)
9.1 NESTED LOOPS(OUTER)
10.2 TABLE ACCESS(BY INDEX ROWID) - EMI_PERSONA
11.1 INDEX(RANGE SCAN) - PK_EMI_PERSONA(UNIQUE)
10.1 MERGE JOIN
11.2 SORT(JOIN)
12.1 TABLE ACCESS(BY INDEX ROWID) - AE_AGENTE
13.1 INDEX(FULL SCAN) - PK_AE_AGENTE(UNIQUE)
11.1 SORT(JOIN)
12.1 MERGE JOIN
13.2 SORT(JOIN)
14.1 TABLE ACCESS(BY INDEX ROWID) - EMI_POLIZA
15.1 INDEX(FULL SCAN) - PK_EMI_POLIZA(UNIQUE)
13.1 TABLE ACCESS(BY INDEX ROWID) - PRO_FORMA_PAGO
14.1 INDEX(FULL SCAN) - PK_PRO_FORMA_PAGO(UNIQUE)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:insert into select

Publicado por pedro (38 intervenciones) el 26/03/2010 13:29:33
ha simple vista te comento lo siguiente, sin conocer el volumen de datos por lo que puedo ver, INTUYO REPITO, INTUYO que:

Lo de los 11 segundos puede ser normal, si utilizas algun editor de código plsql como el TOAD, este te muestra los primero 500 registros que encuentra, no va a buscarlos todos, en cambio, si vas a insertar en una tabla temporal si va a buscarlos todos. Luego en cuanto a las tablas, no se el volumen de datos que tienen pero cuando son muy grandes y se utilizan filtros de busqueda, siempre es recomendable hacer filtros de busquedas solo sobre una de las tablas, al hacer distintas busquedas y sobre tantas tablas te recomiendo que evites los NESTED LOOPS, yo en estos casos lo que hago es lo siguiente, fuerzo para que los filtros de cada tabla entren exclusivamente por los indices de la misma, y luego fuerzo a que en vez de entrar por nested loops, realicen hash_join, a las tablas que no nececesites filtrar debes hacer FULL, siemprey cuando lo unas con hash_join, NUNCA con nested loops.

A parte utilizas fumciones, no se que hacen cada función.

Pero todo esto te lo comento intuyendo lo que estas haciendo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:insert into select

Publicado por Diego Cuastumal (1 intervención) el 04/03/2021 00:02:41
Este es un problema de índices en realidad . Por un lado el select puede que funciona bien porque tiene una clausula where y este puede ir por los índices. Pero la contención se realiza al momento de hacer el insert porque la tabla donde estas insertando debe tener indices. Es decir que al momento de insertar los datos en la tabla tiene primero que organizarlos según los índices de la misma . Aqui un articulo.

https://use-the-index-luke.com/es/sql/dml/insert
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar