viernes, 13 de enero de 2012

SQL - Seleccionar sólo las primeras N filas

El otro día metí la pata haciendo un SELECT genérico de una tabla de la que desconocía el tamaño. El procesador se puso casi al 100% durante 5 minutos, y el disco duro no dejaba de rascar. Los usuarios que compartían (sufrían) conmigo el acceso a la BD estuvieron experimentando un rendimiento pésimo durante esos 5 minutos (bueno, los pocos que intentaron trabajar en ese período), que a mí se me hicieron eternos. El problema es que la tabla tenía casi 2 millones de registros y esto fue er... bueno... "un poco" pesado. Encima, el resultado fue a una página web, así que os podéis imaginar el tamaño del "ascensor" (el recuadro) de la barra de desplazamiento. Casi no se podía pinchar en él de pequeño que se quedó.

El caso es que me interesaba simplemente ojear el contenido de esa tabla, me hubiera bastado con recuperar unos pocos registros, digamos, unos 100 para hacerme una idea de su contenido. Bueno, pues eso se puede hacer sin necesidad de poner filtros a los datos (cosa que en su momento no podía hacer pues no tenía ni idea de los campos y datos de la tabla).

En ORACLE
SELECT * FROM TABLA WHERE ROWNUM <100

En MS SQL Server y en SYBASE

SELECT TOP 10 * FROM TABLA

En INFORMIX
SELECT FIRST 100 * FROM TABLA


Actualización 02/09/2014 para incluir SQLite3, que me ha hecho falta hoy. Hay que añadir LIMIT(N) al final de la consulta

En SQLite3
SELECT * FROM TABLA LIMIT(100)

Si hubiera cláusulas WHERE u ORDER BY, hay que poner la opción LIMIT al final de todo, o sea:

SELECT * FROM TABLA WHERE CONDICION ORDER BY CAMPO LIMIT(100)

5 comentarios:

  1. tuanis mae por la info

    ResponderEliminar
  2. gracias x la info me sirvio mucho =)

    ResponderEliminar
  3. ami el limit me funciona si los parentesis

    ResponderEliminar
  4. Tengo una consulta para mysql, en caso que quisiera juntar 3 a 4 tablas y de esas tablas mostrar 3 tuplas de cada una de ellas que debería hacer?

    Bendiciones y saludos

    ResponderEliminar
    Respuestas
    1. Lo he probado, y sería algo así:

      select * from (select "tabla1", campo1 from tabla1 limit 4) as t1
      union
      select * from (select "tabla2", campo2 from tabla2 limit 4) as t2
      union
      select * from (select "tabla3", campo3 from tabla3 limit 3) as t3

      El primer campo que selecciono es el nombre de la tabla, para poder ver cuál es el origen de cada uno de los registros.

      Lo de poner un límite 4 en los 2 primeros casos es que he descubierto que en mi versión de MySQL (la 5.6.21) parece haber algún bug en la gestión de la cláusula LIMIT y según parece saca 1 registro menos de los indicados en todos los LIMIT excepto el último. Pruébalo a ver en tu caso qué tal.

      Eliminar

Related Posts Plugin for WordPress, Blogger...