Saya tahu saya harus menulis SUM
dua kali, jika saya ingin menggunakannya dalam HAVING
klausa (atau menggunakan tabel turunan):
SELECT id,
sum(hours) AS totalhours
FROM mytable
GROUP BY id
HAVING sum(hours) > 50;
Pertanyaan saya sekarang adalah, apakah ini suboptimal atau tidak. Sebagai seorang programmer, permintaan ini sepertinya DB akan menghitung jumlah dua kali. Begitukah, atau haruskah saya mengandalkan optimisasi yang akan dilakukan mesin DB untuk saya?
Pembaruan: penjelasan tentang kueri yang sebanding:
postgres=> explain select sum(counttodo) from orderline group by orderlineid having sum(counttodo) > 100;
QUERY PLAN
--------------------------------------------------------------------
HashAggregate (cost=1.31..1.54 rows=18 width=8)
Filter: (sum(counttodo) > 100)
-> Seq Scan on orderline (cost=0.00..1.18 rows=18 width=8)
(3 rows)
postgresql
best-practices
aggregate
alias
Bart Friederichs
sumber
sumber
HAVING
klausa - tetapi, menurut pemahaman saya, secara internal ini agak dilakukan sebaliknya.HAVING
(dan kemudian menarik definisi kolom dariSELECT
klausa) - untuk beberapa alasan mereka tidak melakukannya.Jawaban:
Jumlahnya hanya dihitung sekali.
Saya memverifikasi ini menggunakan
dan kemudian menggunakan debugger untuk memeriksa berapa kali
int4_sum
(fungsi transisi di belakangsum
agregat) dipanggil: sekali.sumber
Bandingkan kueri Anda
Untuk ini setara cek di apa perbedaannya
sumber
Anda tidak perlu menulis
SUM
dua kali jika Anda tidak perlu mengambilnya; jika Anda hanya tertarik pada yangid
memilikiSUM(hours) > 50
maka yang berikut ini benar-benar valid:sumber