Katsetuste järgi on PL/pgSQL keelsete funktsioonide jõudlus parem.
Lõin katsetamiseks andmebaasi proc ja genereerisin sinna testandmed. Ühes tabelis oli üks miljon rida ja veel ühes viis miljonit rida. Seejärel lõin kaks funktsiooni, mis lahendasid sama ülesande. Üks nendest oli SQL keelne funktsioon koos SQL standardis ettenähtud kehandiga. Teine oli PL/pgSQL keelne funktsioon. Kogu selle koodi saab alla laadida SIIT.
Kõigepealt katsetasin töökiirust psql programmis niimoodi, et andsin käsu \timing, mis lülitas sisse ajavõtu. Seejärel kutsusin välja mõlemat funktsiooni ja kasutasin sama argumenti. SQL funktsiooni täitmise kiirus oli 0.9 ms ja PL/pgSQL funktsiooni täitmise kiirus 0.6 ms.
Seejärel katsetasin jõudlust pgbench utiliidi abil. Siin on selle utiliidi tutvustus ja siin dokumentatsioon. Järgnevad käsud on käivitatud serveris kooriku viibal (shelli promptis).
Lõin andmebaasist proc kaks ühesugust koopiat, käivitades createdb utiliiti nii, et see looks uue andmebaasi tehes koopia olemasolevast etteantud nimega andmebaasist.
Need skriptid kutsuvad välja andmebaasis loodud funktsioone juhuslikult genereeritud argumendiga, mis on täisarv vahemikus 1 kuni üks miljon (otspunktid kaasa arvatud). Seejärel kasutasin pgbench utiliiti, et käivitada ühte skriptidest ühe andmebaasi ning teist teise andmebaasi põhjal.
- c 1 - kui mitu klienti andmebaasis samaaegselt tehinguid käivitavad. Vaikimisi 1. See tähendab, et ei teki konflikte erinevate klientide andmemuudatuste vahel.
- T 180 - täida tehinguid 180 sekundit. Alternatiiviks oleks kasutada -t omadust ja määrata käivitatavate tehingute arv. Määrata saab ühe või teise, kuid mitte mõlemat korraga.
-f skript1.sql - käivitatava skriptifaili nimi
proc1 - andmebaasi nimi
Programm käivitas skripte 180 sekundit ning mõõtis, milline oli keskmine ühe täitmiskorra täitmise aeg ning keskmine täitmiste arv sekundis. Latency average näitab keskmist tehingu täitmise aega ning tps (transactions per second) tehingute arvu sekundis.
SQL funktsioon:
PL/pgSQL
Selle järgi jõudis programm PL/pgSQL funktsioone sama aja jooksul poole rohkem täita.
Lõin katsetamiseks andmebaasi proc ja genereerisin sinna testandmed. Ühes tabelis oli üks miljon rida ja veel ühes viis miljonit rida. Seejärel lõin kaks funktsiooni, mis lahendasid sama ülesande. Üks nendest oli SQL keelne funktsioon koos SQL standardis ettenähtud kehandiga. Teine oli PL/pgSQL keelne funktsioon. Kogu selle koodi saab alla laadida SIIT.
Kõigepealt katsetasin töökiirust psql programmis niimoodi, et andsin käsu \timing, mis lülitas sisse ajavõtu. Seejärel kutsusin välja mõlemat funktsiooni ja kasutasin sama argumenti. SQL funktsiooni täitmise kiirus oli 0.9 ms ja PL/pgSQL funktsiooni täitmise kiirus 0.6 ms.
Seejärel katsetasin jõudlust pgbench utiliidi abil. Siin on selle utiliidi tutvustus ja siin dokumentatsioon. Järgnevad käsud on käivitatud serveris kooriku viibal (shelli promptis).
Lõin andmebaasist proc kaks ühesugust koopiat, käivitades createdb utiliiti nii, et see looks uue andmebaasi tehes koopia olemasolevast etteantud nimega andmebaasist.
createdb -T proc proc1
createdb -T proc proc2
Lõin kaks skriptifiali skript1.sql ja skript2.sql, mille paigutasin WinSCP programmi abil enda serveri kodukataloogi.
Falis skript1.sql oli tekst:
Falis skript2.sql oli tekst:
Falis skript1.sql oli tekst:
\set delta random(1,1000000)
SELECT public.f_activate_item(p_item_code:=:delta);
Falis skript2.sql oli tekst:
\set delta random(1,1000000)
SELECT public.f_activate_item2(p_item_code:=:delta);
Need skriptid kutsuvad välja andmebaasis loodud funktsioone juhuslikult genereeritud argumendiga, mis on täisarv vahemikus 1 kuni üks miljon (otspunktid kaasa arvatud). Seejärel kasutasin pgbench utiliiti, et käivitada ühte skriptidest ühe andmebaasi ning teist teise andmebaasi põhjal.
pgbench -c 1 -T 180 -n -f skript1.sql proc1
pgbench -c 1 -T 180 -n -f skript2.sql proc2
- c 1 - kui mitu klienti andmebaasis samaaegselt tehinguid käivitavad. Vaikimisi 1. See tähendab, et ei teki konflikte erinevate klientide andmemuudatuste vahel.
- T 180 - täida tehinguid 180 sekundit. Alternatiiviks oleks kasutada -t omadust ja määrata käivitatavate tehingute arv. Määrata saab ühe või teise, kuid mitte mõlemat korraga.
-f skript1.sql - käivitatava skriptifaili nimi
proc1 - andmebaasi nimi
Programm käivitas skripte 180 sekundit ning mõõtis, milline oli keskmine ühe täitmiskorra täitmise aeg ning keskmine täitmiste arv sekundis. Latency average näitab keskmist tehingu täitmise aega ning tps (transactions per second) tehingute arvu sekundis.
Tulemused
SQL funktsioon:
number of transactions actually processed: 202726
latency average = 0.888 ms
tps = 1126.305294 (without initial connection time)
PL/pgSQL
number of transactions actually processed: 407389
latency average = 0.442 ms
tps = 2263.042599 (without initial connection time)
Selle järgi jõudis programm PL/pgSQL funktsioone sama aja jooksul poole rohkem täita.
Hinda postitust:
Keskmine hinne : Pole veel hinnanguid!