Index zum Suchen eines Elements in einem JSON-Array

Ich habe eine Tabelle, die wie folgt aussieht:

CREATE TABLE tracks (id SERIAL, artists JSON);

INSERT INTO tracks (id, artists) 
  VALUES (1, '[{"name": "blink-182"}]');

INSERT INTO tracks (id, artists) 
  VALUES (2, '[{"name": "The Dirty Heads"}, {"name": "Louis Richards"}]');

Gibt es mehrere andere Spalten sind nicht relevant für diese Frage. Es gibt einen Grund zu haben, Sie als JSON gespeichert.

Was ich versuche zu tun, ist die lookup-ein track, der eine bestimmte Künstler name (genaue übereinstimmung).

Bin ich mit dieser Abfrage:

SELECT * FROM tracks 
  WHERE 'ARTIST NAME' IN
    (SELECT value->>'name' FROM json_array_elements(artists))

beispielsweise

SELECT * FROM tracks
  WHERE 'The Dirty Heads' IN 
    (SELECT value->>'name' FROM json_array_elements(artists))

Allerdings bedeutet dies einen full table scan, und es ist nicht sehr schnell. Ich habe versucht, erstellen ein GIN-index mit Hilfe einer Funktion names_as_array(artists)und verwendet 'ARTIST NAME' = ANY names_as_array(artists) allerdings der index nicht verwendet wird und die Abfrage ist tatsächlich deutlich langsamer.

InformationsquelleAutor der Frage JeffS | 2013-08-23

Schreibe einen Kommentar