Baca pertanyaan dengan seksama
Dan:
Poin penting untuk kinerja adalah mengecualikan baris yang tidak relevan lebih awal dan hanya menghitung agregat untuk subgrup tertentu . Kemudian (dengan asumsi lebih dari beberapa subgrup berbeda), indeks pada (subgroup)
dapat membantu:
CREATE INDEX ON foo (subgroup);
Setiap kueri berikut menampilkan FALSE
jika setidaknya dua grup memiliki jumlah total yang berbeda untuk subgrup yang diberikan, dan TRUE
di semua kasus lain (dengan pengecualian kecil untuk kueri 5, lihat di bawah).
Kueri 1
SELECT count(DISTINCT total_power) = 1
FROM (
SELECT sum(power) AS total_power
FROM foo
WHERE subgroup = 'Sub_B' -- exclude irrelevant rows early!
GROUP BY grp
) sub;
Kueri 2
SELECT count(*) = 1
FROM (
SELECT true
FROM (
SELECT sum(power) AS total_power
FROM foo
WHERE subgroup = 'Sub_C'
GROUP BY grp
) sub2
GROUP BY total_power
) sub2;
Kueri 3
SELECT count(*) OVER () = 1
FROM (
SELECT sum(power) AS total_power
FROM foo
WHERE subgroup = 'Sub_A'
GROUP BY grp
) sub
GROUP BY total_power
LIMIT 1;
Kueri 4
(
SELECT FALSE
FROM (
SELECT sum(power) AS total_power
FROM foo
WHERE subgroup = 'Sub_A'
GROUP BY grp
) sub
GROUP BY total_power
OFFSET 1
LIMIT 1
)
UNION ALL
SELECT TRUE
LIMIT 1;
Yang ini spesial. Jawaban terkait dengan penjelasan:
- Kembalikan a nilai jika tidak ada catatan yang ditemukan
- Bagaimana cara mencoba beberapa SELECT hingga hasilnya tersedia?
Kueri 5
SELECT min(total_power) = max(total_power) -- can fail for NULL values
FROM (
SELECT sum(power) AS total_power
FROM foo
WHERE subgroup = 'Sub_A'
GROUP BY grp
) sub;
Yang terakhir bisa gagal jika NULL
nilai dalam kekuasaan diperbolehkan. (Tetapi Anda harus menentukan hasil yang diharapkan dalam kasus ini.)
Saya menjalankan pengujian ekstensif dan menemukan semua kueri berkinerja hampir sama dalam kondisi ideal:
db<>fiddle di sini
Kueri 5 cenderung sedikit lebih cepat daripada yang lain.