Praktik terbaik untuk mendesain kueri Amazon Redshift - AWS Bimbingan Preskriptif

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Praktik terbaik untuk mendesain kueri Amazon Redshift

Bagian ini memberikan ikhtisar praktik terbaik untuk mendesain kueri. Kami menyarankan Anda mengikuti praktik terbaik di bagian ini untuk mencapai kinerja dan efisiensi kueri yang optimal.

Hindari menggunakan FROM pernyataan SELECT *

Kami menyarankan Anda menghindari menggunakan SELECT * FROM pernyataan tersebut. Sebagai gantinya, selalu daftar kolom untuk analisis. Ini mengurangi waktu eksekusi kueri dan biaya pemindaian untuk kueri Amazon Redshift Spectrum.

Contoh apa yang harus dihindari

select * from sales;

Contoh praktik terbaik

select sales_date, sales_amt from sales;

Identifikasi masalah kueri

Kami menyarankan Anda memeriksa LOG tampilan STL_ _ ALERT EVENT _ untuk mengidentifikasi dan memperbaiki kemungkinan masalah dengan kueri Anda.

Dapatkan informasi ringkasan tentang kueri Anda

Kami menyarankan Anda menggunakan REPORT tampilan SVL_ QUERY _ SUMMARY dan SVL_ QUERY _ untuk mendapatkan informasi ringkasan tentang pertanyaan Anda. Anda dapat menggunakan informasi ini untuk mengoptimalkan kueri Anda.

Hindari cross-join

Kami menyarankan Anda menghindari penggunaan cross-joins kecuali benar-benar diperlukan. Tanpa kondisi gabungan, cross-join menghasilkan produk Cartesian dari dua tabel. Cross-joins biasanya dijalankan sebagai gabungan loop bersarang (yang paling lambat dari jenis gabungan yang mungkin).

Contoh apa yang harus dihindari

select c.c_name, n.n_name from tpch.customer c, tpch.nation n;

Contoh praktik terbaik

select c.c_name, n.n_name from tpch.customer c, join tpch.nation n on n.n_nationkey = c.c_nationkey;

Hindari fungsi dalam predikat kueri

Kami menyarankan Anda menghindari penggunaan fungsi dalam predikat kueri. Menggunakan fungsi dalam predikat kueri dapat berdampak negatif pada kinerja karena fungsi biasanya menambahkan overhead pemrosesan tambahan ke setiap baris dan memperlambat eksekusi keseluruhan kueri.

Contoh apa yang harus dihindari

select sum(o_totalprice) from tpch.orders where datepart(year, o_orderdate) = 1992;

Contoh praktik terbaik

select sum(o_totalprice) from tpch.orders where o_orderdate between '1992-01-01' and '1992-12-31';

Hindari konversi cast yang tidak perlu

Kami menyarankan Anda menghindari penggunaan konversi cast yang tidak perlu pada kueri karena tipe data casting membutuhkan waktu dan sumber daya dan memperlambat eksekusi kueri.

Contoh apa yang harus dihindari

select sum(o_totalprice) from tpch.orders where o_ordertime::date = '1992-01-01';

Contoh praktik terbaik

select sum(o_totalprice) from tpch.orders where o_ordertime between '1992-01-01 00:00:00' and '1992-12-31 23:59:59';

Gunakan CASE ekspresi untuk agregasi kompleks

Kami menyarankan Anda menggunakan CASEekspresi untuk melakukan agregasi kompleks alih-alih memilih dari tabel yang sama beberapa kali.

Contoh apa yang harus dihindari

select sum(sales_amt) as us_sales from sales where country = 'US'; select sum(sales_amt) as ca_sales from sales where country = 'CA';

Contoh praktik terbaik

select sum(case when country = 'US' then sales_amt end) as us_sales, sum(case when country = 'CA' then sales_amt end) as ca_sales from sales;

Gunakan subkueri

Kami menyarankan Anda menggunakan subkueri dalam kasus di mana satu tabel dalam kueri hanya digunakan untuk kondisi predikat dan subquery mengembalikan sejumlah kecil baris (kurang dari sekitar 200).

