Best practice di Amazon Redshift per la progettazione di query - Amazon Redshift

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Best practice di Amazon Redshift per la progettazione di query

Per ottimizzare le prestazioni delle query, segui queste raccomandazioni durante la creazione di query.

  • Progetta le tabelle conformemente alle best practice in modo da fornire basi solide per le prestazioni delle query. Per ulteriori informazioni, consultare Best practice di Amazon Redshift per la progettazione di tabelle.

  • Non utilizzare select *. Includi solo le colonne di cui hai bisogno.

  • Utilizza CASEespressione condizionale per eseguire aggregazioni complesse anziché selezionare più volte dalla stessa tabella.

  • Non utilizzare cross join se non assolutamente necessario. Questi join senza una condizione di join generano un prodotto cartesiano di due tabelle. I cross join sono in genere eseguiti come nested loop join, ovvero i tipi di join più lenti.

  • Usa le subquery nei casi in cui una tabella nella query è utilizzata solo per le condizioni di predicato e la subquery restituisce un numero esiguo di righe (inferiore a 200). L'esempio seguente utilizza una sottoquery per evitare di unire la tabella. LISTING

    select sum(sales.qtysold) from sales where salesid in (select listid from listing where listtime > '2008-12-26');
  • Utilizza predicati per limitare il più possibile il set di dati.

  • Nel predicato, utilizza gli operatori meno onerosi. Gli operatori Condizione di confronto sono preferibili agli operatori LIKE. LIKEgli operatori sono ancora preferibili a or. SIMILARPER POSIXoperatori

  • Evita l'utilizzo di funzioni nei predicati delle query. Il loro utilizzo può accrescere il costo della query in quanto richiedono un numero elevato di righe per risolvere le fasi intermedie della query.

  • Se possibile, utilizzate una WHERE clausola per limitare il set di dati. In tal modo, il pianificatore di query può utilizzare l'ordine delle righe per determinare quali record corrispondono ai criteri e quindi ignorare la scansione di grandi quantità di blocchi del disco. In caso contrario, il motore di esecuzione di query deve eseguire la scansione della totalità delle colonne partecipanti.

  • Aggiungi predicati per filtrare le tabelle che partecipano alle operazioni di join, anche se i predicati applicano gli stessi filtri. La query restituisce lo stesso set di risultati, ma Amazon Redshift è in grado di filtrare le tabelle join prima della fase di scansione e può quindi ignorare in modo efficace la scansione dei blocchi di quelle tabelle. I filtri ridondanti non sono necessari se filtri una colonna utilizzata nella condizione di join.

    Ad esempio, supponiamo che intendi eseguire un join di SALES con LISTING per trovare le vendite di biglietti per i biglietti elencati dopo dicembre, raggruppati per venditore. Entrambe le tabelle sono ordinate per data. La query seguente unisce in join le tabelle sulla relativa chiave comune e filtra i valori listing.listtime posteriori al 1° dicembre.

    select listing.sellerid, sum(sales.qtysold) from sales, listing where sales.salesid = listing.listid and listing.listtime > '2008-12-01' group by 1 order by 1;

    La WHERE clausola non include un predicato persales.saletime, quindi il motore di esecuzione è costretto a scansionare l'intera tabella. SALES Se sai che il filtro comporterà un minor numero di righe partecipanti al join, aggiungi anche quel filtro. L'esempio seguente riduce il tempo di esecuzione in modo significativo.

    select listing.sellerid, sum(sales.qtysold) from sales, listing where sales.salesid = listing.listid and listing.listtime > '2008-12-01' and sales.saletime > '2008-12-01' group by 1 order by 1;
  • Utilizza le chiavi di ordinamento nella clausola GROUP BY in modo che il pianificatore di query possa utilizzare un'aggregazione più efficiente. Una query può essere idonea per l'aggregazione monofase quando l'elenco GROUP BY contiene solo colonne chiave di ordinamento, una delle quali è anche la chiave di distribuzione. Le colonne delle chiavi di ordinamento nell'elenco GROUP BY devono includere la prima chiave di ordinamento, quindi altre chiavi di ordinamento che si desidera utilizzare nell'ordine delle chiavi di ordinamento. Ad esempio, è consentito utilizzare la prima chiave di ordinamento, la prima e la seconda chiave di ordinamento, la prima, la seconda e la terza chiave di ordinamento e così via. Non è possibile utilizzare la prima e la terza chiave di ordinamento.

    Puoi confermare l'utilizzo di un'aggregazione a una fase eseguendo il comando EXPLAIN e cercando XN GroupAggregate nella fase di aggregazione della query.

  • Se utilizzi sia GROUP la clausola ORDER BY che la clausola BY, assicurati di inserire le colonne nello stesso ordine in entrambe. In altre parole, utilizza l'approccio seguente.

    group by a, b, c order by a, b, c

    Non utilizzare l'approccio seguente.

    group by b, c, a order by a, b, c