Mam dwa identyczne serwery (pod względem sprzętowym), oba są standardowymi instalacjami Windows Server 2008 R2 z minimalnym zainstalowanym oprogramowaniem (w zasadzie mój kod i wymagane rzeczy, takie jak JVM itp.).
Na jednym serwerze działam na serwerze SQL 2005, na drugim serwerze postgresql 9.1. Różnica w wydajności między tymi dwoma serwerami jest oszałamiająca, jest tak zły na postgresql, że żałuję mojej początkowej wypowiedzi „użyjmy postgresql zamiast płacić za licencję serwera SQL” mojemu szefowi. Mówimy o różnicach 30 sekund vs 15 minut dla tego samego polecenia i nie jest to tylko jedno polecenie, to dowolne zapytanie lub polecenie, które na niego rzucam. Oba mają prawie takie same dane (rekordy zostały wstawione w innej kolejności), a obie bazy danych mają dokładnie taką samą strukturę / indeksy itp.
Ale mam nadzieję, że to tylko kwestia strojenia wydajności. Chodzi o to, że serwer sql używa prawie 32 koncertów pamięci RAM na serwerze, podczas gdy postgresl nie używa niczego, zdecydowanie mniej niż koncert, chociaż tak naprawdę tego nie rozgryzłem.
Jak uzyskać postgresql do korzystania z ponad 20 koncertów pamięci RAM? Serwery te zostały zbudowane specjalnie dla tego rodzaju bazy danych, więc moim zdaniem RAM nieużywany przez bazę danych i procesy wspierające.
źródło
SET effective_cache_size=18G;
(ustawienie domyślne jest bardzo niskie) BTW: zakładając, że jest to maszyna 64-bitowa (bez PTE)Odpowiedzi:
Istnieje wiele możliwych do dostosowania stałych, zainicjowanych przez
postgres.conf
. Najważniejsze z nich to:max_connections
: liczba jednoczesnych sesjiwork_mem
: maksymalna ilość pamięci do wykorzystania dla wyników pośrednich, takich jak tabele skrótów i do sortowaniashared_buffers
ilość pamięci poświęconej „przypiętej” przestrzeni buforowej.effective_cache_size
ilość pamięci przyjęta do użycia przez bufory LRU systemu operacyjnego.random_page_cost
: oszacowanie względnego kosztu poszukiwań dysku.max_connections
połączenia nie powinny być wyższe niż potrzebne, połączenia kosztują zasoby, nawet gdy są bezczynne; w większości przypadków połączenie spędziłoby więcej czasu czekając w środku niż czekając na zewnątrz. (w cenie współbieżności) Przyjemną formułą jest „liczba wrzecion + liczba procesorów + X”work_mem
jest trudne: można zastosować do każdego podzapytania, więc zapytanie z 5HASHJOINS
może kosztować 5 *work_mem
. W przypadku najgorszych scenariuszy powinieneś również pomyśleć o tym, że wiele sesji zużywa tę ilość (ponownie powód, aby utrzymać się namax_connections
niskim poziomie).shared_buffers
jest przereklamowany (IMHO). Zwykle zaleca się ustawienie jej na około 1/4 ... 1/2 całej dostępnej „wolnej” pamięci, ale zazwyczaj utrzymuję ją na niskim poziomie i ustawienieeffective_cache_size
całej dostępnej „wolnej” pamięci.random_page_cost
to koszt wyszukiwania + odczytu na dysku. Jest to wartość względnasequential_disk_cost
, która wynosi 1. Domyślna wartość (4) dlarandom_page_cost
jest ustawiona zbyt wysoko dla nowoczesnych maszyn i pamięci sieciowej, zwykle można ją obniżyć do wartości od 2 do 1.x. W przypadku dysków SSD ustawiono go nawet na 1,0, ponieważ wyszukiwanie jest prawie bezpłatne na dyskach SSD.źródło
work_mem
jest zalecana wartośćmax_connections
domyślna 100, a pamięć RAM serwera to 32 GB (dedykowany serwer Postgres)? Wiedziałem, że muszę go dostroić na podstawie codziennych zapytań. Zastanawiam się tylko, czy możesz mi powiedzieć, że wartość „jeden rozmiar pasuje do wszystkich odpowiedzi” (lub wartość punktu początkowego). Czy 50 MB jest za duże? Wielkie dzięki.Rozważ użycie pgtune, aby pomóc dostroić konfigurację PostgreSQL. Od PgFoundry:
Domyślna konfiguracja PostgreSQL jest bardzo konserwatywna i to narzędzie ma pomóc w tej dokładnej sytuacji. Dokumentacja jest łatwa do odczytania, a korzystanie z narzędzia jest dość proste.
Pamiętaj, że nie ma potrzeby korzystania z dokładnych sugestii pgtune. Grając z jego ustawieniami i obserwując wynikające z tego zmiany w pliku conf, uzyskasz lepsze zrozumienie konfiguracji PostgreSQL i sposobu ręcznej modyfikacji.
źródło
Jeśli każde zapytanie lub polecenie działa powoli, podejrzewam, że:
Czy możesz nam powiedzieć, ile czasu zajmuje uruchomienie zapytania
select version()
? Jeśli powinno być natychmiastowe (0,16 ms na mojej stacji roboczej).źródło
Jeśli KAŻDE zapytanie jest o wiele wolniejsze, coś jest strasznie nie tak z serwerem lub czymś innym. Z mojego doświadczenia wynika, że każda baza danych ma kilka rzeczy, w których jest lepsza od innych, ale pod względem wydajności pgsql jest z łatwością w tej samej dziedzinie co serwer mssql.
Więc na jakim systemie operacyjnym używasz pgsql? Jaki sprzęt? Jakie ustawienia już zmieniłeś? Jak duży jest twój zestaw danych? Jaki jest przykład złej kwerendy i wynik wyjaśnienia analizy (Uruchom kwerendę w następujący sposób:
wyjaśnij analizuj wybierz ... resztę zapytania tutaj ...;
Opublikuj wynik na http://explain.depesz.com/ i opublikuj link tutaj.
źródło