PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Postgresql 9.x:Indeks do optymalizacji zapytań `xpath_exists` (XMLEXISTS)

Parametry kosztów Planera

To mówi mi, że Twój random_page_cost i seq_page_cost prawdopodobnie się mylą. Prawdopodobnie korzystasz z pamięci masowej z szybkimi losowymi operacjami we/wy — albo dlatego, że większość bazy danych jest buforowana w pamięci RAM, albo dlatego, że używasz dysku SSD, SAN z pamięcią podręczną lub innej pamięci masowej, w której losowe operacje we/wy są z natury szybkie.

Wypróbuj:

SET random_page_cost = 1;
SET seq_page_cost = 1.1;

aby znacznie zmniejszyć różnice parametrów kosztów, a następnie ponownie uruchomić. Jeśli to wystarczy, rozważ zmianę tych parametrów w postgresql.conf. .

Twoje szacunki dotyczące liczby wierszy są rozsądne, więc nie wygląda to na problem z błędną oceną planisty lub problem ze złymi statystykami tabeli.

Nieprawidłowe zapytanie

Twoje zapytanie jest również nieprawidłowe. OFFSET 0 LIMIT 1 bez ORDER BY da nieprzewidywalne wyniki, chyba że masz gwarancję dokładnie jednego dopasowania, w którym to przypadku OFFSET ... LIMIT ... klauzule są niepotrzebne i można je całkowicie usunąć.

Zwykle dużo lepiej jest formułować takie zapytania jak SELECT max(...) lub SELECT min(...) tam, gdzie to możliwe; PostgreSQL będzie miał tendencję do używania indeksu, aby po prostu wybrać żądaną wartość bez wykonywania kosztownego skanowania tabeli lub skanowania indeksu i sortowania.

Wskazówki

BTW, w przypadku przyszłych pytań wiki PostgreSQL zawiera dobre informacje w kategorii wydajności oraz przewodnik dotyczący zadawania Pytań dotyczących powolnych zapytań .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Maksymalna liczba znaków w etykietach (nazwy tabel, kolumny itp.)

  2. plpgsql:wywołanie funkcji z 2 parametrami OUT

  3. 7 sposobów na znalezienie zduplikowanych wierszy w PostgreSQL, ignorując klucz podstawowy

  4. prawidłowy UUID nie jest prawidłowym UUID

  5. Czy PostgreSQL używa tf-idf?