Topik ini menjelaskan indeks yang didukung di Hologres, seperti kunci distribusi, kolom waktu kejadian (kunci segmen), dan kunci pengelompokan. Ini membantu Anda memahami cara menggunakan indeks dalam pengembangan Hologres untuk meningkatkan kinerja kueri.
Cara kerja Hologres
Hologres adalah gudang data terdistribusi yang menggunakan teknik komputasi paralel dan vektor untuk menanggapi kueri dalam hitungan detik. Distribution key dan event time column menentukan distribusi data dan memiliki dampak signifikan pada kinerja kueri. Data didistribusikan ke node berdasarkan kunci distribusi, dan file diurutkan dalam sebuah node berdasarkan kolom waktu kejadian. Dalam skenario pemrosesan analitik online (OLAP), penyimpanan berorientasi kolom digunakan secara default di Hologres. Konfigurasi clustering key juga penting karena menentukan bagaimana data diurutkan dalam sebuah file. Konfigurasi indeks yang tepat dapat meningkatkan kinerja kueri secara signifikan. Kami merekomendasikan agar Anda mengonfigurasi kunci distribusi, kolom waktu kejadian, dan kunci pengelompokan saat membuat tabel. Jika Anda mengonfigurasi indeks ini untuk tabel yang sudah ada, biaya penyesuaian akan tinggi. Untuk tabel yang sudah ada, Anda dapat mengonfigurasi indeks lain yang tidak memengaruhi distribusi data secara langsung, seperti Indeks bitmap dan properti pengkodean kamus, sesuai kebutuhan bisnis Anda.
Metadata di Hologres menggunakan model tiga lapis yang terdiri dari lapisan basis data, lapisan skema, dan lapisan tabel. Kami merekomendasikan menyimpan tabel yang secara logis terkait dalam skema yang sama untuk mencegah kueri lintas database. Metadata diisolasi oleh basis data, tetapi sumber daya tidak diisolasi oleh basis data.
Prinsip dasar optimasi SQL: Kurangi konsumsi sumber daya I/O dan optimalkan konkurensi
Jika Anda mengonfigurasi indeks yang sesuai untuk distribusi data saat membuat tabel, data yang ingin Anda kueri dapat ditemukan dengan cepat setelah pernyataan SQL dieksekusi. Hal ini mengurangi konsumsi sumber daya I/O dan komputasi serta mempercepat kueri. Distribusi data yang seimbang juga membantu meningkatkan pemanfaatan sumber daya konkuren dan mencegah kemacetan pada satu node. Gambar berikut menunjukkan proses eksekusi dari mengeksekusi pernyataan SQL hingga mendapatkan data. Ini membantu Anda memahami bagaimana konsumsi sumber daya I/O dikurangi.
Pemangkasan partisi: Jika Anda melakukan kueri SQL pada tabel yang dipartisi, sistem menemukan partisi tempat data yang diperlukan berada dengan menggunakan fitur pemangkasan partisi. Jika tidak ada partisi yang cocok berdasarkan kondisi kueri, sistem perlu melintasi semua partisi, yang mengonsumsi sumber daya I/O berlebihan. Dalam banyak kasus, partisi per hari lebih sesuai. Untuk tabel non-partisi, pemangkasan partisi tidak terlibat.
Pemangkasan shard: Anda dapat menggunakan kunci distribusi untuk dengan cepat menemukan shard tempat data yang diinginkan berada. Ini mengurangi sumber daya yang dibutuhkan oleh satu pernyataan SQL dan mendukung throughput tinggi jika beberapa pernyataan SQL dieksekusi pada saat yang sama. Jika shard spesifik tidak dapat ditemukan, sistem menjadwalkan semua shard untuk komputasi berdasarkan kerangka kerja terdistribusi. Dalam hal ini, satu pernyataan SQL dieksekusi pada beberapa shard, yang mengonsumsi sejumlah besar sumber daya dan menurunkan konkurensi keseluruhan sistem. Biaya shuffle tambahan terjadi jika operator tertentu dieksekusi secara terpusat. Dalam banyak kasus, Anda dapat mengonfigurasi bidang yang nilainya didistribusikan secara merata sebagai bidang kunci distribusi, seperti ID pesanan, ID pengguna, dan ID acara. Kami merekomendasikan agar Anda mengonfigurasi kunci distribusi yang sama untuk tabel yang ingin Anda gabungkan untuk memungkinkan data terkait didistribusikan ke shard yang sama. Ini membantu mencapai efisiensi tinggi dalam operasi join lokal.
Pemangkasan kunci segmen: Anda dapat menggunakan kolom waktu kejadian untuk dengan cepat menemukan file tempat data yang diperlukan berada dari beberapa file pada node. Ini menghilangkan kebutuhan untuk mengakses file lainnya. Jika penyaringan gagal, sistem perlu melintasi semua file.
Pemangkasan kunci pengelompokan: Anda dapat menggunakan kunci pengelompokan untuk dengan cepat menemukan rentang data yang diinginkan dalam sebuah file. Ini membantu meningkatkan efisiensi kueri rentang dan pengurutan bidang.
Praktik untuk optimasi SQL
Bagian ini menjelaskan cara mengonfigurasi indeks di Hologres untuk mencapai kinerja yang lebih baik dalam kueri TPC-H. Untuk informasi lebih lanjut tentang kueri TPC-H, lihat Rencana Pengujian.
Contoh kueri SQL TPC-H
TPC-H Q1
TPC-H Q1 digunakan untuk mengumpulkan dan menyaring data di kolom tertentu dari tabel lineitem.
l_shipdate <=: Menyaring data. Anda harus mengonfigurasi indeks untuk memungkinkan penyaringan data berdasarkan rentang waktu.
--TPC-H Q1
SELECT
l_returnflag,
l_linestatus,
SUM(l_quantity) AS sum_qty,
SUM(l_extendedprice) AS sum_base_price,
SUM(l_extendedprice * (1 - l_discount)) AS sum_disc_price,
SUM(l_extendedprice * (1 - l_discount) * (1 + l_tax)) AS sum_charge,
AVG(l_quantity) AS avg_qty,
AVG(l_extendedprice) AS avg_price,
AVG(l_discount) AS avg_disc,
COUNT(*) AS count_order
FROM
lineitem
WHERE
l_shipdate <= DATE '1998-12-01' - INTERVAL '120' DAY
GROUP BY
l_returnflag,
l_linestatus
ORDER BY
l_returnflag,
l_linestatus;TPC-H Q4
TPC-H Q4 terutama dilakukan untuk menggabungkan tabel lineitem dan orders.
o_orderdate >= DATE '1996-07-01': Menyaring data. Anda harus mengonfigurasi indeks untuk memungkinkan penyaringan data berdasarkan rentang waktu.l_orderkey = o_orderkey: Menggabungkan dua tabel. Jika memungkinkan, konfigurasikan indeks yang sama untuk kedua tabel untuk memungkinkan join lokal. Ini membantu mengurangi pengacakan data antara dua tabel.--TPC-H Q4 SELECT o_orderpriority, COUNT(*) AS order_count FROM orders WHERE o_orderdate >= DATE '1996-07-01' AND o_orderdate < DATE '1996-07-01' + INTERVAL '3' MONTH AND EXISTS ( SELECT * FROM lineitem WHERE l_orderkey = o_orderkey AND l_commitdate < l_receiptdate ) GROUP BY o_orderpriority ORDER BY o_orderpriority;
Saran untuk pembuatan tabel
Berikut ini adalah saran untuk membuat tabel lineitem dan orders yang digunakan dalam TPC-H Q1 dan Q4.
hologres_dataset_tpch_100g.lineitem
Konfigurasi indeks dan kondisi kueri untuk tabel lineitem bervariasi dalam TPC-H Q1 dan TPC-H Q4.
TPC-H Q1: Kolom l_shipdate menentukan urutan waktu data dalam file dan digunakan untuk penyaringan rentang. Anda dapat mengonfigurasi kolom l_shipdate sebagai kolom kunci pengelompokan untuk mempercepat penyaringan rentang. Kolom waktu kejadian digunakan untuk mengurutkan file. Kami merekomendasikan agar Anda mengonfigurasi kolom tanggal di mana tanggal bertambah atau berkurang secara monotonik sebagai kolom waktu kejadian untuk memfasilitasi penyaringan file. Dalam TPC-H Q1, Anda dapat mengonfigurasi kolom l_shipdate sebagai kolom waktu kejadian.
TPC-H Q4: Kueri join dilakukan berdasarkan kolom l_orderkey dari tabel lineitem dan kolom o_orderkey dari tabel orders. Data didistribusikan berdasarkan kunci distribusi. Sistem mendistribusikan catatan data dengan nilai kunci distribusi yang sama ke shard yang sama. Jika dua tabel disimpan dalam grup tabel yang sama dan digabungkan berdasarkan kunci distribusi, sistem secara otomatis mendistribusikan catatan data yang memiliki nilai kunci distribusi yang sama ke shard yang sama. Selama penulisan data, join lokal dilakukan pada node saat ini, dan pengacakan data berdasarkan kunci join tidak diperlukan. Ini mencegah penyebaran dan redistribusi data selama runtime dan secara signifikan meningkatkan efisiensi eksekusi. Oleh karena itu, kami merekomendasikan agar Anda mengonfigurasi kolom l_orderkey sebagai kunci distribusi.
Berikut ini adalah contoh kode untuk membuat tabel lineitem:
BEGIN; CREATE TABLE hologres_dataset_tpch_100g.lineitem ( l_ORDERKEY BIGINT NOT NULL, L_PARTKEY INT NOT NULL, L_SUPPKEY INT NOT NULL, L_LINENUMBER INT NOT NULL, L_QUANTITY DECIMAL(15,2) NOT NULL, L_EXTENDEDPRICE DECIMAL(15,2) NOT NULL, L_DISCOUNT DECIMAL(15,2) NOT NULL, L_TAX DECIMAL(15,2) NOT NULL, L_RETURNFLAG TEXT NOT NULL, L_LINESTATUS TEXT NOT NULL, L_SHIPDATE TIMESTAMPTZ NOT NULL, L_COMMITDATE TIMESTAMPTZ NOT NULL, L_RECEIPTDATE TIMESTAMPTZ NOT NULL, L_SHIPINSTRUCT TEXT NOT NULL, L_SHIPMODE TEXT NOT NULL, L_COMMENT TEXT NOT NULL, PRIMARY KEY (L_ORDERKEY,L_LINENUMBER) ) WITH ( distribution_key = 'L_ORDERKEY',-- Tentukan kunci distribusi untuk memungkinkan join lokal. clustering_key = 'L_SHIPDATE',-- Tentukan kunci pengelompokan untuk mempercepat penyaringan rentang. event_time_column = 'L_SHIPDATE'-- Tentukan kolom waktu kejadian untuk mempercepat pemangkasan file. ); COMMIT;
hologres_dataset_tpch_100g.orders
Dalam contoh ini, tabel orders digunakan dalam TPC-H Q4.
Konfigurasikan kolom o_orderkey dalam tabel orders sebagai kunci distribusi untuk memungkinkan join lokal. Ini membantu meningkatkan efisiensi kueri join.
Konfigurasikan kolom o_orderdate dalam tabel orders sebagai kolom waktu kejadian untuk mempercepat pemangkasan file. Kolom o_orderdate berisi informasi tanggal dan dapat digunakan untuk penyaringan.
Berikut ini adalah contoh kode untuk membuat tabel orders:
BEGIN; CREATE TABLE hologres_dataset_tpch_100g.orders ( O_ORDERKEY BIGINT NOT NULL PRIMARY KEY, O_CUSTKEY INT NOT NULL, O_ORDERSTATUS TEXT NOT NULL, O_TOTALPRICE DECIMAL(15,2) NOT NULL, O_ORDERDATE timestamptz NOT NULL, O_ORDERPRIORITY TEXT NOT NULL, O_CLERK TEXT NOT NULL, O_SHIPPRIORITY INT NOT NULL, O_COMMENT TEXT NOT NULL ) WITH ( distribution_key = 'O_ORDERKEY',-- Tentukan kunci distribusi untuk memungkinkan join lokal. event_time_column = 'O_ORDERDATE'-- Tentukan kolom waktu kejadian untuk mempercepat pemangkasan file. ); COMMIT;
Impor data sampel
Gunakan HoloWeb untuk mengimpor 100 GB data dari dataset publik TPC-H ke instance Hologres hanya dengan beberapa klik. Untuk informasi lebih lanjut, lihat Impor Dataset Publik dengan Beberapa Klik.
Perbandingan hasil uji kinerja
Berikut ini adalah hasil uji kinerja sebelum dan sesudah indeks dikonfigurasi untuk tabel.
Lingkungan Pengujian
Spesifikasi instans: 32 core CPU
Tipe jaringan: virtual private cloud (VPC)
Lakukan setiap kueri dua kali pada klien PostgreSQL, dan gunakan latensi kueri kedua.
Kesimpulan Pengujian
Untuk kueri pada tabel tunggal yang melibatkan penyaringan, Anda dapat mengonfigurasi kolom berdasarkan data yang difilter sebagai kolom kunci pengelompokan untuk secara signifikan mempercepat kueri.
Untuk kueri join multi-tabel, Anda dapat mengonfigurasi kolom join sebagai kolom kunci distribusi untuk secara signifikan mempercepat operasi join.
Kueri
Latensi ketika indeks dikonfigurasi di Hologres
Latensi ketika indeks tidak dikonfigurasi di Hologres
Q1
48.293 ms
59.483 ms
Q4
822.389 ms
3027.957 ms
Referensi
Baca lebih lanjut
Aktivasi layanan
Untuk informasi lebih lanjut tentang cara memilih spesifikasi instans, lihat Manajemen Instans.
Untuk informasi lebih lanjut tentang pengguna RAM, lihat Berikan Izin kepada Pengguna RAM.
Impor data
Untuk informasi lebih lanjut tentang cara menggunakan Flink untuk menulis data secara real-time dan cara menggunakan tabel dimensi dalam kueri, lihat Gunakan Flink yang Sepenuhnya Dikelola
Untuk informasi lebih lanjut tentang cara menyinkronkan data secara real-time dari database seperti MySQL, Oracle, dan PolarDB, lihat Konfigurasikan Sumber Data untuk Sinkronisasi Data dari MySQL.
Untuk informasi lebih lanjut tentang cara mengimpor data dari Object Storage Service (OSS), lihat Gunakan DLF untuk Membaca Data dari dan Menulis Data ke OSS.
Jika Anda ingin menulis data, Anda dapat menggunakan rencana tetap untuk meningkatkan efisiensi hingga 10 kali lipat. Untuk informasi lebih lanjut, lihat Percepat Eksekusi Pernyataan SQL dengan Menggunakan Rencana Tetap.
Kueri data
Untuk informasi lebih lanjut tentang cara membuat tabel dalam berbagai skenario, lihat Panduan Pembuatan Tabel Spesifik Skenario dan Tuning.
Sebelum Anda membuat tabel, Anda harus memahami sintaksis dan penggunaan kunci distribusi, kunci pengelompokan, kolom waktu kejadian, dan indeks bitmap. Indeks ini membantu meningkatkan kinerja kueri berkali-kali lipat. Untuk informasi lebih lanjut, lihat CREATE TABLE.
Untuk informasi lebih lanjut tentang cara mengoptimalkan kinerja kueri pada tabel internal Hologres, lihat Optimalkan Kinerja Kueri.
Untuk informasi lebih lanjut tentang cara mempercepat kueri pada data MaxCompute, lihat Gunakan Tabel Asing di Hologres untuk Mempercepat Kueri pada Data MaxCompute.
O&M dan pemantauan
Untuk informasi lebih lanjut tentang cara mengidentifikasi kueri yang sedang berjalan dan memeriksa apakah kueri memperoleh kunci atau menunggu kunci dilepaskan, lihat Kelola Kueri.
Untuk informasi lebih lanjut tentang cara mengidentifikasi kueri yang gagal dan kueri lambat, lihat Kueri dan Analisis Log Kueri Lambat.
Untuk informasi lebih lanjut tentang pemisahan baca/tulis dan isolasi beban, lihat Konfigurasikan Pemisahan Baca/Tulis untuk Instans Utama dan Sekunder (Penyimpanan Bersama).