Sie sind auf Seite 1von 8

Manual Buenas Prcticas Codificacin SQL Server

MANUAL DE REFERENCIA

v. 1.0

MANUAL BUENAS PRCTICAS CODIFICACIN REA: ARQUITECTURA DE SISTEMAS SQL Server


Misin : Facilitar a las reas de negocio de la compaa la mejora continua de sus procesos, a travs de soluciones tecnolgicas mediante un equipo de trabajo altamente calificado y comprometido con la organizacin

Historia de Revisin
Fecha Versin 1.0 06/11/2012 1.1 Descripcin Creacin del Manual Actualizacin Autor Ricardo Larriega Luis Marcilla Flix

Manual Buenas Prcticas SQL Server

Pgina 2 de 8

MANUAL BUENAS PRCTICAS CODIFICACIN REA: ARQUITECTURA DE SISTEMAS SQL Server


Misin : Facilitar a las reas de negocio de la compaa la mejora continua de sus procesos, a travs de soluciones tecnolgicas mediante un equipo de trabajo altamente calificado y comprometido con la organizacin

Contenido
Historia de Revisin ............................................................................................................................. 2 Objetivo ............................................................................................................................................... 4 Estndares de Nomenclatura .............................................................................................................. 4 Documentacin ................................................................................................................................... 4 Lectura................................................................................................................................................. 4 Escritura .............................................................................................................................................. 5 Joins ..................................................................................................................................................... 5 Where .................................................................................................................................................. 6 Generales ............................................................................................................................................ 7 Transaccionalidad................................................................................................................................ 8

Manual Buenas Prcticas SQL Server

Pgina 3 de 8

MANUAL BUENAS PRCTICAS CODIFICACIN REA: ARQUITECTURA DE SISTEMAS SQL Server


Misin : Facilitar a las reas de negocio de la compaa la mejora continua de sus procesos, a travs de soluciones tecnolgicas mediante un equipo de trabajo altamente calificado y comprometido con la organizacin

Objetivo
Revisar estrategias y lineamientos a seguir para lograr un mejor desarrollo de aplicaciones en plataforma SQL Server. Incentivar a analistas y desarrolladores aplicar un enfoque orientado a la optimizacin de los aplicativos de Interseguro a travs del uso de estndares y buenas prcticas

Estndares de Nomenclatura
1. Los nombres de las tablas deben estar en singular, no se debe utilizar espacios en blanco en el nombre y deben estar relacionados con la data que van a almacenar. 2. Los nombres de los triggers deben seguir el estndar ut_<nombre> 3. Los nombres de los vistas deben seguir el estndar vw_<nombre> 4. Los nombres de los procedimientos almacenados (stored procedures) deben seguir el estndar usp_<nombre>, no usar sp_ que es un error 5. Los ndices se nombran considerando la tabla a la que estn relacionados y el propsito del ndice. -Las claves primarias utilizan el texto PK como sufijo o prefijo, segn se considere conveniente -Las claves forneas utilizan el texto FK como sufijo o prefijo, segn se considere conveniente -Los ndices agrupados (clustered) utilizan el sufijo o prefijo IDX, segn se considere conveniente

Documentacin
1. Anexar comentarios al inicio de los stored procedures del fin del stored procedure /************************************************************** Objetivo: <Descripcin> Creado por: Fecha creacin: Modificado por: ltima modificacin: <Descripcin> Fecha modificacin: *************************************************************/

Lectura
1. Evita usar SELECT *. Siempre lee solo las columnas que necesitas. Con esto evitas llevar mucha data que no se necesita al cliente, entonces se descongestiona la red y el cliente siente que es ms rpido. 2. Para consultas de listas de registros, usa el operador TOP n. Con esto evitamos llevar muchos registros al cliente. Tambin se descongestiona la red y el cliente siente que es ms rpido. 3. En lugar de SET ROWCOUNT n, usa TOP n. 4. Si usas el operador UNION y ests seguro que ambos queries NO tienen registros duplicados, entonces mejor usa UNION ALL, para evitar que implcitamente se haga uso del operador DISTINCT
Manual Buenas Prcticas SQL Server
Pgina 4 de 8

