Aunque esta no es una lista exhaustiva de las mejores prácticas, estas sugerencias pueden mejorar el rendimiento del procedimiento.
Utilice la sentencia SET NOCOUNT ON como primera sentencia en el cuerpo del procedimiento. Es decir, colóquelo justo después de la palabra clave AS. Esto desactiva los mensajes que SQL Server devuelve al cliente después de que se ejecutan las instrucciones SELECT, INSERT, UPDATE, MERGE y DELETE. Esto mantiene la salida generada al mínimo para mayor claridad. Sin embargo, no hay un beneficio de rendimiento medible en el hardware actual. Para obtener más información, consulte SET NOCOUNT (Transact-SQL) .
Utilice nombres de esquema al crear o hacer referencia a objetos de base de datos en el procedimiento. El Motor de base de datos tarda menos tiempo de procesamiento en resolver nombres de objetos si no tiene que buscar varios esquemas. También evita los problemas de permisos y acceso causados por la asignación del esquema predeterminado de un usuario cuando se crean objetos sin especificar el esquema.
Evite envolver funciones alrededor de columnas especificadas en las cláusulas WHERE y JOIN. Si lo hace, las columnas no serán deterministas y evitará que el procesador de consultas utilice índices.
Evite usar funciones escalares en declaraciones SELECT que devuelvan muchas filas de datos. Debido a que la función escalar se debe aplicar a cada fila, el comportamiento resultante es como el procesamiento basado en filas y degrada el rendimiento.
Evite el uso de SELECT *. En su lugar, especifique los nombres de columna requeridos. Esto puede evitar algunos errores del Motor de base de datos que detienen la ejecución del procedimiento. Por ejemplo, una SELECT *declaración que devuelve datos de una tabla de 12 columnas y luego inserta esos datos en una tabla temporal de 12 columnas tiene éxito hasta que se cambia el número o el orden de las columnas en cualquiera de las tablas.
Evite procesar o devolver demasiados datos. Limite los resultados lo antes posible en el código del procedimiento para que cualquier operación posterior realizada por el procedimiento se realice utilizando el conjunto de datos más pequeño posible. Envíe solo los datos esenciales a la aplicación cliente. Es más eficiente que enviar datos adicionales a través de la red y obligar a la aplicación cliente a trabajar con conjuntos de resultados innecesariamente grandes.
Utilice transacciones explícitas utilizando BEGIN/COMMIT TRANSACTION y mantenga las transacciones lo más cortas posible. Las transacciones más largas significan un bloqueo de registros más prolongado y un mayor potencial de estancamiento.
Utilice la función TRY...CATCH de Transact-SQL para el manejo de errores dentro de un procedimiento. TRY...CATCH puede encapsular un bloque completo de instrucciones Transact-SQL. Esto no solo genera menos gastos generales de rendimiento, sino que también hace que los informes de errores sean más precisos con una programación significativamente menor.
Utilice la palabra clave DEFAULT en todas las columnas de la tabla a las que hacen referencia las instrucciones CREATE TABLE o ALTER TABLE Transact-SQL en el cuerpo del procedimiento. Esto evita pasar NULL a columnas que no permiten valores nulos.
Utilice NULL o NOT NULL para cada columna de una tabla temporal. Las opciones ANSI_DFLT_ON y ANSI_DFLT_OFF controlan la forma en que Motor de base de datos asigna los atributos NULL o NOT NULL a las columnas cuando estos atributos no se especifican en una instrucción CREATE TABLE o ALTER TABLE. Si una conexión ejecuta un procedimiento con una configuración diferente para estas opciones que la conexión que creó el procedimiento, las columnas de la tabla creada para la segunda conexión pueden tener una nulabilidad diferente y exhibir un comportamiento diferente. Si NULL o NOT NULL se establece explícitamente para cada columna, las tablas temporales se crean utilizando la misma capacidad de nulos para todas las conexiones que ejecutan el procedimiento.
Utilice declaraciones de modificación que conviertan valores nulos e incluyan lógica que elimine filas con valores nulos de las consultas. Tenga en cuenta que en Transact-SQL, NULL no es un valor vacío o "nada". Es un marcador de posición para un valor desconocido y puede provocar un comportamiento inesperado, especialmente cuando se consultan conjuntos de resultados o se utilizan funciones AGREGAR.
Utilice el operador UNION ALL en lugar de los operadores UNION u OR, a menos que haya una necesidad específica de valores distintos. El operador UNION ALL requiere menos sobrecarga de procesamiento porque los duplicados no se filtran del conjunto de resultados.