Hi there 👋

Some old notes

BULK COLLECT/FORALL vs UPDATE iekš FOR cikla

Problēma: Lielāka datu apjoma labošana iekš PL/SQL vietās kur vienkārši SQL rakstīt būtu nepatīkami/neefektīvi. Risinājums #1: izmantot FOR ciklu lai apstaigātu datu kursoru un ar UPDATE veikt labojumi ierakstam. Risinājums #2: izmantot oracle kolekcijas datus ielādēt kolekcijā izmantojot BULK COLLECT (ja atmiņa pietiks tad dati glabāsies iekš RAM) SELECT * BULK COLLECT INTO v_bench_data_table FROM bench_data_table; ciklā apstaigāt kolekciju (situācijas kurās vajag, piemēram, apskatīt vēlreiz iepriekšējo ierakstu vai kas sarežģītāks, kas SQL būtu nesmuki) FOR i IN v_bench_data_table.first .. v_bench_data_table.last LOOP v_bench_data_table(i).x := dbms_random.string( 'a', TRUNC( dbms_random.value( 5, 30 ) ) ); -- tikai piemērs, te būtu jābūt daudz sarežģītākam darbam. END LOOP; saglabāt rezultātu no kolekcijas uz datu tabulu izmantojot FORALL FORALL i IN v_bench_data_table.first .. v_bench_data_table.last UPDATE bench_data_table set x = v_bench_data_table(i).x WHERE x = v_bench_data_table(i).x; Eksperiments: CREATE GLOBAL TEMPORARY TABLE bench_data_table ( x VARCHAR2(50) ); INSERT INTO bench_data_table SELECT dbms_random.string( 'a', TRUNC( dbms_random.value( 5, 30 ) ) ) x FROM dual CONNECT BY level <= 10000; DECLARE t TIMESTAMP; TYPE t_rows IS TABLE OF bench_data_table%rowtype; v_bench_data_table t_rows := t_rows(); BEGIN t := systimestamp; -- ielasam visus datus kolekcijā SELECT * BULK COLLECT INTO v_bench_data_table FROM bench_data_table; -- apstradājam katru kolekcijas ierakstu FOR i IN v_bench_data_table.first .. v_bench_data_table.last LOOP v_bench_data_table(i).x := dbms_random.string( 'a', TRUNC( dbms_random.value( 5, 30 ) ) ); -- tikai piemērs, te būtu jābūt daudz sarežģītākam darbam. END LOOP; -- saglabājam rezultātu FORALL i IN v_bench_data_table.first .. v_bench_data_table.last update bench_data_table set x = v_bench_data_table(i).x WHERE x = v_bench_data_table(i).x; dbms_output.put_line('BULK COLLECT + FORALL ' || extract (second from systimestamp - t) * 1000 || '(ms)'); -- tas pasts tikai izmantojot update iekš cikla t := systimestamp; FOR i IN (SELECT x FROM bench_data_table) LOOP UPDATE bench_data_table SET x = dbms_random.string( 'a', TRUNC( dbms_random.value( 5, 30 ) ) ) WHERE x = i.x; END LOOP; dbms_output.put_line('UPDATE + FOR LOOP ' || extract (second from systimestamp - t) * 1000 || '(ms)'); END; / DROP table bench_data_table; Skripts salīdzina abus rezultātus un izvada patērēto laiku abiem risinājumiem un izvada uz DBMS_OUTPUT. ...

marts 15, 2016 · Jānis

Oracle 12c jaunās fīčas

Šoreiz apskatīsim Oracle 12c jauninājumus. Oracle Database 12c tika laists tautās 2013. gada 1. jūlijā un tautās laidēji domā, ka Oracle 12c ir nākošas paaudzes datubāze[1]. Bet principā izskatās, kas tas vienkārši nozīmē, ka datubāzei ir labāka saderība ar makoņskaitļošanas iespējām. Tagad šo mazulīti varēs iesprausts mākoni. Iespraužamās datubāzes Solis tuvāk mākonim, tagad mums ir plugable database aka PDB. Iedomāsimies, ka mums ir liela kompānija un kompānijai ir daudz projektu. Parasti katram projektam ir pa kādai testa videi un varbūt pat vienota izstrādes vide un citas dīvainas vides. Šeit rodas problēma parasti katra vide sliktākajā gadījumā ir uz dažādiem dzelžiem vai arī uz viena dzelža ar OS līmeņa vizualizāciju. Katrai oracle instancei ir atvēlēta sava atmiņas katrā vboxi, līdz ar to daudz CPU un RAM aiziet lai uzturētu tikai instanci. Oracle 12c steidz palīgā un piedāvā Multitenant Architecture, kas šo problēmu atrisina ar augstāka līmeņa iebūvētu vizualizāciju. Ir viena instance kurā tiek iespraustas datubāzes ar visām atbilstoši nepieciešamajām konfigurācijām. Līdz ar to teorētiski varētu uz viena dzelža uzmest instanci un tajā saspraust visas datubāzes, kas agrāk bija izmētātas apkārt. Domāju, ka tagad DB varētu uzmest uz fleškas (bez lielām pūlēm) un aiznest kādam (kāds prieks taisīt testa vidi no produkcijas vides). Un pēc šī, DBA lēkā kā mazs bērns Ziemassvētku rītā. ...

