PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie kann ich diese Postgres-Abfrage in Amazon Redshift so schreiben, dass sie so optimiert ist wie in Postgres?

Die Redshift-Abfrageoptimierung kommt von Cluster, Tabellendesign, DataLoading, Data Vacuuming und Analyse über die Tabelle.

Lassen Sie mich einige zentrale Berührungspunkte in der obigen Liste beantworten.1. Stellen Sie sicher, dass Ihre Tabelle mytable, detail, client den richtigen SORT_KEY, DIST_KEY2 hat. Stellen Sie sicher, dass alle Ihre Tische im Join richtig analysiert und evakuiert sind.

Hier ist eine andere Version derselben SQL, die im Redshift-Format geschrieben ist.

Einige Änderungen, die ich vorgenommen habe, sind

  1. Verwendet „With Clause“ zur optimierten Berechnung auf Clusterebene
  2. Gebrauchte Joins auf die richtige Art und Weise und stellen Sie sicher, dass Links-/Rechts-Joins basierend auf Daten wichtig sind.
  3. Date_range mit Klauseltabelle für Art der Objektorientierung verwendet.
  4. Gruppieren nach in der Haupt-SQL unten verwendet.

Meine Version von 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