Powolna perspektywa przy dolaczeniu JOIN

0

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?

2
poniatowski napisał(a):

O czym zapominam tutaj?

O indeksach?
Jak duże tabele łączysz?

0

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.

1

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

0

Pokaza zapytanie i definicje widoku i jaki zakładasz warunek na załączeniu

0

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.

3

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

0

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.

2

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;

?

1

A masz jakiś plan dla tego zapytania? Najlepiej na Depesz Explainer.

1 użytkowników online, w tym zalogowanych: 0, gości: 1