Database System Concepts, 5th Ed.
©Silberschatz, Korth and Sudarshan See www.db-book.com for conditions on re-use
Procesamiento de consultas
Procesamiento de consultas
Visión general
Medidas del coste de una consulta Operación selección
Ordenación
Operación reunión Otras operaciones
Pasos básicos para el procesamiento de consultas
Pasos básicos para el procesamiento de consultas
1. Análisis y traducción 2. Optimización
Pasos básicos para el procesamiento de
Pasos básicos para el procesamiento de
consultas (Cont.)
consultas (Cont.)
Análisis y transformación
Traducción de la consulta a su formato interno. Posteriormente se
construye un árbol para el análisis de la consulta, que se transformara en una expresión del algebra relacional.
El analizador comprueba la sintaxis de la consulta, verifica nombres
de relaciones de la BD.
Evaluación
El motor de evaluación elije un plan de la consulta, se evalúa y
Pasos básicos para el procesamiento de consultas:
Pasos básicos para el procesamiento de consultas:
Optimización
Optimización
Una expresión del álgebra relacional puede tener muchas expresiones
equivalentes: select saldo from cuenta where saldo < 2500 Ejm.,
saldo2500(saldo(Cuenta)) es equivalente asaldo(
saldo2500(Cuenta)) Se puede ejecutar cada operación del álgebra relacional utilizando
alguno de los diferentes algoritmos.
En consecuencia, una expresión del álgebra relacional se puede
evaluar de muchas maneras.
Las anotaciones de las expresiones que especifican los detalles de la
estrategia de evaluación se denomina plan de evaluación.
Ejm., Puede usar un índice sobre saldo para encontrar las
cuentas con saldo < 2500
O podemos realizar un completo escaneo y descartar cuentas con
Pasos básicos para el procesamiento de consultas:
Pasos básicos para el procesamiento de consultas:
Optimización (Cont.)
Optimización (Cont.)
Optimización de consultas: Entre todos los planes de evaluación
equivalente elegir el de menor costo.
El Costo se calcula utilizando la información estadística en el
catálogo de la base de datos.
Ejm. número de tuplas de cada relación, el tamaño de las
tuplas, etc.
Temas a estudiar:
¿Cómo medir los costos de los algoritmos de consulta para
evaluar las operaciones de álgebra relacional?
¿Cómo combinar los algoritmos de las operaciones individuales a
Medidas del coste de una consulta
Medidas del coste de una consulta
El costo es generalmente medido como el tiempo total transcurrido para
responder a la consulta
Muchos factores contribuyen al costo del tiempo
Accesos a disco, CPU, o eventos de comunicación en Red.
Generalmente el acceso a disco predomina en el costo, y es relativamente fácil
de estimar. Se mide tomando en cuenta:
Numero de búsquedas * Promedio del costo de búsqueda
Numero de bloques leídos * Promedio del costo de bloques leídos Numero de bloques escritos * Promedio del costo de bloques escritos
Costo para escribir un bloque es mayor que el costo para leer un bloque
Medidas del coste de una consulta (Cont.)
Medidas del coste de una consulta (Cont.)
Para simplificar, sólo tiene que utilizar el número de transferencias de bloques de
disco y el número de búsquedas como las medidas de coste. t
T – tiempo para la transferencia de un bloque
t
S – tiempo para una búsqueda (tiempo de búsqueda en el disco mas latencia
rotacional)
Costo b transferencias de bloques, más S búsquedas: b * t
T + S * tS
No se considera el costo de CPU
En Sistemas reales se toma en cuenta el costo de CPU
Las estimaciones de coste que se proporcionan ignoran el coste de escribir el
resultado final de una operación en disco
Varios algoritmos puede redudir E/S a disco utilizando un espacio extra de buffer.
La cantidad de memoria disponible en el buffer depende de tareas concurrentes y procesos de SO, conocidos durante la ejecución.
Frecuentemente asumimos la mínima cantidad de memoria disponible para la operación.
Aunque se asuma que los datos se deben leer inicialmente de disco, es posible que
Operación de Selección
Operación de Selección
explorador de archivo– es el operador de nivel más bajo para acceder a los datos. Los exploradores de archivo son algoritmos de búsqueda que localizan y recuperan los registros que cumplen una condición de selección. Algoritmo A1 (Búsqueda lineal). se explora cada bloque del archivo y se
comprueban todos los registros para ver si satisfacen la condición de selección.
Costo estimado = b
r transferencias de bloques.
br numero de bloques que contienen a los registros de la relación r
Las selecciones sobre atributos clave tienen un coste medio de:
coste = (br /2) transferencias de bloque
Búsqueda lineal se puede aplicar independientemente de la:
La condición de selección
El orden de los registros en el archivo
Operación de Selección (Cont.)
Operación de Selección (Cont.)
A2 (búsqueda binaria). Aplicable si el archivo está ordenado según un atributo y la condición de la selección es una comparación de igualdad en ese atributo.
Supongamos que los bloques de una relación se almacenan de forma
contigua
Estimación de costos (número de bloques de disco a escanear):
Costo de la localización de la primera tupla por búsqueda binaria
sobre los bloques:
log2(br) * (tT + tS)
Si la selección no es sobre un atributo clave, más de un bloque
puede contener los registros requeridos, y el coste de la lectura de los bloques extra se debe añadir a la estimación del coste. Se
Selección usando Índices
Selección usando Índices
Las estructuras índice se denominan caminos de acceso, ya que
proporcionan un camino a través del cual se pueden localizar y acceder a los datos.
Los algoritmos de búsqueda que utilizan un índice reciben el nombre
de exploraciones del índice.
Aunque los índices pueden proporcionar un acceso rápido, directo y
Selección usando Índices
Selección usando Índices
A3 (Índice primario, igualdad basada en la clave). Para una condición
de igualdad en un atributo clave con un índice primario se puede utilizar el índice para recuperar el único registro que satisface la
correspondiente condición de igualdad.
Si se usa un árbol B+, el coste de la operación en términos de
operaciones E/S es igual a la altura del árbol más una operación E/ S para recuperar el registro.
Costo = (h
i + 1) * (tT + tS)
A4 (Índice primario, igualdad basada en un atributo no clave) Recupera
múltiples registros.
Estos registros estarían almacenados consecutivamente en el
Selección usando Índices (Cont.)
Selección usando Índices (Cont.)
A5 (índice secundario, igualdad).
Esta estrategia puede recuperar un único registro si la condición de
igualdad es sobre una clave; puede que se recuperen varios
registros si el campo índice no es clave. En el primer caso sólo se obtiene un registro, y el coste es igual a la altura del árbol más una operación E/S para recuperar el registro. En el segundo caso, cada registro puede residir en un bloque diferente, que puede resultar en una operación E/S por cada registro recuperado. El coste podría
llegar a ser incluso peor que el de la búsqueda lineal si se obtiene un gran número de registros.
Recupera un simple registro si la clave de búsqueda es una clave
candidata
Costo = (h
i + 1) * (tT + tS)
Recupera múltiples registros si la clave de búsqueda no es una clave
candidata.
Cada uno de los n registros similares pueden estar en diferentes
bloques.
Costo = (h
Selecciones con condiciones de comparación
Selecciones con condiciones de comparación
Considérese una selección de la forma
AV (r) o A V(r), Se puede
implementar utilizando búsqueda lineal o binaria o con índices de alguna de las siguientes maneras:
A6 (Índice primario, comparación). (La Relación es ordenada sobre A)
Para
A V(r) utilizar el índice para encontrar primera tupla v y
escanear relación secuencialmente a partir de ahí.
Para
AV (r) solo escanear la relación secuencialmente hasta primera
tupla > v; no utilizar el índice.
A7 (Índice secundario, comparación).
Para
A V(r) utilizar el índice para encontrar primera entrada de índice
v y explorar el índice secuencialmente a partir de ahí, para encontrar los punteros a los registros.
Para
AV (r) sólo escanear páginas de hoja del índice encontrando los
punteros a los registros, hasta la primera entrada > v
En cualquier caso, recuperar registros que son apuntados.
– Requiere una E/S para cada registro
Implementación de selecciones complejas
Implementación de selecciones complejas
Conjunción: 1 2. . . n(r)
A8 (selección conjuntiva utilizando un índice).
Selecciona una combinación de i y algoritmos A1 a A7 que da como resultado el menor coste para i (r).
Pruebe otras condiciones en tupla después de obtenerlo en el buffer de memoria.
A9 (selección conjuntiva utilizando un índice compuesto).
Utilice índice apropiado compuesto (múltiples claves) si está disponible.
A10 (selección conjuntiva mediante la intersección de identificadores).
Requiere índices con punteros de registros.
El uso del índice correspondiente para cada condición, y tomar la
intersección de todos los conjuntos obtenidos del punteros de registros. Luego recuperar los registros de archivo
Implementación de selecciones complejas
Implementación de selecciones complejas
Disyunción:1 2 . . . n (r).
A11 (selección disyuntiva mediante la unión de identificadores).
Aplicable si todas las condiciones tienen índices disponibles.
Caso contrario, utilice barrido lineal.
El uso del índice correspondiente para cada condición, y tomar la unión
de todos los conjuntos obtenidos del punteros de registros.
Luego recuperar los registros de archivo
Negation: (r)
Utilice exploración lineal en el archivo
Si muy pocos registros cumplen , y un índice es aplicable a
Buscar la satisfacción de los registros con índice y recuperar desde
Ordenación
Ordenación
Se puede conseguir la ordenación mediante la construcción de un
índice en la clave de ordenación y utilizando luego ese índice para leer la relación de manera ordenada.
Este proceso ordena la relación sólo lógicamente a través de un
índice, en lugar de físicamente.
Por esta razón sería deseable ordenar las tuplas físicamente. La
Algoritmo de ordenación-mezcla externa
Algoritmo de ordenación-mezcla externa
La técnica más utilizada para la ordenación externa es normalmente
el algoritmo de ordenación-mezcla externa.
Sea M el número de marcos de página en la memoria intermedia de la
Algoritmo de ordenación-mezcla externa
Algoritmo de ordenación-mezcla externa
Primera etapa
Primera etapa
Se crean varias secuencias ordenadas.
i=0
repeat
leer M bloques o bien de la relación o bien del resto de la relación según el que tenga menor número de bloques;
ordenar la parte en memoria de la relación;
escribir los datos ordenados al archivo de secuencias Si; i=i+1;
until el final de la relación
i=0
repeat
leer M bloques o bien de la relación o bien del resto de la relación según el que tenga menor número de bloques;
ordenar la parte en memoria de la relación;
escribir los datos ordenados al archivo de secuencias Si; i=i+1;
Algoritmo de ordenación-mezcla externa
Algoritmo de ordenación-mezcla externa
Segunda etapa
Segunda etapa
Las secuencias se mezclan. Si se tienen N secuencias de tal forma
que N<M
Leer un bloque de cada uno de los N archivos Si, y guardarlos en una página de la memoria intermedia en memoria;
repeat
elegir la primera tupla (según el orden) de entre todas las páginas de la memoria intermedia:
Escribir la tupla y suprimirla de la página de la memoria intermedia;
if la página de la memoria intermedia de alguna secuencia Si está vacía
and not fin_de_archivo(Si) then
leer el siguiente bloque Si y guardarlo en la página de la memoria intermedia;
until todas las páginas de la memoria intermedia estén vacías
Leer un bloque de cada uno de los N archivos Si, y guardarlos en una página de la memoria intermedia en memoria;
repeat
elegir la primera tupla (según el orden) de entre todas las páginas de la memoria intermedia:
Escribir la tupla y suprimirla de la página de la memoria intermedia;
if la página de la memoria intermedia de alguna secuencia Si está vacía
and not fin_de_archivo(Si) then
leer el siguiente bloque Si y guardarlo en la página de la memoria intermedia;
Algoritmo de ordenación-mezcla externa
Algoritmo de ordenación-mezcla externa
casos y coste
casos y coste
En el caso en que N>M, se realiza la operación de mezcla en varios
ciclos, tomando como entrada de cada ciclo M-1 secuencias de bloques. Se ordena cada secuencia según el algoritmo anterior.
Si al concluir el ciclo completo se tiene que N>M, se repiten estos
ciclos tantas veces como sea necesario, hasta que el número de secuencias sea menor que M; momento en el que un último ciclo genera el resultado ordenado.
El número total de bloques transferidos en una ordenacion de
mescla externa es:
Operación reunión
Operación reunión
Existen varios algoritmos para implementar la reunión.
Reunión en bucle anidado
Reunión en bucle anidado por bloques Reunión en bucle anidado indexada Reunión por mezcla
Reunión por asociación
La elección es en función al costo calculado.
En los ejemplos se utiliza la siguiente información:
# de registros de cliente: ncliente = 10000. # de bloques de cliente: bcliente = 400.
Reunión en bucle anidado
Reunión en bucle anidado
Calcular la reunión Zeta: r s
for each tuple tr in r do begin
for each tuple ts in s do begin
comprobar que el par (tr,ts) satisface la condición de la reunión si la cumple, añadir tr • ts al resultado.
end end
r es llamado la relación externa y s la relación interna de la reunión. No requiere índices y se puede utilizar sin importar la condición de la
reunión.
Reunión en bucle anidado
Reunión en bucle anidado
(Cont.)
(Cont.)
En el peor de los casos, la memoria intermedia solamente puede contener un
bloque de cada relación necesitándose un total de nr bs + br accesos a bloques
En el mejor de los casos hay suficiente espacio para que las dos relaciones
quepan en memoria intermedia, así que cada bloque se tendrá que leer solamente una sola vez.
En consecuencia se necesitaría acceder a br + bs bloques
Asumiendo el peor caso de disponibilidad de la memoria la estimación de costos
es:
Con impositor como relación externa:
5000 400 + 100 = 2,000,100 accesos a bloques,
Con cliente como la relación externa
10000 100 + 400 = 1,000,400 accesos a bloques
En la mejor de las situaciones, sin embargo, se tienen que leer ambas relaciones
una sola vez y realizar el cálculo. El cálculo necesita a lo sumo 100+400=500 accesos a bloques.
Reunión en bucle anidado por bloques
Reunión en bucle anidado por bloques
Variante de la reunión de bucle anidado en la cual cada bloque
de la relación interna es emparejada con cada bloque de la relación externa.
for each block Br of r do begin
for each block Bs of s do begin for each tuple tr in Br do begin
for each tuple ts in Bs do begin
Comprobar que el para (tr,ts) satisface la condición de la reunión
si la cumple, añadir tr• ts al resultado. end
Reunión en bucle anidado por bloques
Reunión en bucle anidado por bloques
(Cont.)
(Cont.)
En el peor de los casos, cada bloque de la relación interna s se lee solamente una vez
por cada bloque de la relación externa en lugar de una vez por cada tupla de la
relación externa. De este modo, en el peor de los casos habrá un total de: br bs + br
accesos a bloques.
En el mejor de los casos habrá que acceder a b
r + bs.
El rendimiento de los procedimientos de bucle anidado y bucle anidado por bloque se
puede mejorar a un mas:
En el bucle anidado por bloques, utilizar M — 2 bloques de disco como la unidad de bloque para la relación externa, donde M = tamaño en bloques de la memoria; utilizar los restantes dos bloques para almacenar los bloques de la relación
interna y bloques de resultado o salida.
Costo = b
r / (M-2) bs + br acceso a bloques
Si los atributos de la reunión en una reunión natural o una equirreunión forman una clave de la relación interna, entonces el bucle interno puede finalizar tan pronto como se encuentre la primera correspondencia.
Se puede explorar el bucle interno alternativamente hacia adelante y hacia atrás. Este método de búsqueda ordena las peticiones de bloques de disco de tal
manera que los datos restantes en la memoria intermedia de la búsqueda anterior se reutilizan.
Reunión en bucle anidado indexado
Reunión en bucle anidado indexado
Búsquedas en Índices pueden reemplazar a la exploración de archivos sí:
La Reunión es una equireunión o una reunión natural y
Esta disponible un índice sobre el atributo de la reunión en la relación interna Puede construirse un índice exclusivamente para el calculo de la reunión.
Para cada tupla tr de la relación externa r, se utiliza el índice para buscar tuplas en
s que cumplan la condición de reunión con la tupla tr.
En el peor de los casos solo hay espacio en la memoria intermedia para una
página de r y una página del índice. Para cada tupla de r, se realiza una búsqueda en el índice de s.
Costo de la reunión: br + nr c
Donde c es el costo de una única selección en s utilizando la condición de la reunión.
Ya se vio como estimar el coste del algoritmo de una única selección cuyo calculo es proporcional a c .
Si hay índices disponibles en ambas relaciones r y s, normalmente es mas
Ejemplo en el costo de una Reunión en bucle anidado
Ejemplo en el costo de una Reunión en bucle anidado
indexado
indexado
Evaluar impositor cliente, con impositor como la relación externa.
Si cliente tiene un índice primario de árbol B+ en el atributo de la
reunión nombre_cliente, que contiene 20 entradas en promedio por cada nodo del índice.
Suponga que cliente tiene 10000 tuplas, la atura del árbol es 4, y será
necesario un acceso más para encontrar el dato real.
impositor tiene 5000 tuplas
El costo total para una reunión en bucle anidado por bloques:
400*100 + 100 = 40,100 accesos a bloques
Asumiendo el peor caso de la memoria
Puede ser significativamente menor cuando hay mas memoria
Costo para una reunión en bucle anidado indexado
Reunión por mezcla
Reunión por mezcla
1. Ordenar ambas relaciones en el atributo de la reunión (Si aun no estan
ordenadas en el atributo de la reunión).
2. Mezclar las relaciones ordenadas para la reunión de ellos.
1. Su reunión se puede calcular mediante un proceso muy parecido a la
etapa de mezcla del algoritmo de ordenación-mezcla.
2. La principal diferencia es el manejo de valores duplicados en el atributo
Reunión por mezcla (Cont.)
Reunión por mezcla (Cont.)
Cada bloque tiene que ser leído sólo una vez ()
Dado que las relaciones están ordenadas, las tuplas con el mismo valor
Reunión por asociación
Reunión por asociación
Utilizado para equirreuniones y reuniones naturales.
Se utiliza una función de asociación h para dividir las tuplas de ambas
relaciones
H es una función de asociación que asigna a los AtribsReunion los
valores {0, 1, ..., n}, donde AtribsReunion denotan los atributos comunes de r y s utilizados en la reunión natural.
Hr0, Hr1, . . ., Hrnh denotan las particiones de las tuplas de r,
inicialmente todas vacías. Cada tupla tr r se pone en la partición
Hri donde i = h(tr[AtribsReunion]).
Hs0,, Hs1. . ., Hsnh denota las particiones de las tuplas de s,
inicialmente todas vacías. Cada tupla ts s se pone en la partición
si, donde i = h(ts[AtribsReunion]).
La función de asociación h debería de tener las “buenas” propiedades
Reunión por asociación
Reunión por asociación
Reunión por asociación
(Cont.)
(Cont.)
Supóngase que una tupla de r y una tupla de s satisfacen la condición de la
reunión; por tanto, tendrán el mismo valor en los atributos de la reunión. Si el valor se asocia con algún valor i, la tupla de r tiene que estar en Hri y la tupla de s en Hsi. De este modo solamente es necesario comparar las tuplas de r en Hri con las tuplas de s en Hsi; no es necesario compararlas con las tuplas de s de otra partición.
El coste estimado para una reunión por asociación es:
3(br + bs) + 2nh
Reunión por Asociación Híbrida: Se aplica en el caso de que la memoria sea grande pero que ninguna de las relaciones pueda caber en memoria.
La idea es mantener las primeras particiones de la relación interna en memoria sin escribirlas a disco.
Algoritmos de Join con operaciones complejas
Algoritmos de Join con operaciones complejas
Condición Conjuntiva:
r join 1 2... n s
Se aplica uno de los algoritmos de bucles anidados, ó
Computar el resultado para una condición r join i s
Sobre el resultado se seleccionan las filas que cumplen con las
demás condiciones
1 . . . i –1 i +1 . . . n
Condición disyuntiva:
r join1 2 ... ns
Se aplica uno de los algoritmos de bucles anidados, ó
Calcular cada operación individualmente y unir los resultados:
Join Externos
Join Externos
Se calculan:
Realizando una operación de Join interno con los algoritmos descritos y
luego agregando las filas no reunidas de una o ambas relaciones complementadas con valores nulos.
Modificando los algoritmos de Join interno.
Para el join por mezcla, r left outer join s puede calcularse como:
1. Caculando r join s y unir su resultado al resultado de la operación
∏R (r join s) – r complementadas con valores nulos, ó
2. Modificando el algoritmo de reunión por mezcla: Durante la mezcla para las filas de r no reunidas añadirlas al resultado complementadas con valores nulos.
Para el join por asociación, r left outer join s puede calcularse como:
1. Si r es la relación de prueba, añadirla al resultado sus filas complementadas al no encontrarse filas de s concordantes a través del índice de la partición. 2. Si r es la relación de construcción, se marca las entradas del índice no
Otras operaciones
Otras operaciones
Eliminación de duplicados puede ser implementado vía ordenación o asociación.
Las tuplas idénticas aparecerán consecutivas durante la ordenación,
pudiéndose eliminar todas las copias menos una.
Optimización: Con la ordenación-mezcla externa, se pueden eliminar los
duplicados mientras se crea una secuencia antes de que ésta se escriba en el disco, reduciendo así el número de bloques transferidos. El resto de
duplicados se pueden suprimir durante la etapa de reunión/mezcla, así que el resultado final estará libre de repeticiones
Similar a la reunión por asociación – los duplicados estarán en los mismos
cajones. Proyección:
Se realiza la proyección en cada tupla
Otras operaciones : Agregación
Otras operaciones : Agregación
Agregación puede ser implementado de manera similar a la
eliminación de duplicados.
Ordenación o Asociación puede ser usado para llevar las tuplas a
un mismo grupo, y luego aplicar la función de agregación a cada grupo.
El coste estimado para la implementación de la operación
Otras operaciones : Operación sobre conjuntos
Otras operaciones : Operación sobre conjuntos
Operación sobre conjuntos (, y ): puede utilizarse variantes de
reunión por mezcla después la ordenación, o la variante de la reunión por asociación.
Eejmplo, Operación de conjuntos usando reunión por asociación :
1. Particionar ambas relaciones utilizando la misma función hash 2. Procesar cada partición i como sigue:
r s:
1. Construir un índice asociativo en memoria sobre Hri.
2. Añadir las tuplas de Hsi, al índice asociativo solamente si no estaban ya presentes.
3. Añadir las tuplas del índice asociativo al resultado.
r s:
1. Construir un índice asociativo en memoria Hri
2. Para cada tupla en Hsi, probar el índice asociativo y pasar la tupla al resultado únicamente si ya estaba presente en el índice.
r – s:
1. Construir un índice asociativo en memoria en Hri
2. Para cada tupla de Hsi probar el índice asociativo y, si la tupla está presente en el índice, suprimiendo del índice asociativo.
Evaluación de expresiones
Evaluación de expresiones
Hasta aquí se ha estudiado cómo llevar a cabo operaciones
relacionales individuales.
Ahora se considera cómo evaluar una expresión que contiene varias
operaciones.
La manera evidente de evaluar una expresión es simplemente evaluar
una operación a la vez en un orden apropiado.
El resultado de cada evaluación se materializa en una relación
temporal para su inmediata utilización. Un inconveniente de esta
aproximación es la necesidad de construir relaciones temporales, que (a menos que sean pequeñas) se tienen que escribir en disco. Un enfoque alternativo es evaluar varias operaciones de manera
Materialización
Materialización
Evaluación materializada: evaluar una operación a la vez,
comenzando en el nivel más bajo. Utilizar los resultados intermedios materializado en las relaciones temporales para evaluar el próximo nivel de operaciones.
Ejemplo, en base a la figura, se calcula y se almacena la operación
Luego se calcula la reunión de la operación almacenada con la
relación customer, y finalmente calcular la proyección sobre
customer-name.
)
(
2500
account
balance
Materialización
Materialización
(Cont.)
(Cont.)
El coste de una evaluación materializada no es simplemente la suma
de los costes de las operaciones involucradas. Cuando se calcularon los costes estimados de los algoritmos se ignoró el coste de escribir el resultado de la operación en disco. Para calcular el coste de evaluar una expresión como la que se ha hecho hay que añadir los costes de todas las operaciones, incluyendo el coste de escribir los resultados intermedios en disco.
La memoria intermedia doble (usando dos memorias intermedias,
una donde progresa la ejecución del algoritmo mientras que la otra se está copiando) permite que el algoritmo se ejecute más rápidamente mediante la ejecución en paralelo de acciones en la CPU con
Encausamiento
Encausamiento
Evaluación encausada: Evalúa varias operaciones simultáneamente,
pasando los resultados de una operación a la siguiente.
Ejemplo, en el árbol de expresión previo, no se almacena el resultado de
la operación
En cambio, pasa tuplas directamente a la reunión.. Similarmente, no
almacena el resultado de la reunión, pasa las tuplas directamente a la proyección.
Mucho más barato que la materialización: no es necesario guardar una
relación temporal en el disco.
El encausamiento no siempre puede ser posible– Ejemplo, Ordenación y
Reunión por asociación.
)
(
2500
account
balance