best practices construcciones de querys

9
INFORME DE BEST PRACTICES EN LA CONSTRUCCIONES DE SQLs PARA OPTIMIZADOR POR COSTO Mayo 2009 Copyright SONDA Este documento es propiedad de SONDA Cualquier copia u otro uso debe ser autorizado expresamente por SONDA Administración de Sistemas Gerencia de Servicios de Datacenter SONDA S.A. Best Practices en la Construcción de SQLs para Optimizador por Costo Realizado por : Gerardo Leyton. Revisado por : Juan Puga Fecha : Abril 2009

Upload: francisco-marcelo-cruz

Post on 14-Feb-2015

45 views

Category:

Documents


5 download

TRANSCRIPT

Page 1: Best Practices Construcciones de Querys

INFORME DE BEST PRACTICES EN LA CONSTRUCCIONES DE SQLs PARA OPTIMIZADOR

POR COSTO

Mayo 2009

Copyright SONDA

Este documento es propiedad de SONDA Cualquier copia u otro uso debe ser autorizado expresamente por SONDA

Administración de Sistemas Gerencia de Servicios de Datacenter

SONDA S.A.

Best Practices en la Construcción de SQLs para Optimizador por Costo

Realizado por : Gerardo Leyton. Revisado por : Juan Puga Fecha : Abril 2009

Page 2: Best Practices Construcciones de Querys

INFORME DE BEST PRACTICES EN LA CONSTRUCCIONES DE SQLs PARA OPTIMIZADOR

POR COSTO

Mayo 2009

Copyright SONDA

Este documento es propiedad de SONDA Cualquier copia u otro uso debe ser autorizado expresamente por SONDA

INDICE

11.. CCoonnssttrruucccciióónn ddee QQuueerryyss ppaarraa OOppttiimmiizzaaddoorr ppoorr CCoossttoo

22.. CCoommeennttaarriiooss FFiinnaalleess

33.. RReeffeerreenncciiaass MMeettaalliinnkk

Page 3: Best Practices Construcciones de Querys

INFORME DE BEST PRACTICES EN LA CONSTRUCCIONES DE SQLs PARA OPTIMIZADOR

POR COSTO

Mayo 2009

Copyright SONDA

Este documento es propiedad de SONDA Cualquier copia u otro uso debe ser autorizado expresamente por SONDA

1 CONSTRUCCION DE QUERYS PARA OPTIMIZADOR POR COSTO

1.1 Joins de Tablas

SSee rreeccoommiieennddaa hhaacceerr llooss jjooiinnss eenn nnoo mmááss ddee 55 ttaabbllaass.. EEssttoo eessttáá ddaaddoo ppoorr llaa ssoobbrreeccaarrggaa ddee ddaattaa eenn llaa SSGGAA yy qquuee rreeppeerrccuuttee eenn llooss ttiieemmppooss ddee rreeppuueessttaa ddee llaa qquueerryy..

1.2 Utilizar Variables Bind en las Cláusula WHERE

RReeccoommeennddaammooss uuttiilliizzaarr vvaarriiaabblleess BBiinndd ppaarraa ddiissmmiinnuuiirr eell hhaarrdd ppaarrssiinngg ddee llaass qquueerryyss yy ddiissmmiinnuuiirr eell ccoonnssuummoo ddee CCPPUU.. RReeffeerreenncciiaa ddee aappooyyoo:: hhttttpp::////ddoowwnnllooaadd..oorraaccllee..ccoomm//ddooccss//ccdd//BB1199330066__0011//aappppddeevv..110022//bb1144225511//aaddffnnss__ddyynnaammiicc__ssqqll..hhttmm##sstthhrreeff11113355 hhttttpp::////ddoowwnnllooaadd..oorraaccllee..ccoomm//ddooccss//ccdd//BB1199330066__0011//aappppddeevv..110022//bb1144225511//aaddffnnss__ddyynnaammiicc__ssqqll..hhttmm##BBJJEEFFAACCFFII hhttttpp::////llhhoorriikkiiaann..bbllooggssppoott..ccoomm//22000088//0099//eexxppllaaiinn--ppllaann--vvss--bbiinndd--vvaarriiaabblleess__2299..hhttmmll hhttttpp::////hhuuggoorraaccllee..bbllooggssppoott..ccoomm//22000088//0066//bbiinndd--vvaarriiaabblleess..hhttmmll hhttttpp::////wwwwww..llaaccoorroonnaa..ccoomm..mmxx//ffoorrttiizz//aaddooddbb//ttiippss__ppoorrttaabbllee__ssqqll--eess..hhttmm

Page 4: Best Practices Construcciones de Querys

INFORME DE BEST PRACTICES EN LA CONSTRUCCIONES DE SQLs PARA OPTIMIZADOR

