rapidas - ¿Cómo puedo optimizar esta consulta SQL(usando índices)?
plan de ejecución y optimización de consultas sql server 2008 r2 (1)
Introducción: hay mucho de lo que hablar aquí, y debido a la complejidad de SQL, será imposible que alguien pueda ayudar con su consulta por completo: importa cuál sea su consulta, cuán grandes sean las tablas y qué base de datos sistema que se utiliza es. Si no sabe qué son los índices, o cómo usarlos, consulte aquí: ¿Cómo funciona la indexación de bases de datos? .
Precaución: Nuevamente, si tiene un DBA para su sistema, consulte con ellos antes de indexar cualquier cosa, especialmente en un sistema en vivo. Incluso pueden ayudar, si eres amable con ellos. Si el sistema es utilizado por muchos otros, tenga cuidado antes de cambiar algo como índices. Si los datos se utilizan para múltiples tipos de consultas, asegúrese de no crear toneladas de índices que entren en conflicto o se superpongan.
Sintaxis. El estándar (SQL92) utiliza: CREATE INDEX [index name] ON [table name] ( [column name] )
. Esta sintaxis debería funcionar en casi cualquier sistema. Si solo necesita un índice en la tabla y aún no hay un índice agrupado, puede usar: CREATE [Unique] Clustered INDEX [index name] ON [table name] ( [column name] )
agrupado CREATE [Unique] Clustered INDEX [index name] ON [table name] ( [column name] )
- debe ser único si no puede haber múltiples elementos con los mismos valores. Si no puede hacer que esto funcione, consulte esta publicación para obtener más información: ¿Cómo indexo una columna de base de datos ?
¿Qué tablas deberían estar indexadas? Cualquier tabla que se use para consultas, especialmente si los datos son estáticos o solo obtiene nuevos valores, es un gran candidato. Si la tabla está en su consulta y tiene una instrucción de combinación, probablemente desee tener un índice en la (s) columna (s) a unir.
¿Qué columnas deberían indexarse? Hay libros completos escritos sobre cómo elegir los mejores índices y cómo indexar correctamente una base de datos. Una regla básica para indexar, si no desea profundizar en el problema, es: indexe lo siguiente, en este orden:
- Unir predicados (
on Table1.columnA=Table2.ColumnA and Table1.columnB=Table2.ColumnQ
) - Columnas filtradas (
where Table1.columnN=''Bob'' and Table1.columnS<20
) - Ordenar por / Agrupar por / etc. (cualquier columna que se use para la orden / agrupación debe estar en el índice, si es posible).
También:
- Utilice los tipos de datos que tengan sentido: no almacene nada como varchar si se trata de un entero o una fecha. (El ancho de la columna es importante. Use el tipo de datos más pequeño que pueda, si es posible).
- Asegúrese de que sus uniones sean del mismo tipo de datos: int a int, varchar a varchar, y así sucesivamente.
- Si es posible, use índices únicos, no nulos en cada predicado de unión en cada tabla.
Asegúrese de que las columnas posibles sean no nulas. (Si no pueden contener valores nulos, puede usar la siguiente sintaxis).
Alter table Table1 alter column columnN int not null
Haz todo esto y estarás en camino. Pero si necesita estas cosas regularmente, ¡aprenda! Compre un libro, lea en línea, encuentre la información. Hay mucha información por ahí, y es un tema profundo, pero puede hacer que las consultas MUCHO mejor si usted sabe lo que está haciendo.
Hay una consulta que se ejecuta más lentamente de lo que quisiera. La consulta ya es correcta y la he refabricado, pero no puedo ejecutarla lo suficientemente rápido. Los predicados ya son Sarg-able donde sea posible. Ya está utilizando correctamente las uniones, no requiere tablas adicionales, y no duplica las filas innecesariamente ni utiliza subconsultas anidadas de forma que la reduzcan.
No soy un administrador de bases de datos, y no sé cómo elegir un buen índice para agilizar mi consulta. Puedo alterar las estructuras de la mesa; no hay DBA a cargo de la base de datos, y tengo los permisos en el servidor de la base de datos para hacerlo.
¿Cómo optimizo mi consulta SQL?