W bazie danych są następujące tabele: Wojewodztwo(nr, nazwa, stolica)
, Gmina(nr, nazwa, liczba_mieszkancow, rodzaj, nr_wojewodztwa)
. W takiej bazie danych ma zostać wykonane następujące zapytanie:
SELECT G.nazwa, (SELECT nazwa FROM Wojewodztwo WHERE nr = G.nr_wojewodztwa) nazwa_woj
FROM Gmina G
WHERE G.rodzaj = ‘wiejska’ AND
G.liczba_mieszkancow > (SELECT AVG(liczba_mieszkancow)
FROM Gmina G1
WHERE G1.nr_wojewodztwa = G.nr_wojewodztwa)
ORDER BY nazwa_woj, nazwa;
Zaproponuj jak najlepszy plan realizacji tego zapytania i oszacuj sumaryczną liczbę przeczytanych i zapisanych bloków, biorąc pod uwagę następujące założenia:
Wojewodztwo
albo rekordów tabeli Gmina
;Wojewodztwo
jest rekordów, a w tabeli Gmina
rekordów;Tabelę województw możemy zmieścić w jednym bloku pamięci. Sortujemy ją po nazwach. Teraz możemy posortować gminy po nazwach województw i nazwach gmin. Gminy zajmują bloków, więc potrzebujemy dwóch etapów. Możemy do tego użyć as few as bloków, bo już , mamy więc mnóstwo wolnej pamięci.
Przy pierwszym odczycie dojoinowujemy nazwy województw, co jest darmowe, bo mamy je już w pamięci. Możemy też w bloku obok od razu liczyć sobie średnią mieszkańców dla każdego województwa (akumulować sumę mieszkańców i liczbę gmin). Przy końcowym etapie mamy więc posortowane gminy i blok z średnimi liczbami mieszkańców dla każdego województwa. Możemy łatwo przeprowadzić selekcję po rodzaju przy pierwszym etapie sorta, a porównanie z średnią przy ostatnim kroku sortowania. Wynik sortowania od razu zapisujemy jako output.
Koszt to przeczytanie tabeli województw i dwuetapowy sort na gminach, czyli I/O.