Sei sulla pagina 1di 5

Tips buenas pra cticas SQL

OBJETIVO
Cada da se necesita procesar mayor cantidad de datos y obtener de manera ms rpida y
precisa la informacin. Muchos de los problemas de rendimiento se deben entre otras cosas al
hardware, al software, al motor de base de datos y por sobre todo al diseo, ndices y mala
formulacin de consultas SQL. En este documento nos centraremos en las normas de
programacin en donde siguiendo algunas recomendaciones veremos que se puede mejorar el
tiempo de respuesta de nuestro motor de BD significativamente.
NORMAS DE PROGRAMACION T-SQL
En la instruccin de SELECT debe solo recuperar lo necesario, nunca datos de ms. Por otro
lado nunca utilizar la sentencia SELECT *, porque el gestor lee primero la estructura antes de
ejecutar la sentencia.
Seleccionar solo aquellos campos que se necesiten, cada campo extra genera tiempo extra.
Escribir las consultas con estructura ANSI y NO con estructuras T-SQL
Ejemplo estructura ANSI
SELECT <Campo1>, <Campo2> FROM <Nombre Tabla1> INNER JOIN <Nombre Tabla2> ON
<PK_TBL1> = <FK_Tbl2>
WHERE <Condicin>

Ejemplo estructura T-SQL
SELECT <Campo1>, <Campo2> FROM <Nombre Tabla1>, <Nombre Tabla2> WHERE
<PK_Tbl1> = <FK_Tbl2> and <Condicin>
Dado lo anterior, para realizar las relaciones entre las tablas, se deben utilizar las
instrucciones:

INNER JOIN
LEFT JOIN
RIGHT JOIN
CROSS JOIN

Si se utiliza varias tablas en la consulta, hay que especificar siempre a que tabla pertenece cada
campo. Esto ahorra al gestor el tiempo de localizar a que tabla pertenece el campo.

Ejemplo
En lugar de:
SELECT Nombre, Factura
FROM Clientes inner join Facturacion on IdCliente =IdClienteFacturado
Usar:
SELECT Clientes.Nombre, Facturacion.Factura
FROM Clientes inner join Facturacion on Clientes.IdCliente =
Facturacion.IdClienteFacturado

No utilizar frecuentemente la clusula LIKE, en el caso de utilizarla es recomendable realizar
Like m% que %m, por ejemplo, ya que en el primer caso, el plan de ejecucin de SQL
determina y recorre el registro por el ndice que contiene la tabla, siempre y cuando el ndice
exista.
Utilizar en vez de la clusula IN la clusula BETWEEN, cuando sea posible en la instruccin
WHERE.
Utilizar lo menos posible las clusulas ANY, SOME, IN (SELECT), NOT, IS NULL, != , <>, !>, !<,
NOT EXISTS, NOT IN, NOT LIKE, LIKE %ab.
No utilizar tablas temporales pblicas. En el caso que se utilicen tablas temporales locales en
algn procedimiento, estas siempre se deben eliminar al terminar de utilizarse en el
procedimiento en cuestin, de igual modo antes de crear alguna tabla temporal local, siempre
se debe ver la opcin de utilizar variables tipo tabla como prioridad.
Utilizar la instruccin TOP si necesita una cantidad limitada de filas.
La instruccin TOP nos devuelve la cantidad de filas que nosotros le especifiquemos.
Ejemplo
Esto nos devolver las primeras 10 filas de la tabla <Nombre Tabla1>:
SELECT TOP 10 <Campo1> FROM <Nombre Tabla1>
Usar la clusula EXISTS en lugar de la clusula IN. La clusula EXISTS es ligeramente ms rpida.
Utilizar la clusula EXISTS en vez de la sentencia SELECT Count(*) FROM, esta prctica
generalmente se realiza con la instruccin IF.
En el caso de que se est utilizando la clusula EXIST de este modo:
SELECT <Campo1> FROM <Nombre Tabla1>
WHERE EXISTS (SELECT * FROM <Nombre Tabla2>)

Lo ptimo es hacer lo siguiente:
SELECT <Campo1> FROM <Nombre Tabla1>
WHERE EXISTS (SELECT TOP 1 <Campo1> FROM <Nombre Tabla2>)
La misin de la funcin EXIST en este caso es corroborar si existe o no X valor, por esta misma
razn lo optimo es hacerlo solo llamando un campo y haciendo un TOP 1 sobre la consulta
anidada ya que de esta manera no se pierde el sentido de la consulta porque el efecto ser el
mismo. De esta manera hacemos que la consulta sea mucho ms liviana.
Evitar usar la instruccin UNION, a menos que este eliminado filas duplicadas.
No utilizar la instruccin ROUND, LOWER, UPPER, SUBSTRING en el WHERE.
Reemplazar Count(*) por Count(1) o Count(<Nombre del campo>)
No Utilizar WITH NOLOCK o WITH ROWLOCK porque esta sentencia puede leer la tabla aun
cuando tenga transacciones pendientes (update, delete e insert), por ende podra mostrarse y
leerse informacin que puede no sea real.
Definir variables con el tipo de datos adecuados al dato a almacenar. Porque si no es as,
podra haber errores al almacenar algn dato, o al intentar hacer alguna operacin con el dato
en cuestin.
Se debe colocar el esquema correspondiente a la tabla que se defina.
Ejemplo
BASE.. TABLA
Reemplazar por
BASE.dbo.TABLA
Como buena prctica tambin se anima a incluir en el cdigo la instruccin SET NOCOUNT ON,
ya que esta instruccin evita que se devuelva el mensaje que muestra el recuento del nmero
de filas afectadas por una instruccin o un procedimiento almacenado como parte del
conjunto de resultados. Si se establece SET NOCOUNT en ON, no se devuelve el recuento.
Cuando SET NOCOUNT es OFF, s se devuelve ese nmero.
No utilizar ejecuciones de cdigo DINAMICO, ya que con esta forma no se sabe si la sintaxis es
correcta hasta cuando se ejecutan los procesos, El Servidor tiene que compilar y luego
ejecutar.
Utilizar CASE de tal modo de suplir la necesidad de usar cdigo dinmico. La sentencia CASE se
utiliza para brindar un tipo de lgica "si-entonces-otro" para SQL.

Indentar u ordenar el cdigo fuente del programa para mejorar la legibilidad por parte de los
programadores.


CURSORES

Evitar utilizar Cursores sin antes ver la posibilidad de que la misma operacin se realice por
medio de sentencia SQL.

Utilizar el tipo de datos Table en vez de cursores, pero solo cuando estas tengan pocos datos.

Ejemplo

Declare @VarTable TABLE (<Nombre Campo1> <Tipo de dato>, <Nombre Campon> <Tipo de
dato>)

Solo se aceptaran declaraciones cursores para aquellos que apunten a tablas temporales,
dentro de todo lo malo. Y adems que contengan la siguiente estructura.

Solo lectura (Read_Only)

Solo de una direccin de lectura. (Fast_Forward )


Ejemplo

DECLARE objects_cursor CURSOR LOCAL FAST_FORWARD READ_ONLY FOR

En el caso de que en un IF venga lo siguiente:

IF (SELECT COUNT (1) FROM <Nombre Tabla1>) > 0

Lo ptimo es hacer lo siguiente:

IF EXIST (SELECT <Campo1> FROM <Nombre Tabla1>)
Este mtodo es mucho ms rpido ya que el primero cuenta todas las filas para poder
traer un resultado, mientras que la segunda opcin busca de inmediato si existe o no
alguna fila para as seguir efectuando la consulta formulada.