View a markdown version of this page

Menganalisis tabel - Amazon Redshift

Amazon Redshift tidak akan lagi mendukung penggunaan Python UDF setelah 30 Juni 2026. Kami akan mulai menegakkannya secara bertahap. Untuk informasi lebih lanjut tentang detail opsi akhir masa pakai dan migrasi Python, lihat posting blog yang diterbitkan pada 30 Juni 2025.

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

Menganalisis tabel

Operasi ANALYZE memperbarui metadata statistik yang digunakan perencana kueri untuk memilih rencana yang optimal.

Dalam kebanyakan kasus, Anda tidak perlu menjalankan perintah ANALYZE secara eksplisit. Amazon Redshift memantau perubahan pada beban kerja Anda dan secara otomatis memperbarui statistik di latar belakang. Selain itu, perintah COPY melakukan analisis secara otomatis ketika memuat data ke tabel kosong.

Untuk secara eksplisit menganalisis tabel atau seluruh database, jalankan MENGANALISA perintah.

Analisis otomatis

Amazon Redshift terus memantau database Anda dan secara otomatis melakukan operasi analisis di latar belakang. Untuk meminimalkan dampak terhadap kinerja sistem Anda, analisis otomatis berjalan selama periode ketika beban kerja ringan.

Analisis otomatis diaktifkan secara default. Untuk mematikan analisis otomatis, atur auto_analyze parameter false dengan memodifikasi grup parameter cluster Anda.

Untuk mengurangi waktu pemrosesan dan meningkatkan kinerja sistem secara keseluruhan, Amazon Redshift melewatkan analisis otomatis untuk setiap tabel di mana tingkat modifikasi kecil.

Operasi analisis melewatkan tabel yang memiliki statistik terkini. Jika Anda menjalankan ANALYZE sebagai bagian dari alur kerja ekstrak, transformasi, dan muat (ETL), analisis otomatis akan melewatkan tabel yang memiliki statistik saat ini. Demikian pula, ANALISIS eksplisit melewatkan tabel ketika analisis otomatis telah memperbarui statistik tabel.

Analisis data tabel baru

Secara default, perintah COPY melakukan ANALYZE setelah memuat data ke tabel kosong. Anda dapat memaksa ANALYZE terlepas dari apakah tabel kosong dengan menyetel STATUPDATE ON. Jika Anda menentukan STATUPDATE OFF, ANALISIS tidak dilakukan. Hanya pemilik tabel atau superuser yang dapat menjalankan perintah ANALYZE atau menjalankan perintah COPY dengan STATUPDATE disetel ke ON.

Amazon Redshift juga menganalisis tabel baru yang Anda buat dengan perintah berikut:

  • BUAT TABEL SEBAGAI (CTAS)

  • BUAT TABEL TEMP SEBAGAI

  • PILIH KE

Amazon Redshift mengembalikan pesan peringatan saat Anda menjalankan kueri terhadap tabel baru yang tidak dianalisis setelah data awalnya dimuat. Tidak ada peringatan yang terjadi saat Anda menanyakan tabel setelah pembaruan atau pemuatan berikutnya. Pesan peringatan yang sama dikembalikan ketika Anda menjalankan perintah EXPLAIN pada kueri yang mereferensikan tabel yang belum dianalisis.

Setiap kali menambahkan data ke tabel yang tidak kosong secara signifikan mengubah ukuran tabel, Anda dapat memperbarui statistik secara eksplisit. Anda melakukannya dengan menjalankan perintah ANALYZE atau dengan menggunakan opsi STATUPDATE ON dengan perintah COPY. Untuk melihat detail tentang jumlah baris yang telah disisipkan atau dihapus sejak ANALYZE terakhir, kueri tabel katalog PG_STATISTIC_INDICATOR sistem.

Anda dapat menentukan ruang lingkup MENGANALISA perintah ke salah satu dari berikut ini:

  • Seluruh database saat ini

  • Satu tabel

  • Satu atau lebih kolom spesifik dalam satu tabel

  • Kolom yang kemungkinan akan digunakan sebagai predikat dalam kueri

