Kueri diagnostik untuk penyetelan kueri - Amazon Redshift

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

Kueri diagnostik untuk penyetelan kueri

Gunakan kueri berikut untuk mengidentifikasi masalah dengan kueri atau tabel dasar yang dapat memengaruhi kinerja kueri. Sebaiknya gunakan kueri ini dengan proses penyetelan kueri yang dibahas di. Menganalisis dan meningkatkan kueri

Mengidentifikasi kueri yang merupakan kandidat teratas untuk penyetelan

Kueri berikut mengidentifikasi 50 pernyataan paling memakan waktu teratas yang telah dijalankan dalam 7 hari terakhir. Anda dapat menggunakan hasilnya untuk mengidentifikasi kueri yang membutuhkan waktu yang sangat lama. Anda juga dapat mengidentifikasi kueri yang sering dijalankan (kueri yang muncul lebih dari sekali dalam kumpulan hasil). Kueri ini seringkali merupakan kandidat yang baik untuk penyetelan guna meningkatkan kinerja sistem.

Kueri ini juga menyediakan hitungan peristiwa peringatan yang terkait dengan setiap kueri yang diidentifikasi. Peringatan ini memberikan detail yang dapat Anda gunakan untuk meningkatkan kinerja kueri. Untuk informasi selengkapnya, lihat Meninjau peringatan kueri.

select trim(database) as db, count(query) as n_qry, max(substring (qrytext,1,80)) as qrytext, min(run_minutes) as "min" , max(run_minutes) as "max", avg(run_minutes) as "avg", sum(run_minutes) as total, max(query) as max_query_id, max(starttime)::date as last_run, sum(alerts) as alerts, aborted from (select userid, label, stl_query.query, trim(database) as database, trim(querytxt) as qrytext, md5(trim(querytxt)) as qry_md5, starttime, endtime, (datediff(seconds, starttime,endtime)::numeric(12,2))/60 as run_minutes, alrt.num_events as alerts, aborted from stl_query left outer join (select query, 1 as num_events from stl_alert_event_log group by query ) as alrt on alrt.query = stl_query.query where userid <> 1 and starttime >= dateadd(day, -7, current_date)) group by database, label, qry_md5, aborted order by total desc limit 50;

Mengidentifikasi tabel dengan data miring atau baris yang tidak disortir

Kueri berikut mengidentifikasi tabel yang memiliki distribusi data yang tidak merata (data miring) atau persentase tinggi dari baris yang tidak disortir.

skewNilai rendah menunjukkan bahwa data tabel didistribusikan dengan benar. Jika tabel memiliki skew nilai 4,00 atau lebih tinggi, pertimbangkan untuk memodifikasi gaya distribusi datanya. Untuk informasi selengkapnya, lihat Distribusi data suboptimal.

Jika tabel memiliki pct_unsorted nilai lebih besar dari 20 persen, pertimbangkan untuk menjalankan VAKUM perintah. Untuk informasi selengkapnya, lihat Baris yang tidak disortir atau disortir.

Juga tinjau mbytes dan pct_of_total nilai untuk setiap tabel. Kolom ini mengidentifikasi ukuran tabel dan berapa persentase ruang disk mentah yang dikonsumsi tabel. Ruang disk mentah mencakup ruang yang dicadangkan oleh Amazon Redshift untuk penggunaan internal, sehingga lebih besar dari kapasitas disk nominal, yang merupakan jumlah ruang disk yang tersedia untuk pengguna. Gunakan informasi ini untuk memverifikasi bahwa Anda memiliki ruang disk kosong sama dengan setidaknya 2,5 kali ukuran tabel terbesar Anda. Memiliki ruang ini memungkinkan sistem untuk menulis hasil perantara ke disk saat memproses kueri kompleks.

