Maison > base de données > tutoriel mysql > Comment puis-je optimiser les requêtes Postgres sur les tableaux jsonb pour de meilleures performances ?

Comment puis-je optimiser les requêtes Postgres sur les tableaux jsonb pour de meilleures performances ?

Patricia Arquette
Libérer: 2025-01-06 14:06:41
original
332 Les gens l'ont consulté

How Can I Optimize Postgres Queries on jsonb Arrays for Improved Performance?

Interrogation de structures dans des tableaux à l'aide de Postgres jsonb

Les tableaux Jsonb peuvent stocker des données structurées dans Postgres, facilitant ainsi les requêtes avec des objets imbriqués. Cependant, l'accès aux valeurs de tableau avec des index séquentiels peut entraîner des analyses séquentielles.

Indexation appropriée pour des performances de requête améliorées

Pour optimiser les requêtes impliquant des comparaisons de tableaux JSONB, en particulier les requêtes telles que celui fourni (vérification des événements dans une certaine plage de temps), les étapes suivantes peuvent être pris :

  • Utiliser la classe d'opérateur jsonb_path_ops : Cela garantit une correspondance efficace pour les comparaisons jsonb complexes impliquant des opérateurs supérieurs ou inférieurs à.

Approche de base (Postgres 12 et Plus tard)

SELECT l.*
FROM   locations l
WHERE  l.events @? '$[*] ? (@.event_slug == "test_1")
                         ? (@.end_time.datetime() < "2014-10-13".datetime()'
Copier après la connexion

Approche avancée utilisant des vues matérialisées

Si des requêtes complexes entraînent toujours de mauvaises performances, envisagez de créer une vue matérialisée avec des attributs pertinents normalisés :

  • Créer des données d'événement Type :

    CREATE TYPE event_type AS (
     , event_slug  text
     , start_time  timestamp
     , end_time    timestamp
    );
    Copier après la connexion
  • Créer une vue matérialisée :

    CREATE MATERIALIZED VIEW loc_event AS
    SELECT l.location_id, e.event_slug, e.end_time  -- start_time not needed
    FROM   locations l, jsonb_populate_recordset(null::event_type, l.events) e;
    Copier après la connexion
  • Index matérialisé Vue :

    CREATE INDEX loc_event_idx ON loc_event (event_slug, end_time, location_id);
    Copier après la connexion
  • Requête de vue matérialisée :

    SELECT *
    FROM   loc_event
    WHERE  event_slug = 'test_1'
    AND    end_time  >= '2014-10-30 14:04:06 -0400'::timestamptz;
    Copier après la connexion

    En utilisant l'opérateur approprié et en considérant des approches avancées telles que les vues matérialisées, vous pouvez obtenir des performances optimales pour les requêtes impliquant des comparaisons sur les données du tableau jsonb.

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal