Vastus (17.03.2024 17:54): Oletame, et SQL-andmebaasis on tabel:
Isik(isikukood, perenimi)
Primaarvõti (isikukood)
Lause
SELECT Count(*) AS arv
FROM Isik;
leiab tabelis
Isik olevate ridade arvu. Kui Count funktsiooni poole pöörduda nii: Count(<avaldis>), siis leitakse selliste ridade arv, mille korral avaldise väärtus ei ole NULL.
SELECT Count(1) AS arv
FROM Isik;
Ühegi rea korral tabelis
Isik ei ole sulgudes oleva avaldise väärtuse arvutamise tulemus NULL - seega tulemus on sama nagu eelmisel päringul. Need kaks lauset on seega loogiliselt samaväärsed. Võiks arvata, et nende lausete täitmise protseduur (täitmisplaan) ja seega täitmise kiirus on ühesugused. Enamikes andmebaasisüsteemides see ongi nii. Kuid nagu kirjutatakse
SIIN, siis PostgreSQLis on Count(*) kasutava päringu täitmine kiirem kui Count(1) kasutava päringu täitmine.
Katsetasin seda PostgreSQL (16) andmebaasis tabeli (
hcv) põhjal, kus on üks miljon rida. Kasutasin töökiiruse leidmiseks
EXPLAIN ANALYZE lauset, mille käivitamise korral näeb kasutaja lause täitmise plaani ja ka lause täitmiseks kulunud aega. Käivitasin neid lauseid vaheldumisi viis korda ja leidsin kummagi lause korral täitmisaegade
geomeetrilise keskmise.
Lause 1:
EXPLAIN ANALYZE SELECT Count(*) AS arv FROM Hcv;
Lause 2:
EXPLAIN ANALYZE SELECT Count(1) AS arv FROM Hcv;
Count(*): geomeetriline keskmine 69.1 ms
Count(1): geomeetriline keskmine 76.1 ms
Minu katsetus seega kinnitas seda väidet, kuid töökiiruse erinevused on kasutajale vähemärgatavad.