Top- join queries

Fino ad ora si sono prese in considerazione query top- con una sola relazione , tuttavia e necessario considerare anche query della forma come segue:

SELECT <some attributes>
FROM R1,R2,…,Rn
WHERE <join and local conditions>
ORDER BY S(p1,p2,…pm)
STOP AFTER k

In realtà queste sono una generalizzazione del caso a singola relazione in cui la Relazione e spezzata in relazioni virtuali divise

SELECT *
FROM USEDCARS UC1, USEDCARS UC2, USEDCARS UC3
WHERE UC1.CarID = UC2.CarID
AND UC2.CarID = UC3.CarID
ORDER BY (UC1.Price + UC2.Mileage)/(UC3.Year-1970)
STOP AFTER 2

in questo caso i join sono tutti 1-1

Caso di studio per le top- 1-1 join queries

Il caso di studio che ha portato alla realizzazione delle prima soluzione per questa casistica e stato quello in cui le partizioni di non sono virtuali (database partizionato) detto anche il middleware scenario, definito come segue

  • si ha un set di sorgenti di dati
  • la query coinvolge due o più di queste sorgenti
  • il risultato si ottiene integrando in qualche modo i risultati parziali delle singole interrogazioni

per esempio la query

SELECT * FROM MyCars
WHERE Price < 15000
AND FuelConsumption < 7

Viene risolta per mezzo del seguente sistema

flowchart TD
A[(Mediator)]
B[wrapper]
C[wrapper]
D[(source 1)]
E[(source 2)]
A -- "select * from MyCars where Price < 15000"--> B
A --"select * from MyCars where FuelConsumption < 7"--> C
B --> D
C --> E

il caso del middleware scenario non e diverso dal caso delle top- join 1-1 query, con la differenza che nel caso delle query gli input sono locali, tuttavia le logiche algoritmiche sono le stesse :)

input di query top-: assunzioni

  • Si da per certo che le sorgenti dati (nel caso locale le relazioni) supportino un accesso ordinato per il parametro di ranking parziale
  • inoltre gli oggetti sono identificati in maniera globale fra le sorgenti dati per mezzo della OID
  • tutte le sorgenti hanno lo stesso set di oggetti

Scoring functions

Alcune scelte comuni di scoring function sono:

  • SUM(AVG)
  • WSUM(Weighted sum)
  • MIN(Minimum)
  • MAX(Maximum)

Algoritmo

in caso di funzione di scoring MAX la query e risolvibile per mezzo dell’algoritmo , l’idea di base e quella di recuperare i primi migliori risultati parziali da ogni sorgente (ogni accesso e detto round) e computare il risultato senza effettuare accessi random

Input: ranked lists Lj (j=1,…,m), integer k  1
Output: the top-k objects according to the MAX scoring function
# B is a main-memory buffer
B = []
for j in range(1,m):
	
	# the set of objects "seen" on Lj
	Obj[j] = {}
	
	for i in range(1,k):
		# get the best k objects from each list
		t = getNextLj();
		Obj[j].append(t.OID)
		if t.OID not in B:
			# adds t to the buffer
			B.append(t)
		else: 
			# join t with the entry in B having the same OID;
# for each object with at least one partial score compute MAX using the available scores
for object in Obj:
	MAX(object) 
return #the k objects with maximum score

Numero minimo di round

E possibile fermare l’algoritmo prima di effettuare round a patto che sia verificata la seguente condizione

un algoritmo per top- 1-1 join queries che usa la funzione MAX come scoring function può essere stoppato se

Migliorando B0: MaxOptimal

Il teorema di cui sopra si può applicare seguendo un principio simile a quello visto per KNNOptimal dove ad ogni step si effettua un accesso ordinato sulla lista dove e massimo (la più promettente)

Perche B0 non funziona con altre scoring function

non funziona con funzioni diverse dalla funzione MAX perche al termine degli accessi sequenziali non vi e nessun limite inferiore al valore della scoring function, di conseguenza un oggetto che non e stato rilevato da un accesso sequenziale puo essere il match migliore

esempio con la funzione MIN

Algoritmo FA

L’algoritmo FA sfrutta la proprietà di monotonicita della funzione di scoring per recuperare i best match, data la definizione di funzione di scoring monotona come segue

L’algoritmo recupera i primi score parziali dalle liste e per ogni oggetto con uno score parziale esegue un accesso random per recuperare gli altri, per ogni oggetto computa e restituisce i record con lo score massimo

Problematiche dell’algoritmo FA

L’algoritmo risulta computazionalmente esoso in quanto non viene sfruttata la funzione di scoring per ridurre lo spazio di ricerca, e non vengono anticipati i random access

Algoritmo TA

