2012-01-30 24 views
8

¿Se ejecutarán las dos consultas siguientes de la misma manera?SELECCIONAR CUENTA (*) con ORDEN POR

SELECT COUNT(*) from person ORDER BY last_name;

y

SELECT COUNT(*) from person;

De cualquier manera que deben mostrar los mismos resultados, así que estaba ansioso por ver si la ORDER BY solo se tendrá en cuenta.

La razón por la que estoy preguntando es porque estoy mostrando una tabla paginada donde obtendré 20 registros a la vez de la base de datos y luego ejecuto una segunda consulta que cuenta el número total de registros. Quiero saber si debo usar los mismos criterios que usé la primera consulta, o si debería eliminar toda clasificación de los criterios?

+0

¡No son lo mismo! –

+0

¿Has comprobado el plan de consulta primero? Estoy seguro de que tiene el analizador si le importan esas pequeñas diferencias. Le dirá si la clasificación ocurre o no. – artificialidiot

+0

Quitaría una cláusula de ordenamiento de cualquier función agregada conmutativa (como COUNT o SUMA) simplemente porque no es necesaria. –

Respuesta

10

De acuerdo con el plan de ejecución, las dos consultas son diferentes. Por ejemplo, la consulta:

select count(*) from USER 

me dará:

INDEX (FAST FULL SCAN) 3.0 3 453812 3457  1 TPMDBO USER_PK FAST FULL SCAN INDEX (UNIQUE) ANALYZED 

Como se puede ver, que golpeó USER_PK que es la clave primaria de esa tabla.

Si ordenar por una columna no indexada:

select count(*) from USER ORDER BY FIRSTNAME --No Index on FIRSTNAME 

voy a conseguir:

TABLE ACCESS (FULL) 19.0 19 1124488 3457 24199 1 TPMDBO USER FULL TABLE ANALYZED 1 

Significado hicimos un escaneo completo de tabla (mucho más alto costo de nodo)

Si ordeno por la clave principal (que ya es un índice), Oracle es lo suficientemente inteligente como para usar el índice para hacer ese tipo:

INDEX (FAST FULL SCAN) 3.0 3 453812 3457 13828 1 TPMDBO USER_PK FAST FULL SCAN INDEX (UNIQUE) ANALYZED 

Que se parece mucho al primer plan de ejecución.

Por lo tanto, la respuesta a su pregunta es absolutamente no, no son lo mismo. Sin embargo, ordenar por un índice que Oracle ya está buscando de todos modos probablemente dará como resultado el mismo plan de consulta.

1

Por supuesto que no. A menos que el apellido sea la clave principal y ya está ordenado por eso.

+0

No creo que la respuesta sea obvia. Oracle a menudo arrojará pasos inútiles, especialmente una clasificación innecesaria. Inicialmente esperaba que las dos consultas se ejecutaran de la misma manera. –

+0

Puede que no sea obvio para ti, pero parece que esa es también la respuesta correcta. – Sid

1

El optimizador de consultas de Oracle realmente realiza un tipo (lo verifiqué mirando el plan de explicación) para la primera versión, pero como ambas consultas solo devuelven una fila, la diferencia de rendimiento será muy pequeña.

EDIT:

la respuesta de Mike es correcta. La diferencia de rendimiento posiblemente puede ser significativa.

+2

'SORT ORDER BY' está ordenando,' SORT AGGREGATE' no está realmente ordenando. Y aunque las consultas devuelven el mismo número de filas, la diferencia de rendimiento podría ser enorme. –

Cuestiones relacionadas