Pregunta

En Oracle, cuando se consulta la existencia de filas, ¿por qué es Select 1 rápido que Select count (*)?

¿Fue útil?

Solución

Dado que Oracle no admite IF EXISTS en PL / SQL, la sugerencia de CodeByMidnight de usar EXISTS normalmente se haría con algo 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 dejar de procesar la cláusula WHERE EXISTS tan pronto como se encuentre 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á verificando si existe una fila con una clave particular que si está verificando una condición que involucra columnas no indexadas o una condición que podría dar como resultado que se devuelva un gran número de filas.

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

ACTUALIZACIÓN: Dada la aclaración que hizo el póster original en su comentario, la respuesta breve y definitiva es que un SELECT 1 o SELECT COUNT (1) no es más rápido que un SELECT COUNT (*) . 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 alguna vez fuera cierto. Sin embargo, era una creencia muy extendida. Hoy, el código que hace un COUNT (1) en lugar de un COUNT (*) generalmente me hace sospechar que el autor es propenso a creer en varios mitos de Oracle, por eso sugiera usar COUNT (*) .

Otros consejos

Es mejor usar EXISTS donde RDBMS lo admite o un equivalente, ya que esto detendrá el procesamiento de filas tan pronto como encuentre una coincidencia.

Me sorprendería que el recuento de selección (*) no se haya optimizado correctamente, no es necesario cargar en todas las columnas ya que no habrá procesamiento relacionado con la columna.

Debido a que una estrella toma todos los cols 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;)

No creo que esto sea cierto para Oracle. http://justoracle.blogspot.com/2006/12/count- vs-count1.html

Pero, en algunas bases de datos, la razón es porque '*' tiene que visitar los metadatos de las tablas. Esto tiende a agregar una sobrecarga innecesaria. Donde como 1 es solo un literal.

En igualdad de condiciones, " select 1 de my_table " devolverá el resultado first más rápido que " select count (*) de my_table " , pero si recupera todos los resultados de la consulta, el count (*) será más rápido porque implica menos datos (1 entero, a diferencia de 1 entero por cada fila) en la tabla).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top