/
Action: shadow

Action: shadow

Suurte tulemtabelite loomine andmebaasi sees olevate andmete põhjal. Soovituslik alternatiiv "map" tegevusele.



Andmebaasi olevate andmete pealt uute tulemite loomine võib käia läbi "map" ja läbi "shadow" aktsioonide. Mõlemate korral tulemtabel eemaldatakse ja tekitatakse uuesti. Erinevus on see, et "shadow" korral lükatakse kustutamine võimalikult pikalt edasi, uus tabel luuakse varitabelina ja kui see valmis, siis toimub vanade andmetega tulemtabeli jaoks DROP ja varitabeli ümbernimetamine tulemtabeliks. Kustutamine võidakse täitsa ära jätta, kui suudetakse tuvastada andemete samasus vanas tulemtabelis ja uues varitabelis. Kustutamise pikalt edasi lükkamine on vajalik oludes, kus tulemtabeli arvutamine (create table ... as select ...) võtab rohkem aega ("rohkem" = kui kaua võib töövälisel ajal olla tabel andmelaost kadunud. See on tunnetuslik. Tableau poolt kasutatavad tabelid (letid) võiksid olla shadow meetodil tehtud, kui tabeli arvutuse SQL võtab üle 5 minuti aega. Aluseks olevad faktitabelid võib "map" meetodiga olla tehtud ka pikema aja korral (nt max 15 minutit), sest kui neid tabeleid pole, siis järgmised jäetakse ümber arvutamata ja kui see tabel lõppeb, siis pannakse järgmised uuesti laadimisse.

Uue varitabeli ja olemasoleva andmetabeli võrdlemiseks arvutatakse mõlema tabeli räsi. Selle jaoks arvutakse iga rea räsi ja nendest reastatud räsidest omakorda (2 sammuga) tabeli räsi. Kuna räsi sõltub alati sisendist, siis on vajalik liigsete mittevõrduste vältimiseks järjestada kirjed alati samamoodi. Parim lahendus selleks on järjestada nad võtmevälja järjekorras. See on põhjus, miks on definitsioonis "pkcol" massiiv. Kui seda pole, siis loobutakse võrdlemisest ja võetakse plaani tabeli igakordne asendamine uue varitabeliga.

Varitabeli abil laadimine
actions: - do: shadow input: input.sql # create table as sisu select update: update.sql hash_before: hash_before.sql # abitegevused räsiarvutuse kiirendamiseks (sorteerimiseks) hash_after: hash_after.sql # eelmise pöördtegevused after: after.sql # indeksite tegemine tulemtabelile, kommentaari loomine pkcol: # hash arvutuseks kirjete sorteerimise veerud, et alati oleks järjekord üheselt määratud (abstraktne PK oleks siin hea lahendus) - aadress_id



Mis hetkel mis faili kasutatakse, näitab joonis:

Üle ei maksa pingutada:

  • hash_before teha kui on tõesti suur varitabel ja vaja sorteerimist kiirendada, ja hash_after teha, kui on tehtud hash_before (pöördtegevus, mis võtab varitabelilt räsi arvutamise otstarbel tehtud indeksid maha, et oleks pilt samasugune olukorraga, kus räsi jaoks eritegevusi ei tehtud, nt tabeli esimesel laadimisel, kui pole vajadust võrdlemiseks eelmisega). Kui näiteks hash_before's tehtud indeks on väärtuslik üldiselt, siis ikkagi eemaldada indeks ja luua indeks uuesti üldises after-is

  • Kui on olemas before.sql, siis võiks olla ka after.sql. Before's võib luua ajutised tabelid (eelnevalt neile "drop if exists") ja indeksid neile (kui ajutisele tabelile ei tee indeksit, mis põhikäsus (input.sql) seoste loomist kiirendab, siis pole mõtet teha ajutist tabelit, vaid lahendada CTE-ga põhikäsus). Afteris ei ole kohustus droppida ajutisi tabeleid (ajutine tabel kaob sessiooni lõpus), aga koodiläbipaistvuse jaoks on siiani seda tehtud

Muud nõksud/soovitused:

  • afternew alla panna nt andmekasutust registreerivad tõkkefunktsioonid (func.sql). Need luuakse ainult siis, kui tabel üle kirjutati (algse tulemtabeli drop cascade eemaldab tõkkefunktsioonid, kuna nad kasutavad oma kehas viidet (tabel kui tüüp) tabelile) ja seega on nad vaja uuesti luua ainultsiis kui tulemtabel tekkis uuena.

  • afterisse (ja ka üldiselt mujale) SQL-käske kirjutades planeerida nad sellised, et nad oleksid korratavad (nt "create index" asemele kas "createindex if not exists" või "create index" ette käsk "drop index if exists")

Keelud:

  • input jaoks antud failidest võetakse esimene (võib olla antud rohkem, aga puudub mõte)

  • input failis ei tohi olla semikooloneid - tema sisu kirjutatakse create table ... as ( <siia> ).

Related content