POR COSTO

Mayo 2009

Copyright SONDA

Este documento es propiedad de SONDA Cualquier copia u otro uso debe ser autorizado expresamente por SONDA

1.3 Crear Índices en lo Posible con Cláusula UNIQUE

EEssttee ttiippoo ddee íínnddiiccee ttiieennee mmeejjoorr rreennddiimmiieennttoo eenn llaass qquueerryyss..

1.4 Índices con Mayor Número de Columnas

LLooss íínnddiicceess ccrreeaaddooss ddeebbeenn tteenneerr eell mmaayyoorr nnúúmmeerroo ddee ccoolluummnnaass bbiinndd oo vvaalloorreess ffiijjooss,, eenn llaa ccllaauussuullaa WWHHEERREE.. EEjj:: sseelleecctt ssuumm((vvaall)) FFrroomm aaccccoouunntt WWhheerree aaccccoouunntt__iidd==11000000110011 AAnndd ffiinn__yyrr ==’’22000099’’;; EEll íínnddiiccee ddeebbee sseerr ppoorr ((aaccccoouunntt__iidd,,ffiinn__yyrr)) yy nnoo uunn íínnddiiccee ppoorr ccaaddaa ccaammppoo ddeell WWHHEERREE

11..55 Índices Sobre Columnas del Join

EEjj:: ffrroomm AACCCCTT aa ,, TTRRAANNSS tt WWhheerree aa..ssuurrnnaammee == ‘‘GGUURRRRYY’’ aanndd aa..aacccctt__nnoo == tt..aacccctt__nnoo aanndd tt..ttrraann__ddaattee >> ’’0011--jjaann--22000099’’ aanndd tt..ttrraann__ttyyppee == ‘‘SSAALLAARRYY’’;; CCrreeaarr íínnddiiccee ppoorr AACCCCTT ((ssuurrnnaammee)) CCrreeaarr íínnddiiccee ppoorr TTRRAANNSS ((aacccctt__nnoo,,ttrraann__ddaattee,,ttrraann__ttyyppee))

1.6 Índices sobre Tablas con Bajo Número de Registros

SSee rreeccoommiieennddaa iinnddeexxaarr eessttaass ttaabbllaass ppoorr 22 rraazzoonneess:: eell uussaarr PPKK oo uunniiqquuee iinnddeexx mmeejjoorraa llaa ppeerrffoorrmmaannccee,, yy sseegguunnddoo qquuee eell ooppttiimmiizzaaddoorr ttrraabbaajjaarraa ccoonn uunn ppllaann ddee eejjeeccuucciióónn óóppttiimmoo..

Page 5: Best Practices Construcciones de Querys

INFORME DE BEST PRACTICES EN LA CONSTRUCCIONES DE SQLs PARA OPTIMIZADOR

POR COSTO

Mayo 2009

Copyright SONDA

Este documento es propiedad de SONDA Cualquier copia u otro uso debe ser autorizado expresamente por SONDA

1.7 Plan de Ejecución

EEnn eell eexxppllaaiinn ddee OOrraaccllee ssee eennccuueennttrraann 33 mmééttooddooss ddee JJooiinn:: NNLL ((nneesstteedd llooooppss)) HHAASSHH yy MMEERRGGEE,, ssee rreeccoommiieennddaa uuttiilliizzaarr oo ffoorrzzaarr ppaarraa llooss ssiigguuiieenntteess ccaassooss:: NNLL:: ppaarraa ttrraannssaacccciioonneess SSii llaa qquueerryy rreettoorrnnaa mmeennooss ddeell 2200%% ddee rreeggiissttrrooss ddee llaa ttaabbllaa HHAASSHH:: rreeppoorrtteess yy//oo pprroocceessooss BBAATTCCHH SSii eexxiissttee SSGGAA ssuuffiicciieennttee ppaarraa mmaanntteenneerr llaass ttaabbllaass eenn bbuuffffeerr PPaarraa JJooiinnss bbaassaaddooss eenn iigguuaallddaadd ((==)) Si la query retorna más del 20% de registros de la tabla MERGE: rreeppoorrtteess yy//oo pprroocceessooss BBAATTCCHH Para Joins basados en rangos (> >= < <=) Todas las columnas contenidas en la clausula WHERE esta indexada

Referencia de apoyo: http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/optimops.htm#i51523

1.8 Subquerys

TTrraattaarr eenn lloo ppoossiibbllee EEVVIITTAARR llooss ssuubbqquueerryyss..

1.9 Clausula IN/EXISTS

EEnn eell ccaassoo ddee eexxiissttiirr ssuubbqquueerryyss eelleeggiirr EEXXIISSTTSS ssii llaass ttaabbllaass ddeell ssuubbqquueerryy ttiieenneenn ppooccooss rreeggiissttrrooss eenn ccaassoo ccoonnttrraarriioo eelleeggiirr IINN..

