sql >> Database >  >> RDS >> PostgreSQL

Postgres combineert meerdere indexen

Ik weet niet of Pg een GiST-index en gewone b-tree-indexen kan combineren met een bitmap-indexscan, maar ik vermoed van niet. Mogelijk krijgt u het beste resultaat zonder een user_id . toe te voegen kolom naar uw GiST-index (en daardoor groter en langzamer makend voor andere zoekopdrachten die geen gebruik maken van user_id ).

Als experiment kun je:

CREATE EXTENSION btree_gist;
CREATE INDEX ix_coords_and_user_id ON test USING GIST (coords, user_id);

wat waarschijnlijk zal resulteren in een grote index, maar die zoekopdracht zou kunnen stimuleren - als het werkt. Houd er rekening mee dat het onderhouden van een dergelijke index INSERT aanzienlijk zal vertragen en UPDATE s. Als je de oude ix_coords . laat vallen uw zoekopdrachten gebruiken ix_coords_and_user_id zelfs als ze niet filteren op user_id , maar het zal langzamer zijn dan ix_coords . Als u beide bewaart, wordt de INSERT en UPDATE vertraging nog erger.

Zie btree-gist

(Verouderd door bewerking naar vraag die de vraag volledig verandert; toen de gebruiker een index met meerdere kolommen had, is deze nu opgesplitst in twee afzonderlijke ):

Het lijkt erop dat u niet filtert of sorteert op user_id , alleen create_date . Pg zal (kan niet?) alleen de tweede term van een index met meerdere kolommen gebruiken, zoals (user_id, create_date) , het heeft ook het eerste item nodig.

Als je create_date wilt indexeren , maak er een aparte index voor aan. Als je de (user_id, create_date) . gebruikt en nodig hebt index en gebruik over het algemeen niet alleen user_id alleen, kijk of je de kolomvolgorde kunt omkeren. Maak als alternatief twee onafhankelijke indexen, (user_id) en (create_date) . Als beide kolommen nodig zijn, kan Pg de twee onafhankelijke indexen combineren met behulp van een bitmapindexscan.



  1. Vervang de null-waarde door de vorige beschikbare waarde in Row SQL-serverquery

  2. operand moet 1 kolommen bevatten

  3. Hoe bewaar je de bestelling met SELECT WHERE IN()?

  4. Is het mogelijk om verwijderingen op een tafel op MYSQL uit te schakelen?