He encontrado mucha información sobre qué STATISTICS
son: cómo se mantienen, cómo se pueden crear de forma manual o automática a partir de consultas o índices, y así sucesivamente. Pero no he podido encontrar ninguna orientación o información de "mejores prácticas" sobre cuándopara crearlos: qué situaciones se benefician más de un objeto ESTADÍSTICAS creado manualmente que de un índice. He visto estadísticas filtradas creadas manualmente que ayudan a las consultas en tablas particionadas (porque las estadísticas creadas para los índices cubren toda la tabla y no son por partición, ¡genial!), Pero seguramente debe haber otros escenarios que se beneficiarían de un objeto de estadísticas mientras no necesita el detalle de un índice, ni vale la pena el costo de mantener el índice o aumentar las posibilidades de bloqueo / bloqueo.
@JonathanFite, en un comentario, mencionó una distinción entre índices y estadísticas:
Los índices ayudarán a SQL a encontrar los datos más rápido al crear búsquedas que se ordenan de manera diferente a la tabla misma. Las estadísticas ayudan a SQL a determinar cuánta memoria / esfuerzo se necesitará para satisfacer la consulta.
Esa es una gran información, principalmente porque me ayuda a aclarar mi pregunta:
¿Cómo saber esto (o cualquier otra información técnica sobre la que S y cómo s relacionados con los comportamientos y naturaleza de STATISTICS
) ayudar a determinar cuándo elegir CREATE STATISTICS
más CREATE INDEX
, sobre todo cuando se crea un índice relacionado creará el STATISTICS
objeto? ¿Qué escenario sería mejor al tener solo la información ESTADÍSTICA y no tener el Índice?
Sería súper útil, si es posible, tener un ejemplo funcional de un escenario en el que el STATISTICS
objeto se ajuste mejor que un INDEX
.
Puesto que soy un aprendiz visual / pensador, pensé que podría ayudar a ver las diferencias entre STATISTICS
y INDEX
ES, de lado a lado, como un posible medio para ayudar a determinar cuándo STATISTICS
son la mejor opción.
Thingy PROs CONs
------- ---------- -------------------
INDEX * Can help sorts. * Takes up space.
* Contains data (can * Needs to be maintained (extra I/O).
"cover" a query). * More chances for blocking / dead-locks.
STATISTICS * Takes up very little space. * Cannot help sorts.
* Lighter maintenance / won't * Cannot "cover" queries.
slow down DML operations.
* Does not increase chances
of blocking / dead-locks.
Los siguientes son algunos recursos que encontré mientras buscaba esto, uno que incluso hace esta misma pregunta, pero no fue respondida:
Índice de SQL Server vs Estadística
Preguntas sobre estadísticas de SQL Server que fuimos demasiado tímidos para hacer
Estadística. ¿Son posibles los histogramas de varias columnas?
** Para ser claros, no tengo una respuesta para esto y en realidad estoy buscando recibir comentarios de algunas personas para proporcionar lo que parece ser una información extrañamente extraña aquí en las páginas web.
fuente
Respuestas:
Tu pregunta gira en torno a: ¿cuándo es bueno crear estadísticas versus crear índices (que crean estadísticas)?
De mis notas internas del servidor sql (clase SQLSkills- IE1 e IE2) y el libro interno de SQL Server , a continuación es mi comprensión limitada :
Las estadísticas de SQL Server no son más que objetos del sistema que contienen información vital sobre los valores de clave de índice y los valores de columna regulares.
SQL Server utiliza un modelo basado en costos para elegir un plan de ejecución "suficientemente bueno" lo más rápido posible. La estimación de la cardanilidad (estimación del número de filas que se procesarán en cada paso de la ejecución de la consulta) es el factor más importante en la optimización de la consulta, que afecta la estrategia de unión, el requisito de concesión de memoria, la selección de subprocesos de los trabajadores y la elección de índices al acceder a los datos .
SQL Server no usará índices no agrupados cuando estima que un gran no. Se requerirán operaciones de bucle KEY o RID, por lo que mantiene estadísticas sobre índices (y en columnas) que ayudarán en tales estimaciones.
Hay 2 cosas importantes sobre las estadísticas:
El histograma almacena información sobre la distribución de datos SOLAMENTE para la columna de estadísticas (índice) más a la izquierda. También almacena información sobre la densidad de columnas múltiples de los valores clave. En esencia, el histograma almacena la distribución de datos solo para la columna de estadísticas más a la izquierda.
SQL Server retendrá como máximo 200 pasos en el histograma, independientemente del tamaño de la tabla. Los intervalos cubiertos por cada paso del histograma aumentan a medida que crece la tabla, lo que conduce a estadísticas "menos precisas" para tablas grandes.
Recuerde que la selectividad del índice es una métrica que es inversamente proporcional a la densidad, es decir, cuantos más valores únicos tenga una columna, mayor será su selectividad.
Cuando las consultas particulares no se ejecutan con mucha frecuencia, puede seleccionar crear estadísticas a nivel de columna en lugar de un índice. Las estadísticas a nivel de columna ayudan a Query Optimizer a encontrar mejores planes de ejecución, a pesar de que esos planes de ejecución son subóptimos debido a los escaneos de índice involucrados. Al mismo tiempo, las estadísticas no agregan una sobrecarga durante las operaciones de modificación de datos y ayudan a evitar el mantenimiento del índice. Este enfoque solo funciona para consultas raramente ejecutadas.
Referir:
Nota: Alguien como Paul White o Aaron Bertrand puede intervenir para darle más color a su buena pregunta .
fuente
Diría que necesita un índice cuando necesita poder limitar la cantidad de datos / obtener los datos correctos rápidamente en función de los campos.
Necesita estadísticas cuando necesita que el optimizador comprenda la naturaleza de los datos para poder realizar las operaciones de la mejor manera posible.
Lo que he descubierto es que las estadísticas filtradas ayudan cuando hay sesgos en los datos que afectan en gran medida al plan, por ejemplo, en el desbordamiento de la pila, pocos usuarios tienen una gran cantidad de publicaciones, por lo que usar solo publicaciones promedio por usuario no es realmente la mejor estimación. Por lo tanto, puede crear estadísticas filtradas en userId en función del nombre de usuario y luego SQL Server debe saber que cuando este nombre de usuario está en la consulta, esta es la identificación de usuario que obtendrá, y debería ser capaz de descubrir que el El campo indexado en la tabla de publicaciones tendrá una gran cantidad de filas con esa identificación porque el histograma existe allí. Con promedios, no es posible hacer eso.
fuente
UserID
estaría en la condición de UNIRSE, incluso si no estuviera en elWHERE
? ¿Y eso no sería lo suficientemente bueno como para recoger un índice filtrado?WHERE BitColumn = 0
no se seleccionaría un índice filtrado para una consulta simpleWHERE BitColumn <> 1
. (Y para ser claros, la columna de bits no era anulable). Creo que hubo casos similares comoIntColumn > 10
no coincidirIntColumn >= 11
.70-461 Libro de entrenamiento de Itzik Ben-Gan
Solo hay algunas razones posibles para crear estadísticas manualmente. Un ejemplo es cuando un predicado de consulta contiene varias columnas que tienen relaciones entre columnas; Las estadísticas en las múltiples columnas pueden ayudar a mejorar el plan de consulta. Las estadísticas en varias columnas contienen densidades de columnas cruzadas que no están disponibles en las estadísticas de una sola columna. Sin embargo, si las columnas ya están en el mismo índice, el objeto de estadísticas de varias columnas ya existe, por lo que no debe crear uno adicional manualmente.
fuente