Perintah ANALYZE mendapatkan sampel baris dari tabel, melakukan beberapa perhitungan, dan menyimpan statistik kolom yang dihasilkan. Secara default, Amazon Redshift menjalankan sampel pass untuk kolom DISTKEY dan pass sampel lain untuk semua kolom lain dalam tabel. Jika Anda ingin menghasilkan statistik untuk subset kolom, Anda dapat menentukan daftar kolom yang dipisahkan koma. Anda dapat menjalankan ANALYZE dengan klausa PREDICATE COLUMNS untuk melewati kolom yang tidak digunakan sebagai predikat.

Operasi ANALYZE sangat padat sumber daya, jadi jalankan hanya pada tabel dan kolom yang benar-benar memerlukan pembaruan statistik. Anda tidak perlu menganalisis semua kolom di semua tabel secara teratur atau pada jadwal yang sama. Jika data berubah secara substanțial, analisis kolom yang sering digunakan sebagai berikut:

  • Operasi penyortiran dan pengelompokan

  • Gabungan

  • Predikat kueri

Untuk mengurangi waktu pemrosesan dan meningkatkan kinerja sistem secara keseluruhan, Amazon Redshift melewatkan ANALYZE untuk setiap tabel yang memiliki persentase baris yang diubah rendah, sebagaimana ditentukan oleh parameter. analisis_ambang_persen Secara default, ambang analisis diatur ke 10 persen. Anda dapat mengubah ambang analisis untuk sesi saat ini dengan menjalankan SET perintah.

Kolom yang cenderung tidak memerlukan analisis yang sering adalah kolom yang mewakili fakta dan ukuran dan atribut terkait yang tidak pernah benar-benar ditanyakan, seperti kolom VARCHAR besar. Misalnya, pertimbangkan tabel LISTING di database TICKIT.

select "column", type, encoding, distkey, sortkey from pg_table_def where tablename = 'listing'; column | type | encoding | distkey | sortkey ---------------+--------------------+----------+---------+--------- listid | integer | none | t | 1 sellerid | integer | none | f | 0 eventid | integer | mostly16 | f | 0 dateid | smallint | none | f | 0 numtickets | smallint | mostly8 | f | 0 priceperticket | numeric(8,2) | bytedict | f | 0 totalprice | numeric(8,2) | mostly32 | f | 0 listtime | timestamp with... | none | f | 0

Jika tabel ini dimuat setiap hari dengan sejumlah besar catatan baru, kolom LISTID, yang sering digunakan dalam kueri sebagai kunci gabungan, harus dianalisis secara teratur. Jika TOTALPRICE dan LISTTIME adalah batasan yang sering digunakan dalam kueri, Anda dapat menganalisis kolom tersebut dan kunci distribusi pada setiap hari kerja.

analyze listing(listid, totalprice, listtime);

Misalkan penjual dan peristiwa dalam aplikasi jauh lebih statis, dan ID tanggal mengacu pada serangkaian hari tetap yang hanya mencakup dua atau tiga tahun. Dalam hal ini, nilai unik untuk kolom ini tidak berubah secara signifikan. Namun, jumlah contoh dari setiap nilai unik akan terus meningkat.

Selain itu, pertimbangkan kasus di mana ukuran NUMTICKETS dan PRICEPERTICKET jarang ditanyakan dibandingkan dengan kolom TOTALPRICE. Dalam hal ini, Anda dapat menjalankan perintah ANALYZE di seluruh tabel sekali setiap akhir pekan untuk memperbarui statistik untuk lima kolom yang tidak dianalisis setiap hari:

Kolom predikat

Sebagai alternatif yang nyaman untuk menentukan daftar kolom, Anda dapat memilih untuk menganalisis hanya kolom yang kemungkinan akan digunakan sebagai predikat. Saat Anda menjalankan kueri, kolom apa pun yang digunakan dalam gabungan, kondisi filter, atau grup demi klausa ditandai sebagai kolom predikat dalam katalog sistem. Ketika Anda menjalankan ANALYZE dengan klausa PREDICATE COLUMNS, operasi analisis hanya mencakup kolom yang memenuhi kriteria berikut:

  • Kolom ditandai sebagai kolom predikat.

  • Kolom adalah kunci distribusi.

  • Kolom adalah bagian dari kunci pengurutan.

Jika tidak ada kolom tabel yang ditandai sebagai predikat, ANALYZE menyertakan semua kolom, bahkan ketika KOLOM PREDIKAT ditentukan. Jika tidak ada kolom yang ditandai sebagai kolom predikat, mungkin karena tabel belum ditanyakan.

