Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Praktik terbaik Amazon Redshift untuk mendesain kueri
Untuk memaksimalkan kinerja kueri, ikuti rekomendasi ini saat membuat kueri:
-
Desain tabel sesuai dengan praktik terbaik untuk memberikan dasar yang kuat untuk kinerja kueri. Untuk informasi selengkapnya, lihat Praktik terbaik Amazon Redshift untuk mendesain tabel.
-
Hindari menggunakan
select *
. Sertakan hanya kolom yang Anda butuhkan secara khusus. -
Gunakan a CASEekspresi bersyarat untuk melakukan agregasi kompleks alih-alih memilih dari tabel yang sama beberapa kali.
-
Jangan gunakan cross-joins kecuali benar-benar diperlukan. Ini bergabung tanpa kondisi gabungan menghasilkan produk Cartesian dari dua tabel. Cross-join biasanya dijalankan sebagai nested-loop join, yang merupakan jenis gabungan paling lambat.
-
Gunakan subquery dalam kasus di mana satu tabel dalam query digunakan hanya untuk kondisi predikat dan subquery mengembalikan sejumlah kecil baris (kurang dari sekitar 200). Contoh berikut menggunakan subquery untuk menghindari bergabung dengan LISTING tabel.
select sum(sales.qtysold) from sales where salesid in (select listid from listing where listtime > '2008-12-26');
-
Gunakan predikat untuk membatasi kumpulan data sebanyak mungkin.
-
Dalam predikat, gunakan operator paling murah yang Anda bisa. Kondisi perbandinganoperator lebih disukai daripada LIKE operator. LIKEoperator masih lebih disukai SIMILARUNTUK atauPOSIXoperator.
-
Hindari menggunakan fungsi dalam predikat kueri. Menggunakannya dapat menaikkan biaya kueri dengan membutuhkan sejumlah besar baris untuk menyelesaikan langkah-langkah perantara kueri.
-
Jika memungkinkan, gunakan WHERE klausa untuk membatasi kumpulan data. Perencana kueri kemudian dapat menggunakan urutan baris untuk membantu menentukan catatan mana yang cocok dengan kriteria, sehingga dapat melewati pemindaian sejumlah besar blok disk. Tanpa ini, mesin eksekusi kueri harus memindai kolom yang berpartisipasi sepenuhnya.
-
Tambahkan predikat untuk memfilter tabel yang berpartisipasi dalam gabungan, bahkan jika predikat menerapkan filter yang sama. Kueri mengembalikan set hasil yang sama, tetapi Amazon Redshift dapat memfilter tabel gabungan sebelum langkah pemindaian dan kemudian dapat secara efisien melewati blok pemindaian dari tabel tersebut. Filter redundan tidak diperlukan jika Anda memfilter pada kolom yang digunakan dalam kondisi gabungan.
Misalnya, misalkan Anda ingin bergabung
SALES
dan menemukan penjualan tiketLISTING
untuk tiket yang terdaftar setelah Desember, dikelompokkan berdasarkan penjual. Kedua tabel diurutkan berdasarkan tanggal. Kueri berikut menggabungkan tabel pada kunci umum dan filter untuklisting.listtime
nilai yang lebih besar dari 1 Desember.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;
WHEREKlausul tidak menyertakan predikat untuk
sales.saletime
, sehingga mesin eksekusi dipaksa untuk memindai seluruhSALES
tabel. Jika Anda tahu filter akan menghasilkan lebih sedikit baris yang berpartisipasi dalam gabungan, tambahkan filter itu juga. Contoh berikut memotong waktu eksekusi secara signifikan.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;
-
Gunakan tombol sortir dalam klausa GROUP BY sehingga perencana kueri dapat menggunakan agregasi yang lebih efisien. Kueri mungkin memenuhi syarat untuk agregasi satu fase ketika daftar BY-nya GROUP hanya berisi kolom kunci pengurutan, salah satunya juga merupakan kunci distribusi. Kolom kunci sortir dalam daftar GROUP BY harus menyertakan kunci sortir pertama, lalu kunci pengurutan lain yang ingin Anda gunakan dalam urutan kunci pengurutan. Misalnya, valid untuk menggunakan kunci sortir pertama, kunci sortir pertama dan kedua, kunci pengurutan pertama, kedua, dan ketiga, dan seterusnya. Tidak valid untuk menggunakan kunci pengurutan pertama dan ketiga.
Anda dapat mengonfirmasi penggunaan agregasi satu fase dengan menjalankan EXPLAIN perintah dan mencari
XN GroupAggregate
di langkah agregasi kueri. -
Jika Anda menggunakan klausa GROUP ORDER BY dan BY, pastikan Anda meletakkan kolom dalam urutan yang sama di keduanya. Artinya, gunakan pendekatan hanya mengikuti.
group by a, b, c order by a, b, c
Jangan gunakan pendekatan berikut.
group by b, c, a order by a, b, c