PostgreSQL rozmiar procesu

0

Witam,
od pewnego czasu prowadzimy w firmie radosną developerke systemu który korzysta z bazy PostgreSQL. Jednak niepokoją nas pewne aspekty...może ich po prostu nie rozumiemy. Testujemy system na obciązeniu 30 zapytań na sekunde. Oto nasze obserwacje

  1. Dla prostych zapytań max 5 joinów. Ilość procesów wynosi około 5 a waga każdego około 30MB. CPU ~0,5%
  2. Dla skomplikowanych zapytań conajmniej 50 joinów ..ilość procesów wynosi ponad 100 a waga każdego około 200 MB co zajmuje w sumie 20GB!!!!. CPU ~30%

Punkt 2 jest lekko przerażający...czy rzeczywiście postgres tak "wpierdziela pamięć"....jakie są wasze doświadczenia

0

To ile proces zajmuje wynika też z tego jak ułożone jest zapytanie i ile jest danych w bazie. Przecież "join" to nie jest jakaś magia, tylko z punktu widzenia Bazy to są dwie pętle "for" które sklejają rekordy wynikowe. Jak nie masz tam indeksów to robi ci sie full scan tych tablic, jeśli masz indeksy to sklejanie i filtracja odbywa się na indeksach a potem dopiero wybiera się z bazy co potrzebne. 50 joinów oznacza oczywiście że takich wielokrotnych "for"ów jest bardzo dużo. Spore znaczenie ma też ich kolejność, tzn czy lącząc parę tabel pierwsza jest większa czy mniejsza. Normalnie w prostym przypadku Optymalizator Kosztowy sam by ogarnął co złączać jako pierwsze, ale jak masz 50 tabel to może sobie z tym nie radzić.
Odpal sobie plan zapytania i zobacz co sie tam dzieje "pod spodem". Zgaduje że cała masa "full table scan" i złączanie w złej kolejności.

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