Czy w najnowszych wersjach PostgreSQL (od grudnia 2013 r.) Możemy udostępnić zapytanie między dwoma lub więcej rdzeniami, aby uzyskać wzrost wydajności? A może powinniśmy uzyskać szybsze rdzenie?
Czy w najnowszych wersjach PostgreSQL (od grudnia 2013 r.) Możemy udostępnić zapytanie między dwoma lub więcej rdzeniami, aby uzyskać wzrost wydajności? A może powinniśmy uzyskać szybsze rdzenie?
Nie, dla wersji PostgreSQL wcześniejszych niż v9.6. Zobacz FAQ PostgreSQL : W jaki sposób PostgreSQL wykorzystuje zasoby procesora?
Serwer PostgreSQL jest oparty na procesach (bez wątków). Każda sesja bazy danych łączy się z jednym procesem systemu operacyjnego PostgreSQL . System operacyjny automatycznie rozdziela wiele sesji na wszystkie dostępne procesory. System operacyjny używa również procesorów do obsługi operacji we / wy dysku i wykonywania innych zadań poza bazą danych. Aplikacje klienckie mogą używać wątków, z których każdy łączy się z osobnym procesem bazy danych.
Od wersji 9.6 części niektórych zapytań można uruchamiać równolegle, w osobnych procesach systemu operacyjnego, co pozwala na użycie wielu rdzeni procesora. Równoległe zapytania są domyślnie włączone w wersji 10 (max_parallel_workers_per_gather), z dodatkową równoległością oczekiwaną w przyszłych wydaniach.
Począwszy od wersji PostgreSQL 9.6+ , zaczęło się pojawiać zapytanie równoległe w PostgreSQL.
Na przykład, koncepcje takie jak Parallel Scan / Parallel Join / Parallel Aggregates są już wypiekane, a wkrótce więcej.
Naprawdę ekscytujące jest to, że istnieją raporty potwierdzające near-linear speed-up
w niektórych przypadkach, co jest dość imponujące!
Nie, ale istnieje obejście tego problemu. :)
Znalazłem funkcję parsel (wybór równoległy) plpgsql, która dzieli zapytanie na podstawie klucza podstawowego, a następnie łączy się z bazą danych przez rozszerzenie dblink i czeka na wszystkie podzapytania.
https://gist.github.com/mjgleaso/8031067
Autor napisał również artykuł o tej funkcji: http://geeohspatial.blogspot.com/2013/12/a-simple-function-for-parallel-queries_18.html
Nie. Każde połączenie tworzy osobny proces na serwerze.
Możesz „naśladować” pewną równoległość za pomocą wątkowego języka proceduralnego, takiego jak pljava. Utwórz procedurę Java (funkcję), która uruchamia kilka wątków i utwórz wynik wyjściowy przy użyciu kilku pracowników. Backend jest synchronizowany, dzięki czemu każdy proces roboczy może aktualizować dane wyjściowe asynchronicznie.
Java ma dobre wsparcie dla koordynacji / współpracy wątków.
Na przykład byłoby to przydatne w przypadku operacji intensywnie wykorzystujących procesor lub operacji na długości sieci.