MANUAL BUENAS PRCTICAS CODIFICACIN REA: ARQUITECTURA DE SISTEMAS SQL Server


Misin : Facilitar a las reas de negocio de la compaa la mejora continua de sus procesos, a travs de soluciones tecnolgicas mediante un equipo de trabajo altamente calificado y comprometido con la organizacin

5. Evita usar SELECT INTO table_name. Esto bloquer tablas del sistema. En lugar de esto, crea primero las tablas y luego re-escribe la sentencia como INSERT INTO table_name SELECT ... 6. Si vas a leer data de una sola tabla, evita hacerlo usando vistas que usan otras tablas 7. Evitar el uso de sentencias select con operaciones sobre los campos que va a obtener Ejemplo: Select convert(int(campo1)) + fn_funcion_propia(campo2, campo3) from 8. Al escribir un query usando una vista, evita leer una tabla referenciada en la vista
SELECT member_number, first_name, last_name, room_number FROM members, vi_members WHERE members.room_number = vi_members.room_number ( la vista es: SELECT member_number, first_name, last_name, room_number FROM members where state = A )

Escritura
1. No usar la forma select into tabla_nombre, se debe primero crear la tabla y luego ejecutar insert into tabla_nombre (campo1,campo2) select column3, column4 from t2 2. Especifique las columnas a insertar informacin Dice Insert into Tabla values () Debe decir Insert into Tabla (campo1, campo2, ) values ()

Joins
3. Escribe joins en formato ANSI (usa la clausula JOIN .. ON). Con esto te aseguras de escribir todas las restricciones sin posibilidad de olvidarte de alguna restriccin 4. Evita usar la misma tabla ms de una vez en un solo query. Para mejorar esto, usa tablas temporales 5. Prefiere usar un join en lugar de un sub-query Dice
SELECT member_number, first_name, last_name, room_number FROM members WHERE room_number IN (SELECT rooms.room_number FROM rooms)

Debe decir
SELECT member_number, first_name, last_name, room_number FROM members m INNER JOIN rooms r ON m.room_number = r.room_number

6. En el caso de que decidas usar queries anidados, siempre califica los campos del subquery con la tabla correspondiente

Manual Buenas Prcticas SQL Server

Pgina 5 de 8

MANUAL BUENAS PRCTICAS CODIFICACIN REA: ARQUITECTURA DE SISTEMAS SQL Server


Misin : Facilitar a las reas de negocio de la compaa la mejora continua de sus procesos, a travs de soluciones tecnolgicas mediante un equipo de trabajo altamente calificado y comprometido con la organizacin

SELECT member_number, first_name, last_name, room_number FROM members WHERE room_number IN (SELECT rooms.room_number FROM rooms)

7. En lugar de usar una sentencia con muchos joins donde las tablas involucradas son grandes, mejor crea una tabla temporal con los datos de la tabla principal (cdigos) y luego actualiza esta tabla haciendo joins con las tablas secundarias. 8. En lugar de usar la clusula IN conjuntamente con un sub-query, usa una sentencia JOIN Dice
SELECT pub_name FROM dbo.Publishers WHERE pub_id IN (SELECT Titles.pub_id FROM Titles)

Debe decir
SELECT pub_name FROM dbo.Publishers JOIN dbo.Titles ON Titles.pub_id = Publishers.pub_id

Where
1. Evita usar funciones sobre columnas en la clusula WHERE Por ejemplo en lugar de usar
SELECT member_number, first_name, last_name FROM members WHERE DATEDIFF(yy,datofbirth,GETDATE()) > 21

Usa
SELECT member_number, first_name, last_name FROM members WHERE dateofbirth < DATEADD(yy,-21,GETDATE())

