Mejores prácticas para consultas sql

Solo disponible en BuenasTareas
  • Páginas : 5 (1077 palabras )
  • Descarga(s) : 0
  • Publicado : 20 de enero de 2012
Leer documento completo
Vista previa del texto
Mejores prácticas para consultas SQL

Devolver los datos que se necesitan
 Un aspecto que siempre se menciona en todos los libros de SQL es que debemos devolver nada más que los datos que se necesitan, y esto sobre todo referido a las columnas de datos. Debemos evitar el uso de SELECT * ya que esto además de devolver más datos de los que seguramente necesitemos, impide el uso de índices,añadiendo mayor degradación al rendimiento del sistema.

Uso de sintaxis UNION
Debemos tener en cuenta que por defecto un UNION equivale a realizar un SELECT DISTINCT sobre el resultado final de una query. En otras palabras, UNION toma los resultados de dos recordsets, los combina y realiza un SELECT DISTINCT de cara a eliminarlas filas duplicadas. Este proceso ocurre incluso si no hay registrosduplicados en el recordset final.

Forzado de INDICES
Es posible que podamos encontrarnos TABLE SCAN en las queries que lancemos, a pesar de existir INDICES que mejorarían el rendimiento. En estos casos la mejor opción para forzar el uso de un INDICE es realizar los siguiente, como muestra el ejemplo: 
SELECT * FROM tblTaskProcesses WHERE nextprocess=1 AND processid IN (8,32,45)
Esto tarda 3segundos y al siguiente QUERY tarda menos de un segundo:
 SELECT * FROM tblTaskProcesses (INDEX=IX_ProcessID) WHERE nextprocess=1 AND processid IN (8,32,45)
Cuando usar IN o BETWEEN
En el caso que nuestras QUERIES tenga que hacer uso de los comandos IN o BETWEEN haremos siempre uso de BETWEEN siempre que se pueda (existen casos que no es posible). Para entender porque veamos el siguiente ejemplo:SELECT customer_number, customer_name FROM customer WHERE customer_number in (1000, 1001, 1002, 1003, 1004)
Es menos eficiente que la siguiente QUERY: 
SELECT customer_number, customer_name FROM customer WHERE customer_number BETWEEN 1000 and 1004
Asumiendo que existe un INDICE en customer_number el QueryOptimizer de SQL Server puede localizar un rango de números más rápidamente mediante el usode BETWEEN que con el uso de IN.

Como mejorar el rendimiento de las QUERIES con operadores AND
 Si lo que queremos es mejorar el rendimiento de las QUERIES que contienen operadores AND en la cláusula WHERE debemos considerar lo siguiente:
* En las condiciones que se establezcan en la cláusula WHERE al menos una de ellas debería basarse en una columna lo más selectiva posible y que seaparte de un INDICE.
* Si al menos uno de los criterios de búsqueda en la cláusula WHERE no es altamente selectivo, consideraremos añadir INDICES para todas las columnas referenciadas en la cláusula WHERE.
 Si ninguna de las columnas en la cláusula WHERE son suficientemente selectivas para usar su propio INDICE, consideraremos crear un “CoveringIndex” para esta QUERY.

Uso de ORDER BY
UsaremosORDER BY en las QUERIES que lancemos sólo si es absolutamente indispensable, es decir, que si es posible realizar la ordenación en el lado del cliente siempre será mejor que realizarla desde el lado del servidor SQL Server.
En el caso que sea absolutamente necesario realizar la ordenación en el lado del servidor SQL Server, deberemos atender a las siguientes recomendaciones:
* Mantener elnúmero de filas a ordenar al mínimo, haciendo esto mediante la devolución de aquellas filas que son absolutamente necesarias.
* Mantener el número de columnas a ordenar al mínimo. En otras palabras, no ordenar columnas no requeridas.
* Mantener el ancho (tamaño físico) de las columnas a ordenar al mínimo
* Ordenar columnas con tipos de datos numéricos en lugar de tipos de datos carácterCuando usemos cualquier mecanismo de ordenación en Transact -SQL, debemos tener en mente todas estas recomendaciones para la mejora del rendimiento. 
Si se ha de ordenar por una columna a menudo, debemos considerar el realizar un”ClusteredIndex” sobre esa columna para la mejora del rendimiento.

Uso del operador IN en cláusulas WHERE
Es posible que nos podamos encontrar el operador IN en...
tracking img