web-dev-qa-db-fra.com

Joindre interne à l'aide d'une colonne Array

Ayant des problèmes d'indexation et d'exécution d'une requête en O (log n) temps.

La requête comprend un INNER JOIN, Un ORDER BY Et une opération d'égalité. Si je comprends correctement les lois des bases de données, une requête peut être indexée et exécutée dans O (log n) Time (ou à peu près) si un opérateur de non-égalité n'est pas utilisé sur plus d'une colonne. Dans ce cas, je crois que le INNER JOIN Compte comme un opérateur d'égalité et l'opérateur de non-égalité serait la partie ORDER BY De la requête. Cette table présente plus de 10 000 000 rangées et doit gérer plusieurs lectures et écrit par seconde.

En utilisant PostgreSQL. C'est ce que ressemble au tableau. Comme vous pouvez le constater, la colonne 'Noms' est une propriété de liste et c'est la colonne que le INNER JOIN Est contre:

Age Names                       Date
34  ['carla', 'john', 'sam']    3/13/2011
26  ['json', 'cindy', 'joel']   3/13/2011
72  ['beth', 'amber', 'susie']  3/13/2011
14  ['john', 'jim', 'debie']    3/13/2011

C'est la requête que nous essayons de faire:

SELECT * FROM the_table WHERE Age==26 AND Names=='john' ORDER BY Date

Mon origine provient de l'utilisation de la grande table d'App moteur, de sorte que j'ai utilisé des opérateurs d'égalité pour indiquer que 'john' Doit être l'un des noms de la colonne Names. Ce serait une requête acceptable dans la grande table de Gae, elle exécuterait dans O (log N) Time car toutes les grosses requêtes de table sont requises à faire. Je suppose qu'il existe un moyen de faire cela dans PostgreSQL aussi bien que PostgreSQL accepte les types de données de liste comme des colonnes.

Est-ce que cela est possible de faire à PostgreSQL?

Si tel est le cas, comment l'indice devrait-il être configuré (nous ne pouvons pas comprendre comment configurer un index qui prend en compte les trois propriétés)?

4
Chris Dutrow

Avez-vous essayé avec:

SELECT * from the_table WHERE Age = 26 AND array['john'] && Names ORDER BY Date

Utiliser un index comme:

CREATE INDEX the_table_idx ON the_table USING GIN (Names, Age, Date);

Ou au moins un index comme

CREATE INDEX the_table_idx ON the_table USING GIN (Names, Age);
0