select trim(pgn.nspname) as schema, trim(a.name) as table, id as tableid, decode(pgc.reldiststyle,0, 'even',1,det.distkey ,8,'all') as distkey, dist_ratio.ratio::decimal(10,4) as skew, det.head_sort as "sortkey", det.n_sortkeys as "#sks", b.mbytes, decode(b.mbytes,0,0,((b.mbytes/part.total::decimal)*100)::decimal(5,2)) as pct_of_total, decode(det.max_enc,0,'n','y') as enc, a.rows, decode( det.n_sortkeys, 0, null, a.unsorted_rows ) as unsorted_rows , decode( det.n_sortkeys, 0, null, decode( a.rows,0,0, (a.unsorted_rows::decimal(32)/a.rows)*100) )::decimal(5,2) as pct_unsorted from (select db_id, id, name, sum(rows) as rows, sum(rows)-sum(sorted_rows) as unsorted_rows from stv_tbl_perm a group by db_id, id, name) as a join pg_class as pgc on pgc.oid = a.id join pg_namespace as pgn on pgn.oid = pgc.relnamespace left outer join (select tbl, count(*) as mbytes from stv_blocklist group by tbl) b on a.id=b.tbl inner join (select attrelid, min(case attisdistkey when 't' then attname else null end) as "distkey", min(case attsortkeyord when 1 then attname else null end ) as head_sort , max(attsortkeyord) as n_sortkeys, max(attencodingtype) as max_enc from pg_attribute group by 1) as det on det.attrelid = a.id inner join ( select tbl, max(mbytes)::decimal(32)/min(mbytes) as ratio from (select tbl, trim(name) as name, slice, count(*) as mbytes from svv_diskusage group by tbl, name, slice ) group by tbl, name ) as dist_ratio on a.id = dist_ratio.tbl join ( select sum(capacity) as total from stv_partitions where part_begin=0 ) as part on 1=1 where mbytes is not null order by mbytes desc;

Mengidentifikasi kueri dengan loop bersarang

Kueri berikut mengidentifikasi kueri yang memiliki peristiwa peringatan dicatat untuk loop bersarang. Untuk informasi tentang cara memperbaiki kondisi loop bersarang, lihatLoop Bersarang.

select query, trim(querytxt) as SQL, starttime from stl_query where query in ( select distinct query from stl_alert_event_log where event like 'Nested Loop Join in the query plan%') order by starttime desc;

Meninjau waktu tunggu antrian untuk kueri

Kueri berikut menunjukkan berapa lama kueri terbaru menunggu slot terbuka dalam antrian kueri sebelum dijalankan. Jika Anda melihat tren waktu tunggu yang tinggi, Anda mungkin ingin mengubah konfigurasi antrian kueri Anda untuk throughput yang lebih baik. Untuk informasi selengkapnya, lihat Menerapkan manual WLM.

select trim(database) as DB , w.query, substring(q.querytxt, 1, 100) as querytxt, w.queue_start_time, w.service_class as class, w.slot_count as slots, w.total_queue_time/1000000 as queue_seconds, w.total_exec_time/1000000 exec_seconds, (w.total_queue_time+w.total_Exec_time)/1000000 as total_seconds from stl_wlm_query w left join stl_query q on q.query = w.query and q.userid = w.userid where w.queue_start_Time >= dateadd(day, -7, current_Date) and w.total_queue_Time > 0 and w.userid >1 and q.starttime >= dateadd(day, -7, current_Date) order by w.total_queue_time desc, w.queue_start_time desc limit 35;

Meninjau peringatan kueri berdasarkan tabel

Kueri berikut mengidentifikasi tabel yang memiliki peristiwa peringatan yang dicatat untuk mereka, dan juga mengidentifikasi jenis peringatan apa yang paling sering muncul.

Jika minutes nilai untuk baris dengan tabel yang diidentifikasi tinggi, periksa tabel tersebut untuk melihat apakah perlu pemeliharaan rutin, seperti memiliki MENGANALISA atau VAKUM menjalankannya.

Jika count nilainya tinggi untuk sebuah baris tetapi table nilainya nol, jalankan kueri terhadap STL_ALERT_EVENT_LOG untuk event nilai terkait guna menyelidiki mengapa peringatan itu sering muncul.

select trim(s.perm_table_name) as table, (sum(abs(datediff(seconds, s.starttime, s.endtime)))/60)::numeric(24,0) as minutes, trim(split_part(l.event,':',1)) as event, trim(l.solution) as solution, max(l.query) as sample_query, count(*) from stl_alert_event_log as l left join stl_scan as s on s.query = l.query and s.slice = l.slice and s.segment = l.segment and s.step = l.step where l.event_time >= dateadd(day, -7, current_Date) group by 1,3,4 order by 2 desc,6 desc;

Mengidentifikasi tabel dengan statistik yang hilang

Kueri berikut memberikan hitungan kueri yang Anda jalankan terhadap tabel yang tidak memiliki statistik. Jika query ini mengembalikan baris apapun, melihat plannode nilai untuk menentukan tabel terpengaruh, dan kemudian berjalan MENGANALISA di atasnya.

select substring(trim(plannode),1,100) as plannode, count(*) from stl_explain where plannode like '%missing statistics%' group by plannode order by 2 desc;