sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL-index på JSON

Dina andra två index fungerar inte bara för att ->> operatorn returnerar text , medan du uppenbarligen har jsonb ginoperatörsklasser i åtanke. Observera att du bara nämner json , men du behöver faktiskt jsonb för avancerade indexeringsmöjligheter.

För att komma fram till den bästa indexeringsstrategin måste du definiera närmare vilka frågor som ska täckas. Är du bara intresserad av kor? Eller alla djur/alla taggar? Vilka operatörer är möjliga? Innehåller ditt JSON-dokument även icke-djurnycklar? Vad ska man göra med de? Vill du ta med rader i indexet där kor (eller vad som helst) inte alls visas i JSON-dokumentet?

Förutsatt:

  • Vi är bara intresserade av kor på den första nivån av häckning.
  • Värdet är alltid ett giltigt integer .
  • Vi är inte intresserade av rader utan kor.

Jag föreslår ett funktionellt btree-index, ungefär som du redan har, men cast värdet till integer . Jag antar att du inte vill att jämförelsen ska utvärderas som text (där '2' är större än '1111').

CREATE INDEX animal_index ON farm (((animal ->> 'cow')::int));  -- !

Den extra uppsättningen parenteser krävs för att cast-stenografin ska göra syntaxen för indexuttrycket entydig.

Använd samma uttryck i dina frågor för att få Postgres att inse att indexet är tillämpligt:

SELECT * FROM farm WHERE (animal ->> 'cow')::int > 3;

Om du behöver en mer generisk jsonb index, överväg:

  • Vilket är det korrekta indexet för att fråga strukturer i arrayer i Postgres jsonb?

För en känd, statisk, trivial antal djur (som du kommenterade), föreslår jag partiella index som:

CREATE INDEX animal_index ON farm (((animal ->> 'cow')::int))
WHERE (animal ->> 'cow') IS NOT NULL;

CREATE INDEX animal_index ON farm (((animal ->> 'chicken')::int))
WHERE (animal ->> 'chicken') IS NOT NULL;

Etc.

Du kanske måste lägga till indexvillkoret i frågan:

SELECT * FROM farm
WHERE (animal ->> 'cow')::int > 3
AND   (animal ->> 'cow') IS NOT NULL; 

Kan tyckas överflödigt, men kan vara nödvändigt. Testa med ANALYZE !




  1. SQLite - Infoga data

  2. Hur ställer man in timern för att anropa en funktion var n:e minut?

  3. PostgreSQL:Släpp PostgreSQL-databasen via kommandoraden

  4. Vad är en jämförelseoperatör?