Sort keys memungkinkan AnalyticDB for PostgreSQL melewati sebagian besar blok disk selama pemindaian tabel, sehingga secara drastis mengurangi waktu respons kueri untuk kueri yang dibatasi rentang. Fitur ini berlaku untuk tabel berorientasi kolom dengan penyimpanan append-only dan paling efektif ketika kueri secara konsisten melakukan filter pada sekumpulan kolom yang dapat diprediksi.
Fitur ini berlaku untuk:
-
Instans mode Reserved dengan versi kernel lebih baru dari 20200826
-
Instans mode Elastic dengan versi kernel lebih baru dari 20200906
Cara kerja
AnalyticDB for PostgreSQL menyimpan data berorientasi kolom dalam blok disk. Untuk setiap blok, database mencatat nilai minimum dan maksimum setiap kolom—struktur ini disebut rough set index. Ketika sebuah kueri mencakup predikat rentang dalam klausa WHERE, prosesor kueri membandingkan predikat tersebut dengan nilai min/maks setiap blok dan melewatkan blok apa pun yang berada di luar rentang tersebut.
Semakin erat korelasi data Anda dengan sort key, semakin banyak blok yang dapat dieliminasi. Misalnya, jika sebuah tabel berisi data selama tujuh tahun yang diurutkan berdasarkan tanggal dan sebuah kueri melakukan filter pada satu bulan tertentu, hanya 1/(7 × 12) data yang perlu dipindai—mengeliminasi sekitar 98,8% blok disk. Tanpa pengurutan, semua blok mungkin harus dipindai.
AnalyticDB for PostgreSQL mendukung dua metode pengurutan:
| Metode | Perilaku | Paling cocok untuk |
|---|---|---|
| Compound sorting | Mengurutkan data sebagai tupel terurut dari semua kolom sort key, dengan memprioritaskan kolom pertama | Kueri yang melakukan filter pada kolom pertama (leading) dari sort key |
| Interleaved sorting | Memberikan bobot yang sama pada setiap kolom dalam sort key | Kueri yang melakukan filter pada subset apa pun dari kolom sort key, termasuk kolom non-leading |
Untuk perbandingan performa mendetail, lihat Perbandingan performa: compound vs. interleaved sorting.
Kapan menggunakan sort keys
Sort keys memberikan manfaat pada tabel yang memenuhi semua kriteria berikut:
-
Kueri selektif: kueri melakukan filter pada subset kecil baris menggunakan predikat rentang atau kesamaan dalam klausa WHERE.
-
Kolom filter konsisten: persentase tinggi kueri melakukan filter pada kolom yang sama.
-
Ukuran tabel besar: keuntungan performa meningkat seiring ukuran tabel. Sort keys paling berdampak pada tabel dengan ratusan juta baris atau lebih.
Sort keys menambahkan overhead maintenance: setelah data dimuat, Anda harus secara eksplisit mengurutkan tabel, dan Anda harus mengurutkannya kembali secara berkala seiring akumulasi data baru. Jika workload Anda memiliki laju tulis tinggi dengan kueri ad-hoc yang jarang, biaya maintenance mungkin lebih besar daripada percepatan kueri yang diperoleh.
Pilih metode pengurutan
Gunakan panduan berikut untuk memilih metode yang tepat sesuai pola kueri Anda:
-
Jika sebagian besar kueri melakukan filter pada kolom leading dari sort key, gunakan compound sorting. Metode ini menghasilkan waktu respons tercepat untuk predikat pada kolom leading. Perhatikan bahwa pengurutan ulang dengan compound sorting membutuhkan waktu lebih lama dibandingkan interleaved sorting karena melakukan analisis data tambahan.
-
Jika kueri melakukan filter pada kolom non-leading atau pada subset arbitrer dari sort key, gunakan interleaved sorting. Sort key interleaved mendukung hingga delapan kolom. Semakin banyak kolom sort key yang direferensikan oleh kueri, semakin besar keuntungan performanya.
-
Jika Anda tidak yakin, mulailah dengan compound sorting. Ini adalah pilihan yang lebih sederhana dan memberikan performa terbaik ketika kueri memiliki kolom filter leading yang jelas.
Tentukan sort key saat membuat tabel
Gunakan klausa ORDER BY dalam perintah CREATE TABLE untuk menetapkan satu atau beberapa kolom sebagai sort key. Tabel harus menggunakan penyimpanan berorientasi kolom dengan mode append-only (APPENDONLY=true, ORIENTATION=column).
create table test(date text, time text, open float, high float, low float, volume int)
with(APPENDONLY=true,ORIENTATION=column) ORDER BY (volume);
Sintaks lengkap:
CREATE [[GLOBAL | LOCAL] {TEMPORARY | TEMP}] TABLE table_name (
column_name data_type [, ...]
)
[ DISTRIBUTED BY (column [, ...]) | DISTRIBUTED RANDOMLY ]
[ ORDER BY (column [, ...]) ]
Jika versi kernel Anda lebih lama dari 20210326, gunakanSORTKEY (column [, ...])sebagai gantiORDER BY (column [, ...])untuk menentukan sort key.
Urutkan tabel
Menentukan sort key tidak secara otomatis mengurutkan data. Setelah menulis data ke tabel, jalankan perintah pengurutan untuk menerapkan urutan pengurutan dan membangun rough set index.
Compound sorting:
SORT table_name;
Interleaved sorting:
MULTISORT table_name;
Jika versi kernel Anda lebih lama dari 20210326, gunakanVACUUM SORT ONLY table_nameuntuk compound sorting danVACUUM REINDEX table_nameuntuk interleaved sorting.
Saat baris baru ditambahkan ke tabel yang telah diurutkan, data yang belum diurutkan akan menumpuk dan filtering rough set menjadi kurang efektif. Jalankan SORT atau MULTISORT secara berkala untuk mempertahankan performa kueri.
Ubah sort key
Untuk mengubah sort key pada tabel berorientasi kolom yang sudah ada:
ALTER TABLE table_name SET ORDER BY (column [, ...]);
Pernyataan ini hanya memperbarui katalog—tidak mengurutkan data. Jalankan SORT table_name setelahnya untuk menerapkan urutan pengurutan baru.
Contoh:
ALTER TABLE test SET ORDER BY (high, low);
SORT test;
Jika versi kernel Anda lebih lama dari 20210326, gunakan ALTER TABLE test SET SORTKEY (high, low).
Batasan
| Item | Batas |
|---|---|
| Jumlah maksimum kolom sort key (interleaved sorting) | 8 |
| Jenis penyimpanan tabel | Hanya berorientasi kolom, append-only (APPENDONLY=true, ORIENTATION=column) |
Versi kernel untuk sintaks ORDER BY / SORT / MULTISORT |
Setelah 26 Maret 2021 |
Versi kernel untuk sintaks lawas SORTKEY / VACUUM SORT ONLY / VACUUM REINDEX |
20210326 atau sebelumnya |
Perbandingan performa: compound vs. interleaved sorting
Benchmark TPC-H: dampak sort key pada kueri rentang
Bagian ini menunjukkan bagaimana compound sorting meningkatkan performa kueri untuk rough set indexes dibandingkan dengan full table scan, menggunakan tabel Lineitem TPC-H yang menyimpan data selama tujuh tahun.
Implementasi TPC ini berasal dari TPC Benchmark dan tidak dapat dibandingkan dengan hasil TPC Benchmark yang dipublikasikan, karena implementasi ini tidak memenuhi semua persyaratan TPC Benchmark.
Pengaturan pengujian:
-
Buat instans 32 node.
-
Tulis 13 miliar baris ke tabel Lineitem.
-
Lakukan kueri data dalam rentang waktu dari 1997-09-01 hingga 1997-09-30, bandingkan hasil ketika data diurutkan berdasarkan
l_shipdateversus data yang tidak diurutkan.
Compound vs. interleaved: performa berdasarkan bentuk kueri
Contoh berikut menggunakan dua tabel dengan data dan sort key identik untuk menunjukkan bagaimana kedua metode ini berperforma pada berbagai bentuk kueri.
Pengaturan pengujian:
-
Dua tabel (
testdantest_multi), masing-masing dengan empat kolom:id,num1,num2,value -
Sort key:
(id, num1, num2)pada kedua tabel -
10 juta baris per tabel
-
testdiurutkan dengan compound sorting (SORT test) -
test_multidiurutkan dengan interleaved sorting (MULTISORT test_multi)
Buat tabel dan masukkan data:
CREATE TABLE test (id int, num1 int, num2 int, value varchar)
WITH (APPENDONLY=TRUE, ORIENTATION=column)
DISTRIBUTED BY (id)
ORDER BY (id, num1, num2);
CREATE TABLE test_multi (id int, num1 int, num2 int, value varchar)
WITH (APPENDONLY=TRUE, ORIENTATION=column)
DISTRIBUTED BY (id)
ORDER BY (id, num1, num2);
INSERT INTO test (id, num1, num2, value)
SELECT g,
(random() * 10000000)::int,
(random() * 10000000)::int,
(ARRAY['foo', 'bar', 'baz', 'quux', 'boy', 'girl', 'mouse', 'child', 'phone'])[floor(random() * 10 + 1)]
FROM generate_series(1, 10000000) AS g;
INSERT INTO test_multi SELECT * FROM test;
SORT test;
MULTISORT test_multi;
Performa kueri titik
Ketiga kueri melakukan filter pada kolom sort key, tetapi pada posisi yang berbeda.
-- Q1: filter pada kolom leading (id)
SELECT * FROM test WHERE id = 100000;
SELECT * FROM test_multi WHERE id = 100000;
-- Q2: filter pada kolom kedua (num1)
SELECT * FROM test WHERE num1 = 8766963;
SELECT * FROM test_multi WHERE num1 = 8766963;
-- Q3: filter pada kolom kedua dan ketiga (num1, num2)
SELECT * FROM test WHERE num1 = 100000 AND num2 = 2904114;
SELECT * FROM test_multi WHERE num1 = 100000 AND num2 = 2904114;
| Query | Kolom filter | Pengurutan majemuk | Pengurutan interleaved |
|---|---|---|---|
| Q1 | Kolom utama (id) | 0,026s | 0,55s |
| Q2 | Kolom kedua (num1) | 3,95s | 0,42s |
| Q3 | Kolom kedua + ketiga (num1, num2) | 4,21s | 0,071s |
Performa kueri rentang
-- Q1: filter rentang pada kolom leading (id)
SELECT count(*) FROM test WHERE id > 5000 AND id < 100000;
SELECT count(*) FROM test_multi WHERE id > 5000 AND id < 100000;
-- Q2: filter rentang pada kolom kedua (num1)
SELECT count(*) FROM test WHERE num1 > 5000 AND num1 < 100000;
SELECT count(*) FROM test_multi WHERE num1 > 5000 AND num1 < 100000;
-- Q3: filter rentang pada kolom kedua dan ketiga (num1, num2)
SELECT count(*) FROM test WHERE num1 > 5000 AND num1 < 100000 AND num2 < 100000;
SELECT count(*) FROM test_multi WHERE num1 > 5000 AND num1 < 100000 AND num2 < 100000;
| Kueri | Kolom filter | Compound sorting | Interleaved sorting |
|---|---|---|---|
| Q1 | Kolom leading (id) | 0,07s | 0,44s |
| Q2 | Kolom kedua (num1) | 3,35s | 0,28s |
| Q3 | Kolom kedua + ketiga (num1, num2) | 3,64s | 0,047s |
Poin utama
-
Compound sorting unggul pada kolom leading. Hasil Q1 menunjukkan compound sorting memiliki waktu respons kueri lebih singkat dibandingkan interleaved sorting ketika filter menargetkan kolom sort key pertama.
-
Interleaved sorting unggul pada kolom non-leading. Hasil Q2 dan Q3 menunjukkan interleaved sorting jauh lebih unggul dibandingkan compound sorting ketika kueri melewati kolom leading.
-
Interleaved sorting meningkat seiring jumlah kolom. Semakin banyak kolom sort key yang direferensikan oleh kueri, semakin besar keunggulan performa interleaved sorting (Q3 vs. Q2).
Pengujian ini menggunakan 10 juta baris—ukuran yang masih moderat untuk AnalyticDB for PostgreSQL. Perbedaan performa antara kedua metode ini lebih mencolok pada tabel yang lebih besar.