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. LIKE
operator 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 BY
secara 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