OrioleDB arendajad analĂŒĂŒsisid PostgresSQL-i tabelite ja indeksite laienduste madaltaseme API hetkeolukorda (Table/Index Access Method (AM) API) ning pakkusid vĂ€lja selle tĂ€iustamise vĂ”imalusi. Alates PostgresSQL 12 kĂ€ivitamisest on sellise API olemasolu vĂ”imaldanud arendajatel luua alternatiivseid andmesalvestusmehhanisme. Kuid hoolimata sellest API-st ja tuntud piirangutest sisseehitatud andmesalvestusmehhanismis, ei ole siiani tĂ€ielikult funktsionaalseid tehingupĂ”hiseid salvestusmootoreid, mis oleksid loodud ainult laiendustena.
PostgreSQL-i alternatiivsete tabelimootorite kÔige nÔutavamad funktsioonid on:
- Alternatiivsed MVCC-ide rakendused, nagu nÀiteks UNDO logide pÔhised salvestused.
- Indeksiga organiseeritud tabelid, kus indeks ei ole tabelile vabatahtlik lisa, mis kiirendab pÀringuid, vaid kujutab endast peamist andmestruktuuri, milles hoitakse tabeli andmeid.
Tabeli/indeksi AM API-sse vajalikud muudatused, et toetada alternatiivseid MVCC rakendusi, kÀsitletakse OrioleDB laienduse kontekstis, mis on loodud sisseehitatud PostgresSQL salvestusmehhanismi tuntud puuduste kÔrvaldamiseks. Probleemiks on see, et OrioleDB tÀielikuks integreerimiseks PostgresSQL-iga on vajalikud muudatused PostgresSQL koodis, mis muudab projekti rakendamise keerulisemaks ja rÔhutab vajadust current Table AM API moderniseerimise jÀrele.
Table AM API ei mÀÀrata otse MVCC rakendamise meetodit. Siiski, Table AM API ja Index AM API teevad jĂ€rgmise eeldamise: iga TID (Tuple/Row Identifier) kas indekseerib kĂ”ikide indeksitega vĂ”i mitte ĂŒhtegi. Isegi kui Index AM-l on mitu viidet ĂŒhe TID-le (nĂ€iteks GIN), peavad kĂ”ik need viidatud vastama ĂŒhele ja samale indekseeritud vÀÀrtusele.

Seda pĂ”himĂ”tet on kritiseeritud kirjutamise tegevuste arvu suurenemise tĂ”ttu (âwrite amplificationâ) â kui uuendatakse ĂŒhte indekseeritud atribuut, tuleb igat indeksit tabelis uuendada. Kui on vajalik tĂ€ielikult Ă€ra kasutada UNDO logi eeliseid vĂ”i ehitada mĂ”ni muu salvestusmeetod, mis ei pĂ”hjusta kirjutamise tugevdamist (nĂ€iteks WARM meetod), tuleb seda eeldust rikkuda.

Table AM, mis pĂ”hineb UNDO-l, ei riku seda eeldust ning sarnaneb olemasolevale meetodile HOT (Heap-Only Tuples), vĂ€lja arvatud see, et vanad stringiversioonid hoitakse UNDO logis ja need ei pea mahtuma samasse lehekĂŒlge. Kuid autorite arvates ei piisa sellest eelisest, et pĂ”hjendada eraldi Table AM-i olemasolu.
Praegused API praktilised piirangud:
- Rea vÀrskendamise ajal uuendatakse tabeli indeksid pÔhimÔttel "kÔik vÔi mitte midagi".
- API Index AM-l puudub vÔimalus teatud korthÀidete punktikustutamiseks. Praegu saab korthÀtteindeksitest kustutada korthÀidete massilisi koguseid, kasutades meetodeid ambulkdelete ja amvacuumcleanup. Katse teostada punktikustutamine lÀbi selle API tooks kaasa madala efektiivsuse, kuna enamik praeguseid teostusi peab skaneerima kogu indeksi. Lisaks ei vÔimalda API mÀÀrata, millised korthÀtetest, mis viitavad samale TID-ile, tuleks kustutada. See saab kustutada ainult kÔik.
- Indeksid viitavad praegu tabeli ridadele ploki numbri (32 bitti) ja nihke numbri (16 bitti) kaudu. Ainult 11 bitti nihke numbrist vĂ”ib TID-st ohutult indeksi juurdepÀÀsu meetoditesse edastada. Samuti vĂ”ivad MVCC alternatiivsete teostuste jaoks olla vajalikud tĂ€iendavate kasuliku koormuse (payload) sĂ€ilitamine koos TID-ga. NĂ€iteks OrioleDB-s on vaja ĂŒhte vĂ”i mitut bitti, et rakendada âdelete-markingâ indekseid vĂ”i tĂ€ielikku nĂ€htavuse teavet.
Kaks meetodit piirangute ĂŒletamiseks on ettepanekud:
LÀhenemine 1: API Index AM pakub vÔimalusi alternatiivseks MVCC teostuseks.
Kuigi Table AM vastutab kÔigi MVCC komponentide eest, pakub Index AM vajalikud vÔimalused alternatiivse MVCC teostuse jaoks, nimelt: kasutaja kasuliku koormuse (payload) sÀilitamine koos TID-ga, punktikustutamise meetod ja isegi punktivÀrskenduse meetod (kui indeksi TID-d ei saa muuta, vÔib kasutaja kasulik koormus muutuda). Lisaks on vajalik, et mitu indeksi korthÀidjat viitaksid samale TID-le, seetÔttu peavad indeksi skaneerimise ajal kasutatavad API meetodid samuti uuendamist.
LĂ€henemine 2: Indeksid, mis toetavad MVCC.
Alternatiiv oleks lubada MVCC toetavaid indekseid. See tÀhendab, et «executor» (vÔi vÔib-olla Table AM) kutsub lihtsalt Index AM-is vÀlja insert() ja delete() meetodid, samal ajal kui Index AM pakub vÔimalust skannimiseks MVCC arvestamisega. See lihtsustaks skannimist kasutades ainult indekseid (index-only) mÀrkimisvÀÀrselt. Isegi kogu Table AM vÔiks sellisel juhul saada vahekihiks, mis talletab andmeid indeksis.
Alloleval joonisel on nĂ€ide. Indeksi 2 vÀÀrtus vĂ€rskendatakse tehinguga 11 vÀÀrtusest «A» vÀÀrtuseks «B». SeetĂ”ttu on vÀÀrtus «A» mĂ€rgitud xmax == 11 ja vÀÀrtus «B» on mĂ€rgitud xmin == 11. Nii saab skannida indeksit 2 ja saada ainult MVCC kohaseid nĂ€htavaid tupleâite ilma kuhja (heap) kontrollimata. Indeksi 2 prĂŒgikogu (garbage collection) saate samuti lĂ€bi viia ilma kuhjata.

Kuna kĂ”igi nende uuenduste rakendamine indeksite juurdepÀÀsu API-sse on keeruline, on ebatĂ”enĂ€oline, et suudetakse kĂ”ik indeksid ĂŒheaegselt tĂ€iendada kĂ”igi uute vĂ”imalustega. Realistlikum oleks lubada ĂŒhe indeksi juurdepÀÀsumeetodi jaoks mitmeid teostusi. NĂ€iteks, tavapĂ€rase B-puuli kĂ”rvale vĂ”iks laiendus rakendada alternatiivset B-puud, mis toetab MVCC-d indeksi sees ja toetab muutujate identifikaatoreid, mille pikkus on mistahes.

Seega on soovitatav ĂŒle vaadata mitte ainult Table AM API, vaid ka Index AM API, mis on olnud PostgreSQL kogukonna teenistuses aastaid. Veelgi enam, soovitatakse jagada Index AM loogiliseks kihiks ja rakenduse kihiks. See ĂŒmberkehastatud arhitektuur vĂ”imaldab PostgreSQL-l toetada erinevaid salvestusmudeleid.
Allikas: opennet.ru