1.10 Clausula OR/UNION

SSee rreeccoommiieennddaa uuttiilliizzaarr UUNNIIOONN eenn vveezz ddee OORR ssoobbrree ssuubbqquueerryyss,, yyaa qquuee eell ooppttiimmiizzaarr mmeejjoorraa llaa ppeerrffoorrmmaannccee eenn uuttiilliizzaarr 22 qquueerryyss mmaass ssiimmpplleess..

Page 6: Best Practices Construcciones de Querys

INFORME DE BEST PRACTICES EN LA CONSTRUCCIONES DE SQLs PARA OPTIMIZADOR

POR COSTO

Mayo 2009

Copyright SONDA

Este documento es propiedad de SONDA Cualquier copia u otro uso debe ser autorizado expresamente por SONDA

1.11 Clausula NOT IN/NOT EXISTS

SSee rreeccoommiieennddaa uussaarr OOUUTTEERR JJOOIINN eenn vveezz ddee ccllaauussuullaass NNOOTT IINN oo NNOOTT EEXXIISSTTSS EEjj:: select book_key from book where book_key NOT IN (select book_key from sales);

mmeejjoorraa ccoonn eessttaa ccoonnssuullttaa:: select b.book_key from book b, sales s where b.book_key = s.book_key(+) and s.book_key IS NULL;

1.12 Disminuir los SORT Innecesarios

SSee ddeebbee ttrraattaarr ddee ddiissmmiinnuuiirr llooss ssoorrtt iinnnneecceessaarriiooss yyaa qquuee aauummeennttaann eell ccoonnssuummoo ddee rreeccuurrssooss yy ppuueeddeenn ggeenneerraarr ccoonntteenncciióónn eenn llaa bbaassee.. LLooss ccoommaannddooss qquuee eejjeeccuuttaann ssoorrtt eenn llaass qquueerryyss ssoonn:: DDiissttiinncctt GGrroouupp bbyy OOrrddeerr bbyy IInntteerrsseecctt MMiinnuuss UUnniioonnss JJooiinnss ssoobbrree ttaabbllaass nnoo iinnddeexxaaddaass

1.13 Número máximo de Índices sobre Tablas

RReeccoommeennddaammooss uunn mmááxxiimmoo cceerrccaannoo aa llooss 1100 íínnddiicceess ppaarraa ttaabbllaass ttrraannssaacccciioonnaalleess yy mmááss ppaarraa ttaabbllaass BBaattcchh ssii ssoonn rreeqquueerriiddooss..

1.14 Vistas/Vistas Materializadas

RReeccoommeennddaammooss uuttiilliizzaarr MMVV ((vviissttaass mmaatteerriiaalliizzaaddaass)) ssoobbrree VViieewwss ((vviissttaass)) yyaa qquuee mmeejjoorraann llaa ppeerrffoorrmmaannccee ddee llaass ccoonnssuullttaass..

Page 7: Best Practices Construcciones de Querys

INFORME DE BEST PRACTICES EN LA CONSTRUCCIONES DE SQLs PARA OPTIMIZADOR

POR COSTO

Mayo 2009

Copyright SONDA

Este documento es propiedad de SONDA Cualquier copia u otro uso debe ser autorizado expresamente por SONDA

1.15 Comandos de Conversión

NNoo uuttiilliizzaarr ccoommaannddooss ddee ccoonnvveerrssiióónn ssoobbrree ccoolluummnnaass iinnddeexxaass yyaa qquuee eell ooppttiimmiizzaarr ddeessccaarrttaarráá llaa uuttiilliizzaacciióónn ddeell íínnddiiccee.. TTaammbbiiéénn uuttiilliizzaarr ccaammppooss ddeell mmiissmmoo ttiippoo eenn llaa ccoommppaarraacciióónn EEjj:: WWhheerree ttoo__cchhaarr((ccoodd__iidd))==’’11223344’’ EEnn eell ccaassoo qquuee ssee rreeqquuiieerraa ffoorrzzaaddaammeennttee eell uussoo ddee ccoommaannddooss ddee ccoonnvveerrssiióónn uuttiilliizzaarr ÍÍnnddiicceess bbaassaaddoo eenn ffuunncciioonneess:: EEjj:: WHERE trunc(ship_date) > trunc(sysdate-7);

CCrreeaarr íínnddiiccee ddee eessttaa ffoorrmmaa:: Create index trunc_ship_date on product(trunc(ship_date));

1.16 Tipos de Datos Distintos

NNuunnccaa ccoommppaarree ttiippooss ddee ddaattooss ddiissttiinnttooss,, yyaa qquuee eell ooppttiimmiizzaaddoorr eevviittaarráá uussaarr eell íínnddiiccee.. WWhheerree ccoodd__iidd ==’’11223344’’ AAuunnqquuee nnoo eexxiissttiirráá pprroobblleemmaass eenn llaa ccoonnssuullttaa ((ccoodd__iidd eess nnuumméérriiccoo)),, ssee ddeebbee tteenneerr eenn ccuueennttaa qquuee eell ooppttiimmiizzaaddoorr ccaammbbiiaarráá eell ppllaann ddee eejjeeccuucciióónn..

1.17 Fragmentación de Índices/Tablas

SSee ddeebbee iiddeennttiiffiiccaarr aaqquueellllaass ttaabbllaass yy//oo íínnddiicceess ccoonn mmaayyoorr ffrraaggmmeennttaacciióónn ((ddeelleettee,,iinnsseerrtt)),, yyaa qquuee ddeebbeerrííaa ggeenneerraarr uunn pprroocceeddiimmiieennttoo mmeennssuuaall//ttrriimmeessttrraall//sseemmeessttrraall ppaarraa ddeessffrraaggmmeennttaarr eessttooss oobbjjeettooss..

1.18 Particionamiento

TTaabbllaass ccaannddiiddaattaass aa sseerr ppaarrttiicciioonnaaddaass ssoonn llaass qquuee ccuummpplleenn llooss ssiigguuiieenntteess rreeqquuiissiittooss:: -- TTaabbllaass ccoonn mmááss ddee 22 GGbb ddee ttaammaaññoo -- CCoonnttiieennee ddaattaa hhiissttóórriiccaa mmaass ddaattaa aaccttuuaalliizzaaddaa.. -- LLiimmiittaacciióónn ddee eessppaacciioo eenn ddiissccoo

Page 8: Best Practices Construcciones de Querys

INFORME DE BEST PRACTICES EN LA CONSTRUCCIONES DE SQLs PARA OPTIMIZADOR

POR COSTO

Mayo 2009

Copyright SONDA

Este documento es propiedad de SONDA Cualquier copia u otro uso debe ser autorizado expresamente por SONDA

1.19 Indexación de Columnas en NULL

TTrraattaarr ddee iinnddeexxaarr aaqquueellllaass ccoolluummnnaass eenn eell WWHHEERREE ccoonn vvaalloorr NNUULLLL EEjj:: CCoolluummnnaa eennaammee ccoonn ttiippoo cchhaarr:: create index emp_null_ename_idx on emp (nvl(ename,'null')); CCoolluummnnaa vvaalloorr eess nnuummeerriicc:: create index emp_null_emp_nbr_idx on emp (nvl(valor,o));

1.20 Hint

EEll uussoo ddee hhiinntt ssoonn SSOOLLOO eexxcceeppcciioonneess eenn llaass qquueerryyss yy eenn ccaassoo ddee mmeejjoorraarr eell ppllaann ddee eejjeeccuucciióónn,, EEVVIITTAARR ddee uussaarrllooss..

1.21 Tabla DUAL

NNoo uussaarr llaa ttaabbllaa DDUUAALL ppaarraa hhaacceerr aassiiggnnaacciioonneess ssiinnoo qquuee aassiiggnnaarr ddiirreeccttaammeennttee.. EEssttoo pprroovvooccaa ccoonntteenncciióónn eenn llaa BBaassee ddee DDaattooss ppoorr eevveennttoo ‘‘bbuuffffeerr bbuussyy wwaaiittss’’ EEjj:: sseelleecctt ttoo__cchhaarr((ssyyssddaattee,,''dddd//mmmm//yyyyyyyy HHHH2244::MMII::SSSS'')) iinnttoo vvaarr__ffeecchhaa ffrroomm dduuaall;;

AAssiiggnnaarr ddiirreeccttaammeennttee..

Var_fecha:= ttoo__cchhaarr((ssyyssddaattee,,''dddd//mmmm//yyyyyyyy HHHH2244::MMII::SSSS''))

Page 9: Best Practices Construcciones de Querys

INFORME DE BEST PRACTICES EN LA CONSTRUCCIONES DE SQLs PARA OPTIMIZADOR

POR COSTO

Mayo 2009

Copyright SONDA

Este documento es propiedad de SONDA Cualquier copia u otro uso debe ser autorizado expresamente por SONDA

2 Comentarios Finales

1. Se recomienda hacer el explain de todas las querys y ver los costos asociados a las consultas, si esta resulta muy alta, se deberá cambiar el plan de ejecución.

2. Tener actualizadas las estadísticas de toda la Base de Datos

3. En caso de tablas transaccionales con muchos índices aplicar comando de MONITORING si es posible eliminar índices no utilizados.

3 Referencias Metalink

Doc ID : 199083.1 Doc ID: 33089.1