Zaawansowane Bazy Danych

Zadanie z partycjonowania

  • Wygeneruj około 1GB danych zawierających:

    • osoby (data, waga)

    • kontakty z telewizją (data, kanał, minuta_od, minuta_do)

    • spoty reklamowe (data, kanał, minuta)

Przeanalizuj czas generowania zapytań:

  • dla każdego ze spotów suma wag osób oglądających ten spot (jeden spot to jeden wiersz) z określonego przedziału czasowego

  • dla każdego z dni suma wag osób oglądających spoty (jeśli jedna osoba oglądała wiele spotów, to wagi sumujemy, jeden dzień to jeden wiersz) z określonego przedziału czasowego

  • dla każdej pary (dzień, kanał) suma wag osób oglądających ten spot (jedna para dzień, kanał to jeden wiersz) z określonego przedziału czasowego

w zależności od zastosowanych zapytań, indeksów i długości przedziałów.

shared_buffers - powinno być ustawione na niską wartość (np. 32MB)

Wyjaśnienie do treści (mam nadzieję, że się nie pomyliłem, z ręki piszę) uwaga: to nie jest najlepszy sposób zadawania tego zapytania.


SELECT SPOT.*, SUM(weight) FROM SPOT

LEFT JOIN CONTACT ON SPOT.DATE = CONTACT.DATE

AND SPOT.CHANNEL = CONTACT.CHANNEL

AND SPOT.MINUTE BETWEEN CONTACT.MINUTE_FROM AND CONTACT.MINUTE_TO

JOIN PERSON ON CONTACT.PERSON_ID = PERSON.ID

WHERE SPOT.DATE BETWEEN '2019-01-01' AND '2019-01-03';


SELECT SPOT.DATE, SUM(weight) FROM SPOT

LEFT JOIN CONTACT ON SPOT.DATE = CONTACT.DATE

AND SPOT.CHANNEL = CONTACT.CHANNEL

AND SPOT.MINUTE BETWEEN CONTACT.MINUTE_FROM AND CONTACT.MINUTE_TO

JOIN PERSON ON CONTACT.PERSON_ID = PERSON.ID

WHERE SPOT.DATE BETWEEN '2019-01-01' AND '2019-01-03'

GROUP BY SPOT.DATE;


SELECT SPOT.DATE, SPOT.CHANNEL, SUM(weight) FROM SPOT

LEFT JOIN CONTACT ON SPOT.DATE = CONTACT.DATE

AND SPOT.CHANNEL = CONTACT.CHANNEL

AND SPOT.MINUTE BETWEEN CONTACT.MINUTE_FROM AND CONTACT.MINUTE_TO

JOIN PERSON ON CONTACT.PERSON_ID = PERSON.ID

WHERE SPOT.DATE BETWEEN '2019-01-01' AND '2019-01-03'

GROUP BY SPOT.DATE, SPOT.CHANNEL;