PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment puis-je écrire cette requête postgres dans Amazon redshift de manière à ce qu'elle soit aussi optimisée qu'elle l'était dans postgres ?

L'optimisation de la requête Redshift provient du cluster, de la conception de la table, du chargement des données, de l'aspiration et de l'analyse des données sur la table.

Permettez-moi de répondre à certains points de contact de base dans la liste ci-dessus.1. Assurez-vous que votre table mytable, detail, client a la bonne SORT_KEY, DIST_KEY2. Assurez-vous que toutes vos tables dans la jointure sont analysées et nettoyées correctement.

Voici une autre version de votre même SQL écrit au format Redshift.

Quelques modifications que j'ai apportées sont

  1. Utilisation de "With Clause" pour optimiser le calcul au niveau du cluster
  2. Utilisez les jointures de la bonne manière et assurez-vous que les jointures gauche/droite sont basées sur les données.
  3. Date_range utilisé avec la table de clauses pour le type d'orientation d'objet.
  4. Utilisé Group By dans le SQL principal ci-dessous.

Ma version de Redshift SQL

/** Date Range Computation **/
with date_range as (
    select ( current_Date - interval '2 weeks' ) as two_weeks
),
/** Filter main ResultSet**/
myGroupSet as (
    SELECT b.val AS myGroup,
           c.username,
           a.someCode,
           a.timeTaken,
           (case when (b.name == 'name1') THEN b.val::INTEGER ELSE 0 END ) as name11,
           (case when (b.name == 'name2') THEN b.val::INTEGER ELSE 0 END ) as name12
      FROM database.myTable a,
      join date_range dr on a.date > dr.two_weeks
      join database.detail b on b.id = a.id
      join database.client c on c.c_id = a.c_id
     where a.date > current_Date - interval '2 weeks'
)
/** Apply Aggregation **/
select myGroup, username, someCode, timeTaken, date,
       sum(name1), sum(name2)
  from myGroupSet
  group by myGroup, username, someCode, timeTaken, date