Tcnicas de optimizacin de consultas Optimizacin READ SQL general para DB2 y Oracle Estas tcnicas se aplican tanto a DB2 como a Oracle; no obstante, las reglas parecen conseguir un mejor tiempo de respuesta en DB2. Optimizar consultas basadas en las directrices de optimizacin de la consulta 1. Indexe todos los predicados en clusulas JOIN, WHERE, ORDER BY y GROUP BY. Por lo general, WebSphere Commerce depende en gran medida de los ndices para mejorar el rendimiento y la escalabilidad de SQL. Sin los ndices adecuados, las consultas SQL pueden causar exploraciones de tabla, lo que provoca problemas de rendimiento o de bloqueo. Se recomienda indexar todas las columnas de predicados. La excepcin es cuando los datos de columna tienen una cardinalidad muy baja. 2. Evite el uso de funciones en los predicados. La base de datos no utiliza el ndice si hay una funcin en la columna. Por ejemplo: SELECT * FROM TABLE1 WHERE UPPER(COL1)='ABC' Como resultado de la funcin UPPER(), los optimizadores de base de datos no utilizan el ndice en COL1. Si la funcin se puede evitar en el SQL, es necesario crear un ndice basado en funcin en Oracle o columnas generadas en DB2 para mejorar el rendimiento. 3. Evite el uso del carcter comodn (%) al principio de un predicado. El predicado LIKE '%abc' produce una exploracin de tabla completa. Por ejemplo: SELECT * FROM TABLE1 WHERE COL1 LIKE '%ABC' Esta es una limitacin de rendimiento conocida en todas las bases de datos. 4. Evite columnas innecesarias en la clusula SELECT. Especifique las columnas en la clusula SELECT en lugar de utilizar SELECT *. Las columnas innecesarias imponen cargas adicionales en la base de datos, lo que ralentiza no slo el SQL especfico, sino todo el sistema. 5. Utilice la unin interna en lugar de la unin externa, si es posible. La unin externa slo debe utilizarse si es necesario. La utilizacin de la unin externa limita las opciones de optimizacin de la base de datos, lo que suele dar como resultado una ejecucin ms lenta del SQL. 6. DISTINCT y UNION slo deben utilizarse si es necesario. Los operadores DISTINCT y UNION causan la operacin de clasificacin, lo que ralentiza la ejecucin de SQL. Utilice UNION ALL en lugar de UNION, si es posible, ya que es mucho ms eficaz. 7. Oracle 10g y 11g requiere que las columnas CLOB/BLOB se coloquen al final de las sentencias. De lo contrario, se produce un error cuando el tamao del valor de entrada tiene ms de 1000 caracteres. 8. La clusula ORDER BY es obligatoria en SQL si el conjunto de resultados clasificados es el previsto. La palabra clave ORDER BY se utiliza para clasificar el conjunto de resultados por las columnas especificadas. Sin la clusula ORDER BY, el conjunto de resultados se devuelve directamente sin ninguna clasificacin. El orden no queda garantizado. Tenga en cuenta el impacto del rendimiento que supone aadir la clusula ORDER BY, ya que la base de datos necesita clasificar el conjunto de resultados, lo que se convierte en una de las operaciones ms costosas de la ejecucin de SQL. Insertar predicados en la clusula OUTER JOIN siempre que sea posible Para consultas SQL con el operador LEFT OUTER JOIN, trasladar predicados de la tabla derecha de la clusula WHERE a la condicin ON ayuda al optimizador de base de datos a generar una consulta ms eficaz. Los predicados de la tabla izquierda pueden permanecer en la clusula WHERE. Del mismo modo, para las consultas SQL con el operador RIGHT OUTER JOIN, los predicados de la tabla derecha deberan trasladarse de la clusula WHERE a la condicin ON. Por ejemplo, la consulta subptima se reescribe insertando los predicados aplicables a la tabla TAB_B en la clusula ON. Los predicados especficos de TAB_A en la clusula WHERE pueden o bien permanecer o bien insertarse en la clusula ON: Sentencia SQL subptima: SELECT TAB_A.COL1, TAB_B.COL1 FROM TAB_A LEFT OUTER JOIN TAB_B ON TAB_A.COL3 = TAB_B.COL3 WHERE TAB_A.COL1=123 AND TAB_B.COL2=456; Sentencia SQL optimizada: SELECT TAB_A.COL1, TAB_B.COL1 FROM TAB_A LEFT OUTER JOIN TAB_B ON TAB_A.COL3 = TAB_B.COL3 AND TAB_B.COL2=456 WHERE TAB_A.COL1=123; Los predicados de las uniones INNER pueden permanecer en la clusula WHERE. Si las tablas TAB_A y TAB_B se definen como vistas, el optimizador puede insertar estos predicados en las vistas. Duplicar la condicin de constante para diferentes tablas siempre que sea posible Cuando dos tablas, A y B, se unen y hay un predicado constante en una de las columnas unidas, por ejemplo, A.id=B.id y A.id in (10, 12), el predicado constante debera duplicarse para la columna unida de la segunda tabla. Es decir, A.id=B.id y A.id en (10, 12) y B.id en (10, 12). Por ejemplo, TAB_A tiene una relacin LEFT OUTER JOIN con TAB_B. Si hay una condicin especfica de TAB_A y una condicin de tabla cruzada con TAB_B, cree una condicin especfica de TAB_B adicional basada en el requisito de TAB_A y mantenga las condiciones de tabla cruzada en la clusula ON: Sentencia SQL subptima: SELECT TAB_A.COL1, TAB_B.COL1 FROM TAB_A LEFT OUTER JOIN TAB_B ON TAB_A.COL3 = TAB_B.COL3 WHERE TAB_A.COL1 IN (123, 456) AND TAB_B.COL2=TAB_A.COL1; Sentencia SQL optimizada: SELECT TAB_A.COL1, TAB_B.COL1 FROM TAB_A LEFT OUTER JOIN TAB_B ON TAB_A.COL3 = TAB_B.COL3 AND TAB_B.COL2 IN (123, 456) AND TAB_B.COL2=TAB_A.COL1 WHERE TAB_A.COL1 IN (123, 456); En especial, si el predicado constante slo tiene el valor 1 (es decir, COL1=123), el segundo predicado tambin debe convertirse a un predicado constante. Por ejemplo: Sentencia SQL subptima: SELECT TAB_A.COL1, TAB_B.COL1 FROM TAB_A LEFT OUTER JOIN TAB_B ON TAB_A.COL3 = TAB_B.COL3 WHERE TAB_A.COL1=123 AND TAB_B.COL2=TAB_A.COL1; Sentencia SQL optimizada: SELECT TAB_A.COL1, TAB_B.COL1 FROM TAB_A LEFT OUTER JOIN TAB_B ON TAB_A.COL3 = TAB_B.COL3 AND TAB_B.COL2=123 WHERE TAB_A.COL1=123;