2012-05-03 12 views
9

Supongo que esto se ha preguntado en el sitio antes, pero no puedo encontrarlo.Conteo vago en sql select statements

He visto en algunos sitios que hay un recuento impreciso de los resultados de una búsqueda. Por ejemplo, aquí en stackoverflow, cuando busca una pregunta, dice +5000 resultados (a veces), en gmail, cuando busca por palabras clave, dice "cientos" y en google dice aproximadamente X resultados. ¿Es esta solo una forma de mostrarle al usuario un número fácil de entender que es enorme? o esta es en realidad una manera rápida de contar los resultados que se pueden usar en una base de datos [¿Estoy aprendiendo Oracle en este momento? versión 10g]. algo así como "hey, si obtienes más de 1k resultados, simplemente detente y dime que hay más de 1k".

Gracias

PS. Soy nuevo en las bases de datos.

+2

buena pregunta. Espero respuestas también – Dariop

Respuesta

1

No sé qué tan rápido esto va a funcionar, pero se puede intentar:

SELECT NULL FROM your_tables WHERE your_condition AND ROWNUM <= 1001 

Si el recuento de filas en el resultado será igual a 1,001 recuento total de registros a continuación, se> 1000.

1

El conteo vago es un buffer que se mostrará rápidamente. Si el usuario quiere ver más resultados, entonces puede solicitar más.

Es una instalación de rendimiento, después de mostrar los resultados, los sitios como google siguen buscando más resultados.

3

Por lo general, esta es solo una buena manera de mostrar un número.

No creo que haya una manera de hacer lo que está pidiendo en SQL - count no tiene una opción para contar hasta cierto número.

Tampoco supondré que esto proviene de SQL en gmail o en stackoverflow. La mayoría de los motores de búsqueda devolverán un número total de coincidencias a una búsqueda, y luego le permitirán navegar a través de los resultados.

En cuanto a lo que un número exacto legible más humano, aquí es un ejemplo de rieles:

http://api.rubyonrails.org/classes/ActionView/Helpers/NumberHelper.html#method-i-number_to_human

+0

Stack Overflow se está ejecutando en SQL Server (hasta donde yo sé) y [hace un gran uso de SQL] (http://data.stackexchange.com/stackoverflow/queries). Entonces, no estoy seguro de por qué reclamarías que esto no debería hacerse con SQL. –

+1

Dije que no asuma que está usando SQL, no es que no deba usar SQL. Y, de hecho, SO utiliza lucene.net: http://blog.stackoverflow.com/2011/01/stack-overflow-search-now-81-less-crappy/ –

+0

Agradable, gracias por la pista –

0

Al hacer una consulta SQL se puede establecer un

LIMIT 0, 100 

por ejemplo y solo obtendrás las primeras cien respuestas. para que luego pueda imprimir a su visor que hay más de 100 respuestas a su solicitud.

Para google No podría decir si realmente saben que hay más de 27,000000 respuestas a una solicitud, pero creo que realmente sí lo saben. Hay alguna solicitud estándar que tiene resultados almacenados y donde la actualización se realiza en segundo plano.

+1

'LIMIT 0, 100 'es la sintaxis de MySQL ... –

2

Con Oracle, siempre puede recurrir a funciones analíticas para calcular el exacto número de filas a punto de devolverse. Este es un ejemplo de este tipo de consulta:

SELECT inner.*, MAX(ROWNUM) OVER(PARTITION BY 1) as TOTAL_ROWS 
FROM (
    [... your own, sorted search query ...] 
) inner 

Esto le dará el número total de filas para su sub consulta específica.Cuando se desea aplicar paginación, así, se puede envolver aún más estas piezas SQL tales como:

SELECT outer.* FROM (
    SELECT * FROM (
    SELECT inner.*,ROWNUM as RNUM, MAX(ROWNUM) OVER(PARTITION BY 1) as TOTAL_ROWS 
    FROM (
     [... your own, sorted search query ...] 
    ) inner 
) 
    WHERE ROWNUM < :max_row 
) outer 
WHERE outer.RNUM > :min_row 

Reemplazar min_row y max_row por valores significativos. Pero tenga en cuenta que calcular el número exacto de filas puede ser costoso cuando no está filtrando usando UNIQUE SCAN o operaciones de RANGE SCAN relativamente estrechas en los índices. Leer más sobre esto aquí: Speed of paged queries in Oracle

Como han dicho otros, siempre se puede tener un límite superior absoluto, como 5000 la consulta mediante un filtro ROWNUM <= 5000 y luego simplemente indican que hay más de 5000+ resultados. Tenga en cuenta que Oracle puede ser muy bueno en la optimización de consultas cuando aplica el filtrado ROWNUM. Encontrar algo de información sobre ese tema aquí:

http://www.dba-oracle.com/t_sql_tuning_rownum_equals_one.htm