novembris 28, 2013 · Jānis

Key-Value data stores (NoSQL #1)

Pavisam nesen man bija uzdots mājasdarbs aprakstīt NoSQL datubāzes tipus un tās salīdzināt pēc tradicionālajām relāciju datubāzēm. Domāju, ka ik palaikam iemetīšu sadaļas no šī mājasdarba un iespējams pieliekšu vēl kādu vērtīgu atziņu. Sākumā sāksim ar vienkāršākajām NoSQL tipiem, kas manuprāt ir key-value. Populārākās implementācijas - Redis, Riak, Voldemort. Key-value datu glabātuves satur unikālas atslēgas key un katrai atslēgai ir piekaisīta sava vērtība value. Šāda veida datubāzes nav piesaistītas noteikta datu shēmai, kas piešķir datubāzei elastīgumu. Pieprasījumu valoda parasti ir API metožu izsaukumi. ...

oktobris 28, 2013 · Jānis

Kā mēs izmantojam Mercurial (hg)

Pirms kāda laika (nu jau 2 gadiem) mūsu projekta komanda sāka augt no 1.5 programmētājiem līdz 5 (precīzi neatceros). Kods sākotnēji tika versionēts (glabāts) SVN parodijā, ko sauc par Microsoft Source Safe. Ņemot vērā, ka nebūtu godīgi MSS uzskatīt par versionēšanas sistēmu, bet kā sliktu backup tūli vērtu gan. Tad vajadzēja atrast draudzīgu rīku, ar kuru varētu strādāt vairāk kā 1 programmētājs. Šo problēmu spēja atrisināt divi rīki git un hg. Tātad vajadzēja izvēlēties vienu no abiem. git tai laikā īsti nebija sakarīgas front-end saskarnes, tāpēc ne tik entuziastiskiem programmētājiem varētu nepatikt komandrinda. hg ir ļoti draudzīgs Windows front-ends saukts par TortoiseHg. Ak, jā, mēs visi lietojam Windows, tāpēc Hg iegūst vairāk punktus nekā Git. Papildus, Hg ir diezgan pedantisks, glabājot vēsturi. Tas var noderēt, lai kontrolētu, kas un ko ir izdarījis. ...

maijs 9, 2013 · Jānis

[C++] saistītais saraksts

C++ mums atļauj izveidot statiskus un dinamiskus masīvus, bet ar viņiem ir neliela problēma. Iedomāsimies, ka mums ir skaitļu masīvs garumā 10. Pēc kāda laiciņa mēs viņu, protams, izmantojam, un ja mums vajag pievienot beigās 11. skaitli mums viss masīvs ir jādefinē no jauna. Jāizvēlas lielāks izmērs un tajā jāieraksta visas iepriekšējā masīva vērtības. Pienāks arī laiks, kad mēs gribēsim skaitli iespraust kaut kur pa vidu vai sākumā, tad mums būtu jāpārbīda visi skaitļi uz priekšu, lai atbrīvotu vietu jaunajam skaitlim. ...

marts 1, 2010 · Jānis

[C++] failu lasīšana un rakstīšana

Ir pienākusi diena, kad vajag kādu informāciju ielasīt no diska, sastopamies ar problēmu: “kā pie velna, kaut ko tādu izdarīt?”. Šīs idejas risinājums slēpjas šajā jaukajā bibliotēkā: #include <fstream> Tā ir sanācis, ka mums šī rindiņa ir jāpieliek, lai programmiņai būtu iespēja piekļūt failiem. Īstenībā nosaukums arī nedaudz ir atvasināts no “file stream” (tas tā lai vieglāk atcerēties). Nu, bet tad, kad esam šo pielikuši savas mazās programmiņas kodam, mums parādās iespēja izmantot jaunas fīčas: ...

februāris 22, 2010 · Jānis