Anda dapat memilih untuk menggunakan KOLOM PREDIKAT ketika pola kueri beban kerja Anda relatif stabil. Ketika pola kueri bervariasi, dengan kolom yang berbeda sering digunakan sebagai predikat, menggunakan KOLOM PREDIKAT dapat sementara menghasilkan statistik basi. Statistik basi dapat menyebabkan rencana runtime kueri yang kurang optimal dan runtime yang lama. Namun, lain kali Anda menjalankan ANALYZE menggunakan KOLOM PREDIKAT, kolom predikat baru disertakan.

Untuk melihat detail kolom predikat, gunakan SQL berikut untuk membuat tampilan bernama PREDICATE_COLUMNS.

CREATE VIEW predicate_columns AS WITH predicate_column_info as ( SELECT ns.nspname AS schema_name, c.relname AS table_name, a.attnum as col_num, a.attname as col_name, CASE WHEN 10002 = s.stakind1 THEN array_to_string(stavalues1, '||') WHEN 10002 = s.stakind2 THEN array_to_string(stavalues2, '||') WHEN 10002 = s.stakind3 THEN array_to_string(stavalues3, '||') WHEN 10002 = s.stakind4 THEN array_to_string(stavalues4, '||') ELSE NULL::varchar END AS pred_ts FROM pg_statistic s JOIN pg_class c ON c.oid = s.starelid JOIN pg_namespace ns ON c.relnamespace = ns.oid JOIN pg_attribute a ON c.oid = a.attrelid AND a.attnum = s.staattnum) SELECT schema_name, table_name, col_num, col_name, pred_ts NOT LIKE '2000-01-01%' AS is_predicate, CASE WHEN pred_ts NOT LIKE '2000-01-01%' THEN (split_part(pred_ts, '||',1))::timestamp ELSE NULL::timestamp END as first_predicate_use, CASE WHEN pred_ts NOT LIKE '%||2000-01-01%' THEN (split_part(pred_ts, '||',2))::timestamp ELSE NULL::timestamp END as last_analyze FROM predicate_column_info;

Misalkan Anda menjalankan query berikut terhadap tabel LISTING. Perhatikan bahwa LISTID, LISTTIME, dan EVENTID digunakan dalam klausa join, filter, dan group by.

select s.buyerid,l.eventid, sum(l.totalprice) from listing l join sales s on l.listid = s.listid where l.listtime > '2008-12-01' group by l.eventid, s.buyerid;

Ketika Anda menanyakan tampilan PREDICATE_COLUMNS, seperti yang ditunjukkan pada contoh berikut, Anda melihat bahwa LISTID, EVENTID, dan LISTTIME ditandai sebagai kolom predikat.

select * from predicate_columns where table_name = 'listing';
schema_name | table_name | col_num | col_name       | is_predicate | first_predicate_use | last_analyze       
------------+------------+---------+----------------+--------------+---------------------+--------------------
public      | listing    |       1 | listid         | true         | 2017-05-05 19:27:59 | 2017-05-03 18:27:41
public      | listing    |       2 | sellerid       | false        |                     | 2017-05-03 18:27:41
public      | listing    |       3 | eventid        | true         | 2017-05-16 20:54:32 | 2017-05-03 18:27:41
public      | listing    |       4 | dateid         | false        |                     | 2017-05-03 18:27:41
public      | listing    |       5 | numtickets     | false        |                     | 2017-05-03 18:27:41
public      | listing    |       6 | priceperticket | false        |                     | 2017-05-03 18:27:41
public      | listing    |       7 | totalprice     | false        |                     | 2017-05-03 18:27:41
public      | listing    |       8 | listtime       | true         | 2017-05-16 20:54:32 | 2017-05-03 18:27:41

Menjaga statistik terkini meningkatkan kinerja kueri dengan memungkinkan perencana kueri untuk memilih rencana yang optimal. Amazon Redshift menyegarkan statistik secara otomatis di latar belakang, dan Anda juga dapat menjalankan perintah ANALYZE secara eksplisit. Jika Anda memilih untuk menjalankan ANALYZE secara eksplisit, lakukan hal berikut:

  • Jalankan perintah ANALYZE sebelum menjalankan query.

  • Jalankan perintah ANALYZE pada database secara rutin di akhir setiap siklus pemuatan atau pembaruan reguler.

  • Jalankan perintah ANALYZE pada setiap tabel baru yang Anda buat dan setiap tabel atau kolom yang ada yang mengalami perubahan signifikan.

  • Pertimbangkan untuk menjalankan operasi ANALYZE pada jadwal yang berbeda untuk berbagai jenis tabel dan kolom, tergantung pada penggunaannya dalam kueri dan kecenderungannya untuk berubah.

  • Untuk menghemat waktu dan sumber daya cluster, gunakan klausa PREDICATE COLUMNS saat Anda menjalankan ANALYZE.

