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

Indeks PostgreSQL nie jest używany do zapytań o zakresy IP

Wypróbuj indeks wielokolumnowy, ale z odwróconą kolejnością w drugiej kolumnie:

CREATE INDEX index_ips_begin_end_ip_num ON ips (begin_ip_num, end_ip_num DESC);

Porządkowanie jest w większości przypadków nieistotne dla indeksu jednokolumnowego, ponieważ można go skanować wstecz prawie tak samo szybko. Ale jest to ważne w przypadku indeksów wielokolumnowych.

Za pomocą proponowanego przeze mnie indeksu Postgres może zeskanować pierwszą kolumnę i znaleźć adres, pod którym reszta indeksu spełnia pierwszy warunek. Następnie może, dla każdej wartości z pierwszej kolumny, zwrócić wszystkie wiersze spełniające drugi warunek, dopóki pierwszy nie zawiedzie. Następnie przejdź do następnej wartości w pierwszej kolumnie itd.
To jest nadal niezbyt wydajne Postgres może być szybszy, po prostu skanując pierwszą kolumnę indeksu i filtrując drugą. Bardzo wiele zależy od dystrybucji danych.

Tak czy inaczej, CLUSTER używając wielokolumnowego indeksu z góry może pomoc wydajność:

CLUSTER ips USING index_ips_begin_end_ip_num

W ten sposób kandydaci spełniający Twój pierwszy warunek są umieszczani na tych samych lub sąsiadujących stronach danych. Może znacznie zwiększyć wydajność, jeśli masz wiele wierszy na wartość w pierwszej kolumnie. W przeciwnym razie jest to mało skuteczne.
(Istnieją również nieblokujące narzędzia zewnętrzne do tego celu:pg_repack lub pg_squeeze.)

Ponadto, czy autovacuum działa i jest poprawnie skonfigurowane, czy też uruchomiono ANALYZE? na stole? Potrzebujesz aktualnych statystyk, aby Postgres mógł wybrać odpowiednie plany zapytań.

To, co naprawdę by tu pomocne, to indeks GiST dla int8range kolumna, dostępna od PostgreSQL 9.2.

Dalsza lektura:

  • Optymalizacja zapytań w zakresie sygnatur czasowych (dwie kolumny)

Jeśli Twoje zakresy adresów IP mogą być pokryte jednym z wbudowanych typów sieci inet lub cidr , rozważ zastąpienie dwóch bigint kolumny. Albo jeszcze lepiej spójrz na dodatkowy moduł ip4r autorstwa Andrew Giertha (nie w standardowej dystrybucji. Strategia indeksowania zmienia się odpowiednio.

Poza tym możesz sprawdzić powiązaną odpowiedź na dba.SE, korzystając z wyrafinowanego systemu z częściowymi indeksami. Zaawansowane rzeczy, ale zapewniają doskonałą wydajność:

  • Czy indeks przestrzenny może pomóc w zapytaniu typu „zakres – sortuj według – limit”


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak pracować z PGpoint dla Geolokalizacji przy użyciu PostgreSQL?

  2. Jak wdrożyć system LMS kanwy o wysokiej dostępności za pomocą klastra bazy danych PostgreSQL

  3. BŁĄD:nie można statystycznie pliku XX.csv:nieznany błąd

  4. Używanie jsonb_set() do aktualizacji określonej wartości tablicy jsonb

  5. Konfiguracje wielu centrów danych z PostgreSQL