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;