2. Si usas LIKE en la clusula WHERE, trata de usar por lo menos 3 caracteres adelante como abc% 3. Si usas LIKE en la clusula WHERE, evita usar el operador % al principio: %abc 4. Donde sea posible usa la clusula BETWEEN en lugar de IN Por ejemplo en lugar de usar
SELECT customer_number, customer_name FROM customer WHERE customer_number in (1000, 1001, 1002, 1003, 1004)

Usa
SELECT customer_number, customer_name FROM customer WHERE customer_number BETWEEN 1000 and 1004 Manual Buenas Prcticas SQL Server
Pgina 6 de 8

MANUAL BUENAS PRCTICAS CODIFICACIN REA: ARQUITECTURA DE SISTEMAS SQL Server


Misin : Facilitar a las reas de negocio de la compaa la mejora continua de sus procesos, a travs de soluciones tecnolgicas mediante un equipo de trabajo altamente calificado y comprometido con la organizacin

5. Evita usar concatenaciones en las clusulas WHERE.

Generales
1. Evite el uso del hardcode 2. Evita usar cursores. En lugar usa tablas temporales con un campo entero identity(1,1) el cual podrs barrer en forma secuencial. No olvides indexar el campo identity. 3. Considera que las funciones MIN y MAX pueden usar ndices. Si es posible crea ndices sobre las columnas sobre las cuales se usan estas funciones 4. Cuando uses tablas temporales, considera crearles ndices para aumentar el desempeo de tus queries. 5. Revisa cada query de un stored procedure y asegurate que no haga table scan. Para estudiar esto activa la directiva Show Query Plan en el Query Analyzer 6. Trata de cada query haga uso de un ndice sobre una columna que tenga un alta dispersin. 7. Usa en lo posible tablas derivadas en lugar de tablas temporales. Esto es ms razonable si la informacin que almacenaras en la tabla temporal las vas a usar una vez. Pero si esta data, la piensas usar muchas veces dentro de un stored procedure, entonces es mejor una tabla temporal. Por ejemplo en lugar de usar
CREATE TABLE #Temp_Example ( [CategoryID] INT NOT NULL, [Category_Count] INT NOT NULL) INSERT INTO #Temp_Example (CategoryID, Category_Count) SELECT CategoryID, COUNT(*) AS Category_Count FROM Categories GROUP BY CategoryID SELECT C.CategoryID, C.CategoryName, P.ProductName, P.UnitPrice, #Temp_Example.Category_Count FROM Categories C INNER JOIN Products P ON C.CategoryID = P.CategoryID INNER JOIN #Temp_Example ON C.CategoryID = #Temp_Example.CategoryID ORDER BY C.CategoryName DROP TABLE #Temp_Example

Usa
SELECT C.CategoryID, C.CategoryName, P.ProductName, P.UnitPrice, C_Count.Category_Count FROM Categories C INNER JOIN Products P ON C.CategoryID = P.CategoryID INNER JOIN ( SELECT CategoryID, COUNT(*) AS Category_Count FROM Categories GROUP BY CategoryID )C_Count ON C.CategoryID = C_Count.CategoryID ORDER BY C.CategoryName

Manual Buenas Prcticas SQL Server

Pgina 7 de 8

MANUAL BUENAS PRCTICAS CODIFICACIN REA: ARQUITECTURA DE SISTEMAS SQL Server


Misin : Facilitar a las reas de negocio de la compaa la mejora continua de sus procesos, a travs de soluciones tecnolgicas mediante un equipo de trabajo altamente calificado y comprometido con la organizacin

8. Si vas a actualizar insertar o eliminar muchsimos registros en una sola sentencia, mejor hazlo en partes pequeas.

Transaccionalidad
1. Nunca rompas una transaccin en dos transacciones que sean invocadas consecutivamente desde el cliente. Esto hace que si falla segunda transaccin, la base de datos quede corrupta. 2. Procura que tus transacciones sean pequeas, es decir que accedan la menor cantidad de pginas de la base de datos 3. Evita declarar una sola gran transaccin para los procesos en lote. Mejor es tener varias transacciones pequeas y manejar reprocesos 4. Evita usar transacciones anidadas.

Manual Buenas Prcticas SQL Server

Pgina 8 de 8