L’algoritmo TA e un miglioramento dell’Algoritmo FA, basato su threshold, in particolare

  • esegue in maniera combinata accessi ordinati e random
  • si ferma al raggiungimento di una threshold T che e un upper bound per gli oggetti non ancora visti
# Input: ranked lists Lj (j=1,…,m), integer k  1, monotone scoring function S
# Output: the top-k objects according to S
for i in range(1,k):
	Res[i] := [null,0]
	for j in range(1,m):
		pj := 1
		while Res[k].score < T := S(p1,p2,…,pm):
			for j in range(1,m):
				t := getNextLj()
				o := t.OID
# perform random accesses to retrieve the missing partial scores for o
				if S(o) := S(p1(o),…,pm(o)) > Res[k].score then:
					# {remove the object in Res[k]; insert [o,S(o)] in Res}
# return Res

L’algoritmo scandisce le liste fino a che la funzione di costo computata sui valori letti non e inferiore dello score dell’ultimo elemento del risultato (che e il peggiore risultato corretto)

Performance di TA

Per computare correttamente le performance di TA si considerano i costi di comunicazione con il client secondo la seguente funzione di costo:

che considera costi di accessi sequenziali e randomici, i parametri rappresentano il costo di singole letture sequenziali e ordinate, questi possono essere molto diversi a seconda degli scenari,

  • in caso di risorse web tipicamente si ha che
  • ma sono possibili risorse in cui non e possibile eseguire letture sequenziali

TA risulta essere instance optimal secondo la seguente definizione

data una classe di algoritmi e una classe di input un algoritmo e instance optimal rispetto a e se e vero che per qualunque e si ha

dato il modello di costo di cui sopra nel caso in cui ovvero il caso reale si ha che il costo di TA che si arresta al passo e:

Assumendo il caso peggiore in cui per ogni oggetto visto sia necessario effettuare il massimo numero di accessi random, il ratio di ottimalita risulta essere

Che in caso di costi randomici alti puo diventare proibitivo

Algoritmo NRA

L’algoritmo NRA e pensato per quando non e possibile effettuare accessi randomici, restituisce comunque le risposte corrette ma i punteggi di score potrebbero essere errati

L’idea e quella di mantenere per ogni oggetto visto per mezzo della scansione sequenziale un lower e upper bound per la funzione di costo

  • computato ponendo a 0 (o al minimo valore possibile) tutti gli score parziali di non visti per mezzo della scansione sequenziale
  • computato ponendo (il minimo dei valori visti per quella lista) tutti gli score parziali di non visti per mezzo della scansione sequenziale

Gli elementi trovati vengono mantenuti in una lista ordinati per valori di lowerbound

L’algoritmo termina quando le prime posizioni di contengono i valori migliori ovvero

Ovvero tutti i valori visti non in res hanno un valore massimo di minore di quelli nel risultato

Ottenere le score corrette: NRA*

In caso siano necessari i valori di scoring e sufficiente estendere NRA eseguendo tante scansioni sequenziali fino a che tutti gli oggetti non vengono trovati

il costo e al piu uguale a Algoritmo FA

Algoritmo CA

L’idea dietro all’algoritmo CA e quella di ridurre il costo degli accessi randomici eseguendo le letture ogni rounds, per il resto l’algoritmo si comporta come NRA.

, MaxOptimal, FA, TA, NRA, NRA*, CA al confronto

Algoritmoscoring function applicabiliaccesso ai datinote
MAXordinatoinstance optimal
MaxOptimalMAXordinatoinstance optimal
FAmonotoneordinato e randomicocosto indipendente da
TAmonotoneordinato e randomicoinstance optimal
NRAmonotoneordinatoinstance optimal,wrong scores
NRA*monotoneordinatoinstance optimal, exact scores
CAmonotoneordinato e randomicoinstance optimal ratio di ottimalita indipendente da in alcuni casi

Ma in caso di join M-N?

Gli algoritmi visti fino ad ora sono applicabili se i join sono 1-1, nel caso seguente

SELECT *
FROM RESTAURANTS R, HOTELS H
WHERE R.City = H.City
AND R.Nation = 'Italy'
AND H.Nation = 'Italy'
ORDER BY R.Price + H.Price
STOP AFTER 2

i join non sono più sulle PK delle relazioni

Caso semplice: Indici !

Se si dispone di indici per ogni attributo di join l’algoritmo risulta simile a quello TA, sfruttando gli indici per gli accessi randomici

Caso difficile: non sono concessi accessi randomici

In questo caso e necessario adoperare solo per letture sequenziali (sulla linea di quanto visto per NRA*)

Rank-join

si computa una threshold definita come

dove e definito come il primo valore visto in

per far si che il rank join sia instance optimal e necessario che le relazioni siano al massimo 2 e che ci sia solo uno score parziale per input

PREVIOUS NEXT