Contoh apa yang harus dihindari

Jika subquery mengembalikan kurang dari 200 baris:

select sum(order_amt) as total_sales from sales where region_key IN (select region_key from regions where state = 'CA');

Contoh praktik terbaik

Jika subquery mengembalikan lebih besar dari atau sama dengan 200 baris:

select sum(o.order_amt) as total_sales from sales o join regions r on r.region_key = o.region_key and r.state = 'CA';

Gunakan predikat

Kami menyarankan Anda menggunakan predikat untuk membatasi kumpulan data sebanyak mungkin. Predikat digunakan SQL untuk memfilter dan membatasi data yang dikembalikan dalam kueri. Dengan menentukan kondisi dalam predikat, Anda dapat menentukan baris mana yang harus disertakan dalam hasil kueri berdasarkan kondisi yang ditentukan. Ini memungkinkan Anda untuk mengambil hanya data yang Anda minati dan meningkatkan efisiensi dan akurasi kueri Anda. Untuk informasi selengkapnya, lihat Ketentuan dalam dokumentasi Amazon Redshift.

Tambahkan predikat untuk memfilter tabel dengan gabungan

Kami menyarankan Anda menambahkan predikat untuk memfilter tabel yang berpartisipasi dalam gabungan, bahkan jika predikat menerapkan filter yang sama. Menggunakan predikat untuk memfilter tabel dengan gabungan SQL dapat meningkatkan kinerja kueri dengan mengurangi jumlah data yang harus diproses dan mengurangi ukuran kumpulan hasil antara. Dengan menentukan kondisi untuk operasi gabungan dalam WHERE klausa, mesin eksekusi kueri dapat menghilangkan baris yang tidak cocok dengan kondisi sebelum digabungkan. Ini menghasilkan set hasil yang lebih kecil dan eksekusi kueri yang lebih cepat.

Contoh apa yang harus dihindari

select p.product_name, sum(o.order_amt) from sales o join product p on r.product_key = o.product_key where o.order_date > '2022-01-01';

Contoh praktik terbaik

select p.product_name, sum(o.order_amt) from sales o join product p on p.product_key = o.product_key and p.added_date > '2022-01-01' where o.order_date > '2022-01-01';

Gunakan operator paling murah untuk predikat

Dalam predikat, gunakan operator paling murah yang Anda bisa. Operator kondisi perbandingan lebih disukai daripada LIKEoperator. LIKEoperator masih lebih disukai daripada SIMILARTO atau POSIXoperator.

Gunakan tombol sortir dalam klausa GROUP BY

Gunakan tombol sortir dalam GROUP BY klausa sehingga perencana kueri dapat menggunakan agregasi yang lebih efisien. Kueri mungkin memenuhi syarat untuk agregasi satu fase ketika GROUP BY daftarnya hanya berisi kolom kunci pengurutan, salah satunya juga merupakan kunci distribusi. Kolom kunci sortir dalam GROUP BY daftar harus menyertakan kunci sortir pertama, diikuti oleh kunci pengurutan lain yang ingin Anda gunakan dalam urutan kunci sortir.

Manfaatkan pandangan yang terwujud

Jika memungkinkan, tulis ulang kueri dengan mengganti kode kompleks dengan tampilan terwujud, yang secara signifikan akan meningkatkan kinerja kueri. Untuk informasi selengkapnya, lihat Membuat tampilan terwujud di Amazon Redshift di dokumentasi Amazon Redshift.

Hati-hati dengan kolom di klausa GROUP ORDER BY dan BY

Jika Anda menggunakan keduanya GROUP BY dan ORDER BY klausa, pastikan Anda meletakkan kolom dalam urutan yang sama di kedua klausa GROUP BY dan ORDER BY klausa. GROUP BYsecara implisit membutuhkan data yang akan diurutkan. Jika ORDER BY klausa Anda berbeda, maka data harus diurutkan dua kali.

Contoh apa yang harus dihindari

select a, b, c, sum(d) from a_table group by b, c, a order by a, b, c

Contoh praktik terbaik

select a, b, c, sum(d) from a_table group by a, b, c order by a, b, c