Bolehkah Postgres Mengoptimumkan Pertanyaan Maksimum Mengikut Kumpulan Tanpa Mengimbas Semua Baris?
Postgres tidak mempunyai pendekatan langsung untuk memaksimumkan pertanyaan kumpulan dengan cekap, seperti yang terbukti daripada imbasan meja penuh mahal diperhatikan dalam yang diberikan pertanyaan.
PENYELESAIAN
Untuk mengelakkan imbasan yang berlebihan, pertimbangkan untuk menggunakan jadual carian untuk pilihan dan memautkannya ke jadual rekod melalui option_id. Mewujudkan kekangan kunci asing antara jadual ini akan mengekalkan integriti rujukan.
SQL UNTUK PENCIPTAAN JADUAL LOOKUP:
CREATE TABLE options ( option_id int PRIMARY KEY , option text UNIQUE NOT NULL );
Sisipan Data daripada Rekod Sedia Ada Jadual:
INSERT INTO options SELECT DISTINCT option_id, 'option' || option_id FROM records;
Pertanyaan Dioptimumkan menggunakan Subquery:
SELECT option_id, (SELECT max(id) FROM records WHERE option_id = o.option_id) AS max_id FROM options o ORDER BY 1;
Sebagai alternatif, subkueri yang dioptimumkan boleh mendapatkan id maksimum:
SELECT option_id, (SELECT id FROM records WHERE option_id = o.option_id ORDER BY id DESC NULLS LAST LIMIT 1) AS max_id FROM options o ORDER BY 1;
Indeks Optimum untuk Pertanyaan Prestasi:
CREATE INDEX ON records (option_id, id DESC NULLS LAST);
Pendekatan yang dioptimumkan ini meningkatkan pelaksanaan pertanyaan dengan ketara dengan menggunakan imbasan indeks atau imbasan indeks sahaja untuk kedua-dua jadual carian dan jadual utama, menghasilkan prestasi unggul berbanding imbasan jadual penuh .
Atas ialah kandungan terperinci Bolehkah Postgres Mengoptimumkan Pertanyaan MAX Mengikut Kumpulan Tanpa Imbasan Jadual Penuh?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!