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 Espressione condizionale CASE 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 subquery per evitare di unire in join 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. Gli operatori LIKE sono ancora preferibili a SIMILAR TO o Operatori POSIX.

  • 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, utilizza una clausola WHERE 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 clausola WHERE non include un predicato for sales.saletime, quindi il motore di esecuzione è costretto a eseguire la scansione dell'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 chiavi di ordinamento nella clausola GROUP BY di modo che il pianificatore di query possa utilizzare un'aggregazione più efficace. Una query può essere inclusa in un'aggregazione in una fase quando il relativo elenco GROUP BY contiene solo colonne di chiave di ordinamento, una delle quali è anche la chiave di distribuzione. Le colonne di chiave di ordinamento nell'elenco GROUP BY devono includere la prima chiave di ordinamento e quindi altre chiavi di ordinamento che intendi utilizzare. 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 le clausole GROUP BY e ORDER BY, assicurati di posizionare le colonne in entrambe nello stesso ordine. 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