Anda tidak perlu menjalankan perintah ANALYZE secara eksplisit setelah memulihkan snapshot ke cluster yang disediakan atau namespace tanpa server, atau setelah melanjutkan cluster yang telah dijeda. Amazon Redshift mempertahankan informasi tabel sistem dalam kasus ini, membuat perintah ANALYZE manual tidak diperlukan. Amazon Redshift akan terus menjalankan operasi analisis otomatis sesuai kebutuhan.

Operasi analisis melewatkan tabel yang memiliki statistik terkini. Jika Anda menjalankan ANALYZE sebagai bagian dari alur kerja ekstrak, transformasi, dan muat (ETL), analisis otomatis akan melewatkan tabel yang memiliki statistik saat ini. Demikian pula, ANALISIS eksplisit melewatkan tabel ketika analisis otomatis telah memperbarui statistik tabel.

RIWAYAT PERINTAH ANALYSIS

Sangat berguna untuk mengetahui kapan perintah ANALYZE terakhir dijalankan pada tabel atau database. Saat perintah ANALYZE dijalankan, Amazon Redshift menjalankan beberapa kueri yang terlihat seperti ini:

padb_fetch_sample: select * from table_name

Kueri STL_ANALYZE untuk melihat riwayat operasi analisis. Jika Amazon Redshift menganalisis tabel menggunakan analisis otomatis, is_background kolom disetel ke t (true). Jika tidak, itu disetel ke f (false). Contoh berikut bergabung dengan STV_TBL_PERM untuk menampilkan nama tabel dan detail runtime.

select distinct a.xid, trim(t.name) as name, a.status, a.rows, a.modified_rows, a.starttime, a.endtime from stl_analyze a join stv_tbl_perm t on t.id=a.table_id where name = 'users' order by starttime; xid | name | status | rows | modified_rows | starttime | endtime -------+-------+-----------------+-------+---------------+---------------------+-------------------- 1582 | users | Full | 49990 | 49990 | 2016-09-22 22:02:23 | 2016-09-22 22:02:28 244287 | users | Full | 24992 | 74988 | 2016-10-04 22:50:58 | 2016-10-04 22:51:01 244712 | users | Full | 49984 | 24992 | 2016-10-04 22:56:07 | 2016-10-04 22:56:07 245071 | users | Skipped | 49984 | 0 | 2016-10-04 22:58:17 | 2016-10-04 22:58:17 245439 | users | Skipped | 49984 | 1982 | 2016-10-04 23:00:13 | 2016-10-04 23:00:13 (5 rows)

Atau, Anda dapat menjalankan kueri yang lebih kompleks yang mengembalikan semua pernyataan yang berjalan di setiap transaksi selesai yang menyertakan perintah ANALYZE:

select xid, to_char(starttime, 'HH24:MM:SS.MS') as starttime, datediff(sec,starttime,endtime ) as secs, substring(text, 1, 40) from svl_statementtext where sequence = 0 and xid in (select xid from svl_statementtext s where s.text like 'padb_fetch_sample%' ) order by xid desc, starttime; xid | starttime | secs | substring -----+--------------+------+------------------------------------------ 1338 | 12:04:28.511 | 4 | Analyze date 1338 | 12:04:28.511 | 1 | padb_fetch_sample: select count(*) from 1338 | 12:04:29.443 | 2 | padb_fetch_sample: select * from date 1338 | 12:04:31.456 | 1 | padb_fetch_sample: select * from date 1337 | 12:04:24.388 | 1 | padb_fetch_sample: select count(*) from 1337 | 12:04:24.388 | 4 | Analyze sales 1337 | 12:04:25.322 | 2 | padb_fetch_sample: select * from sales 1337 | 12:04:27.363 | 1 | padb_fetch_sample: select * from sales ...