Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Rapidez y los UNION

Estas en el tema de Rapidez y los UNION en el foro de Bases de Datos General en Foros del Web. Hola, foreros: He leido en varios post que el uso de UNION en varias tablas para buscar hace que valla lento el sql. Entonces... ¿Como ...
  #1 (permalink)  
Antiguo 09/07/2008, 10:02
Avatar de salbatore  
Fecha de Ingreso: abril-2007
Ubicación: Springfield
Mensajes: 1.567
Antigüedad: 17 años, 1 mes
Puntos: 19
Rapidez y los UNION

Hola, foreros:

He leido en varios post que el uso de UNION en varias tablas para buscar hace que valla lento el sql.

Entonces... ¿Como hago para buscar en varias tablas o simplemente manejarlas?
  #2 (permalink)  
Antiguo 09/07/2008, 12:01
Avatar de eft0  
Fecha de Ingreso: junio-2003
Ubicación: Santiago - Chile
Mensajes: 635
Antigüedad: 20 años, 10 meses
Puntos: 9
Respuesta: Rapidez y los UNION

El union sirve para mezclar dos o mas consultas SELECT en un unico conjunto de resultados, para buscar en varias tablas tienes simplemente que indicarle en el FROM y WHERE.
__________________
eft0's stuff! - http://estebanfernandez.net
  #3 (permalink)  
Antiguo 09/07/2008, 12:04
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Rapidez y los UNION

Tema trasladado a Bases de Datos.
  #4 (permalink)  
Antiguo 09/07/2008, 13:19
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 6 meses
Puntos: 85
Respuesta: Rapidez y los UNION

Hola,

Cita:
...el uso de UNION en varias tablas para buscar hace que valla lento el sql.
Interesante afirmacion, habra que darle algunas vueltas...

En primer lugar hay que definir la diferencia entre UNION y UNION ALL, el primero tiene un costo adicional dado que elimina los registros repetidos despues de la union de datos de las dos tablas, esto no es una operacion trivial, a veces es preferible tener un par de registros duplicado que el costo de la operacion.

En segundo lugar estan los filtros de busqueda y si tienen indices los campos, ya que cualquier motor (lo asumo) primero filtra por el WHERE y al resultado aplica la UNION.

Por ejemplo

Código:
SQL> select * from t1;

        ID DATA
---------- ------------------------------
         1 data
         2 data
         3 data
         4 data
         5 data

SQL> select * from t2;

        ID DATA
---------- ------------------------------
         6 data
         7 data
         8 data
         9 data
        10 data
Código:
SQL> explain plan for
  2  with s as (
  3  select id, data from t1
  4  union
  5  select id, data from t2
  6  )
  7  select * from s where id = 6
  8  /

Explained.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 3372616832

--------------------------------------------------------------------------------------------
| Id  | Operation                      | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT               |           |     2 |    60 |     6  (34)| 00:00:01 |
|   1 |  VIEW                          |           |     2 |    60 |     6  (34)| 00:00:01 |
|   2 |   SORT UNIQUE                  |           |     2 |    60 |     6  (84)| 00:00:01 |
|   3 |    UNION-ALL                   |           |       |       |            |          |
|   4 |     TABLE ACCESS BY INDEX ROWID| T1        |     1 |    30 |     1   (0)| 00:00:01 |
|*  5 |      INDEX UNIQUE SCAN         | IND_T1_ID |     1 |       |     0   (0)| 00:00:01 |
|*  6 |     TABLE ACCESS FULL          | T2        |     1 |    30 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------
Tengo dos tablas, T1 y T2, donde T1 tiene un indice unique en el campo ID, que por cierto es el filtro del WHERE y T2 no tiene ningun indice, por lo tanto en la operacion 5 tengo el filtro WHERE ID = 6 utilizando el indice y en la operacion 6 tengo un FULL SCAN sobre T2 por no tener ninguno, al resultado se aplica la union, operacion 3, mientras que la operacion 2 es la adicional por no utilizar un UNION ALL, esto es, ordenar todos los registros para eliminar los repetidos.

Como conclusion, si los campos a los que aplico los filtros estan indexados, no deberia haber problemas, entonces de donde viene la afirmacion, en mi opinion, el problema esta en que buscas en 2 o mas tablas la informacion que esta en una sola.

Imagina el siguiente escenario, tengo 10 tablas, y dos opciones, 10 consultas SQL para buscar la informacion por tabla o 1 consulta SQL con la UNION de las 10, en el primer caso, si encuentro la informacion en la primera tabla, ya no tengo que recorrer las 9 restantes, y ahi es donde puede estar el costo adicional.

Saludos
  #5 (permalink)  
Antiguo 10/07/2008, 15:57
Avatar de salbatore  
Fecha de Ingreso: abril-2007
Ubicación: Springfield
Mensajes: 1.567
Antigüedad: 17 años, 1 mes
Puntos: 19
Respuesta: Rapidez y los UNION

Hola...

Ok!, entendido....

Gracias...
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:39.