Witam!
Mam perspektywe, ktora przy dodaniu JOIN
mega zwalnia. Probowalem to samo osiagnac z CTE i lateral i za kazdym razem jest mega wolna. Czy jest jakis sposob na wole perspektywy przy uzyciu JOIN
? O czym zapominam tutaj?
Witam!
Mam perspektywe, ktora przy dodaniu JOIN
mega zwalnia. Probowalem to samo osiagnac z CTE i lateral i za kazdym razem jest mega wolna. Czy jest jakis sposob na wole perspektywy przy uzyciu JOIN
? O czym zapominam tutaj?
poniatowski napisał(a):
O czym zapominam tutaj?
O indeksach?
Jak duże tabele łączysz?
Samo zapytanie jest male. Zwraca 70 rekordow i jest mega szybkie. Ale przy dolaczeniu z view od razu calosc mieli sie z 2 minuty. Index'ow chyba nie moge zalozyc na view.
Index'ow chyba nie moge zalozyc na view.
Na widok indeksów nie założysz, ale na to z czego budowyny jest widok już tak. Jak bardzo skomplikowany jest ten widok?
Update, musisz pamiętać że w większości wypadków widok to tylko nazwany select. Więc teoretycznie jest to tak, jakbyś doklejał ten select do swojego selecta
Pokaza zapytanie i definicje widoku i jaki zakładasz warunek na załączeniu
Jak wyżej, załóż indeks na polu w drugiej tabeli, na którym łączysz. Jeśli rekordów po lewej stronie jest 70 to z indeksem powinno wyciągnąć pozostałe w ułamku sekundy.
Jeśli masz dobrze przemyślaną i zaprojektowaną bazę, to powinieneś łączyć po kluczach ew. polach indeksowanych. A nie, że do jakiegoś VIEW specjalnie zakładasz indeks, bo wolno działa.
I jeszcze co wolno działa? Pobranie, wyśiwetlanie? Może dałeś z JOINowanej tabeli *, to wtedy potrafi zamulić (ale wyświetlanie).
Pokaż DDL tabel + VIEW + EXPLAIN ANALYZE
Samo zapytanie wyglada mniej wiecej tak. Nic nadzwyczajnego:
WITH events AS (
SELECT c.id AS company_id,
c.name AS company,
e.id AS event_id,
e.name AS event
FROM event e
JOIN company c
ON c.id = e.id
WHERE e.to BETWEEN (NOW()::DATE - EXTRACT(DOW FROM NOW())::INTEGER - 6 || ' 00:00:00')::TIMESTAMP
AND (NOW()::DATE - EXTRACT(DOW FROM NOW())::INTEGER || ' 23:59:59')::TIMESTAMP
)
SELECT SUM(o.value),
e.company,
e.event
FROM orders o
JOIN events e
ON o.company_id = e.company_id
AND o.event_id = e.event_id
GROUP BY o.event_id,
e.company,
e.event;
Samo zapytanie w CTE wykonuje sie bardzo szybko. Zwraca tam kilka rekordow i to wszystko. Ale z polaczeniem z perspektywa mieli sie 2-3 minuty. Jak skopiowalem dane z zapytania z CTE i wkleilem do srodka CTE, usuwajac przy tym zapytanie to tak samo zapytanie wykonuje sie bardzo szybko. Ale razem sie gryznie.
a to:
SELECT
SUM(o.value),
c.name company,
e.name event
FROM
orders o
JOIN
events e
ON o.event_id = e.id
AND e.to BETWEEN (NOW()::DATE - EXTRACT(DOW FROM NOW())::INTEGER - 6 || ' 00:00:00')::TIMESTAMP
AND (NOW()::DATE - EXTRACT(DOW FROM NOW())::INTEGER || ' 23:59:59')::TIMESTAMP
JOIN company c
ON c.id = e.id
GROUP BY e.name, c.name;
?
A masz jakiś plan dla tego zapytania? Najlepiej na Depesz Explainer.