Kas Count(1) ridade arvu loendamiseks on kiirem kui Count(*)?

Postitas Erki Eessaar 17.03.2024 17:26 (muudeti 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.

Hinda postitust:

Keskmine hinne : Pole veel hinnanguid!