sql >> Base de Datos >  >> RDS >> Oracle

¿Por qué Oracle usa DBMS_STATS.GATHER_TABLE_STATS?

La mayoría de las bases de datos empresariales, incluida Oracle, utilizan un optimizador basado en costos para determinar el plan de consulta adecuado para una instrucción SQL determinada. Esto significa que el optimizador utiliza información sobre los datos para determinar cómo ejecutar una consulta en lugar de basarse en reglas (esto es lo que hacía el antiguo optimizador basado en reglas).

Por ejemplo, imagine una tabla para una aplicación simple de seguimiento de errores

CREATE TABLE issues (
  issue_id number primary key,
  issue_text clob,
  issue_status varchar2(10)
);

CREATE INDEX idx_issue_status
    ON issues( issue_status );

Si soy una empresa grande, podría tener 1 millón de filas en esta tabla. De ellos, 100 tienen un issue_status de ACTIVO, 10.000 tienen un issue_status de EN COLA, y 989.900 tienen un estado de COMPLETO. Si quiero ejecutar una consulta en la tabla para encontrar mis problemas activos

SELECT *
  FROM issues
 WHERE issue_status = 'ACTIVE'

el optimizador tiene una opción. Puede usar el índice en issue_status y luego haga una búsqueda de una sola fila en la tabla para cada fila en el índice que coincida o puede hacer una exploración de la tabla en los issues mesa. Qué plan es más eficiente dependerá de los datos que se encuentran en la tabla. Si Oracle espera que la consulta devuelva una pequeña fracción de los datos de la tabla, usar el índice sería más eficiente. Si Oracle espera que la consulta devuelva una fracción sustancial de los datos de la tabla, una exploración de la tabla sería más eficiente.

DBMS_STATS.GATHER_TABLE_STATS es lo que reúne las estadísticas que permiten a Oracle tomar esta determinación. Le dice a Oracle que hay aproximadamente 1 millón de filas en la tabla, que hay 3 valores distintos para issue_status columna, y que los datos están distribuidos de manera desigual. Entonces, Oracle sabe usar un índice para la consulta para encontrar todos los problemas activos. Pero también sabe que cuando te das la vuelta y tratas de buscar todos los temas cerrados

SELECT *
  FROM issues
 WHERE issue_status = 'CLOSED'

que será más eficiente hacer un escaneo de tabla.

La recopilación de estadísticas permite que los planes de consulta cambien con el tiempo a medida que cambian los volúmenes de datos y las distribuciones de datos. Cuando instale por primera vez el rastreador de problemas, tendrá muy pocos problemas COMPLETADOS y más problemas ACTIVOS y EN COLA. Con el tiempo, el número de ediciones COMPLETADAS aumenta mucho más rápidamente. A medida que obtenga más filas en la tabla y cambie la fracción relativa de esas filas que están en los distintos estados, los planes de consulta cambiarán para que, en el mundo ideal, siempre obtenga el plan más eficiente posible.