2009-09-10 31 views
9

En Oracle, al consultar por existencia de filas, ¿por qué es Select 1 rápido que Select count (*)?¿Por qué es Select 1 más rápido que Select count (*)?

+1

sin saber qué motor RDBMS está utilizando, no hay manera de responder correctamente. Diferentes motores se comportan de manera diferente – Glen

+1

¿Quiere decir "¿por qué select count count (1) más rápido que Select count (*)"? –

+0

Me refiero a "Seleccionar 1".Estoy mirando una antigua documentación de estándares de codificación fuera de línea donde se afirma que "Seleccionar 1" es más rápido que "Seleccionar conteo (*)", y una forma preferida de consultar la existencia de filas. La documentación no proporciona una explicación técnica de por qué esta es una técnica de "mejora del rendimiento". Cuando busqué en la red, encontré cosas como AskTom hilos y debates ... pero no vi una respuesta clara y definitiva. –

Respuesta

14

Desde Oracle no admite SI EXISTE en PL/SQL, la sugerencia de CodeByMidnight usar existe normalmente se puede hacer con algo así como

SELECT 1 
    INTO l_local_variable 
    FROM dual 
WHERE EXISTS( 
    SELECT 1 
     FROM some_table 
    WHERE some_column = some_condition); 

Oracle sabe que puede detener el procesamiento de la Donde exista cláusula tan pronto como sea se encuentra una fila, por lo que no tiene que contar potencialmente una gran cantidad de filas que coincidan con los criterios. Esto es menos preocupante, por supuesto, si está comprobando si existe una fila con una clave particular que si está verificando una condición que involucra columnas no indexadas o que verifica una condición que puede dar como resultado que se devuelva una gran cantidad de filas.

(Nota: Deseo poder publicar esto como un comentario en la publicación de CodeByMidnight, pero los comentarios no pueden incluir el código formateado).

ACTUALIZACIÓN: Teniendo en cuenta la aclaración el cartel original hecha en su comentario, la respuesta corta y definitiva es que un SELECT 1 o SELECT COUNT(1) no más rápido que un SELECT COUNT(*) es. Contrariamente a las pautas de codificación que está viendo, COUNT(*) es la forma preferida de contar todas las filas. Había un viejo mito de que un COUNT(1) era más rápido. Como mínimo, eso no ha sido cierto en ninguna versión de Oracle lanzada en la última década y es poco probable que sea cierta. Sin embargo, era una creencia ampliamente aceptada. Hoy en día, el código que hace un COUNT(1) en lugar de un COUNT(*) generalmente me hace sospechar que el autor es propenso a creer varios mitos de Oracle y por eso sugiero usar COUNT(*).

0

Como una estrella toma todas las columnas en el recuento, "1" es un tipo de datos nativo.

En MySQL "SELECT COUNT (name_of_the_primary_key)" debe ser tan rápido como su SELECT 1. Es el índice que cuenta. Un conteo() en un índice debe ser bastante rápido;)

2

Me sorprendería si select count (*) no se hubiera optimizado correctamente, no hay necesidad de cargar todas las columnas, ya que no habrá procesamiento relacionado con la columna.

+1

sí. Oracle trata el recuento (*) exactamente igual que count (1), count (null), count ('cualquier valor atómico que desee'). –

15

Es mejor aún utilizar EXISTS cuando el RDBMS lo admite o un equivalente, ya que esto detendrá el procesamiento de filas tan pronto como encuentre una coincidencia.

+5

+1 Solo debemos usar COUNT(), necesitamos saber la cantidad real de registros involucrados. – APC

0

Todas las demás cosas son iguales, "select 1 from my_table" devolverá el resultado primera más rápido que "select count(*) from my_table", pero si recupera todos los resultados de la consulta, el count(*) uno será más rápido, ya que implica muchos menos datos (1 número entero, como opuesto a 1 entero por cada fila en la tabla).

Cuestiones relacionadas