Probeer een index met meerdere kolommen, maar met omgekeerde volgorde in de tweede kolom:
CREATE INDEX index_ips_begin_end_ip_num ON ips (begin_ip_num, end_ip_num DESC);
De volgorde is meestal niet relevant voor een index met één kolom, omdat deze bijna net zo snel achteruit kan worden gescand. Maar het is belangrijk voor indexen met meerdere kolommen.
Met de index die ik voorstel, kan Postgres de eerste kolom scannen en het adres vinden, waar de rest van de index aan de eerste voorwaarde voldoet. Dan kan het, voor elke waarde van de eerste kolom, alle rijen retourneren die aan de tweede voorwaarde voldoen, totdat de eerste faalt. Spring dan naar de volgende waarde van de eerste kolom, enz.
Dit is nog steeds niet erg efficiënt en Postgres is misschien sneller door de eerste indexkolom te scannen en op de tweede te filteren. Veel hangt af van uw gegevensdistributie.
Hoe dan ook, CLUSTER
met behulp van de index met meerdere kolommen van boven kan hulpprestaties:
CLUSTER ips USING index_ips_begin_end_ip_num
Op deze manier worden kandidaten die aan uw eerste voorwaarde voldoen, op dezelfde of aangrenzende gegevenspagina's verpakt. Kan de prestaties veel helpen als u veel rijen per waarde van de eerste kolom heeft. Anders is het nauwelijks effectief.
(Er zijn ook niet-blokkerende externe tools voor dit doel:pg_repack of pg_squeeze.)
Werkt autovacuum ook en is het correct geconfigureerd of heeft u ANALYZE
. uitgevoerd op de tafel? Je hebt actuele statistieken nodig voor Postgres om geschikte zoekplannen te kiezen.
Wat hier echt zou helpen, is een GiST-index voor een int8range
kolom, beschikbaar sinds PostgreSQL 9.2.
Verder lezen:
- Zoekopdrachten optimaliseren op een reeks tijdstempels (twee kolommen)
Als uw IP-bereiken kunnen worden afgedekt met een van de ingebouwde netwerktypen inet
of cidr
, overweeg om uw twee bigint
. te vervangen kolommen. Of, beter nog, kijk naar de extra module ip4r door Andrew Gierth (niet in de standaarddistributie. De indexeringsstrategie verandert dienovereenkomstig.
Behalve dat, kunt u dit gerelateerde antwoord bekijken op dba.SE met behulp van een geavanceerd regime met gedeeltelijke indexen. Geavanceerde dingen, maar het levert geweldige prestaties:
- Kan ruimtelijke index een "bereik - volgorde op - limiet"-query helpen