Autotrace

Janvāris 30, 2008

Turpinot tēmu par ātrdarbības meklējumumiem Oracle datubāzēs šoreiz paskatīsimies uz SQL*Plus rīka komandu autotrace. Tā jau dod vairāk informācijas nekā vienkārši patērētais laiks, ko var noskaidrot vairākos veidos.
Jāpiebilst gan, ka izpildes plānu un statistiskos rādītājus izmantojot autotrace ir iespējams dabūt tikai DML teikumiem – SELECT, INSERT, UPDATE, MERGE, DELETE.
Tātad par visu pēc kārtas:

Autotrace priekšnosacījumi

Lai varētu pilnvērtīgi izmantot šo SQL*Plus komandu, ir divi priekšnosacījumi:

  • Lietotājam jābūt iedotai PLUSTRACE lomai. Lomas izveides skripts atrodas $oracle_home\sqlplus\admin\plustrce.sql, kur $oracle_home ir direktorija, kur uzinstalēta Oracle datubāze.
  • Lietotājam jābūt pieejamai tabulai PLAN_TABLE. Tā var būt uzinstalēta kādā datubāzes lietotāja shēmā un iedotas tiesības visiem pārējiem lietotājiem, vai arī katra paša lietotāja shēmā, tas nav svarīgi. Tabulas izveides skripts atrodas $oracle_home\rdbms\admin\utlxplan.sql . Vajadzētu lietot tieši konkrētajai Oracle versijai paredzēto tabulu tāpēc, ka katrā nākošajā versijā parasti nāk klāt jaunas kolonas.

Autotrace iespējošana/atspējošana

  • SET AUTOTRACE OFF  – autotrace atskaite netiek ģenerēta. Normālā situācija.
  • SET AUTOTRACE ON EXPLAIN  – autotrace atskaite parāda tikai izpildes plānu.
  • SET AUTOTRACE ON STATISTICS – autotrace atskaite parāda tikai SQL teikuma izpildes statistiku.
  • SET AUTOTRACE ON – autotrace atskaite attēlo gan izpildes plānu, gan SQL teikuma izpildes statistiku.
  • SET AUTOTRACE TRACEONLY – autotrace atskaite attēlo gan izpildes plānu, gan SQL teikuma izpildes statistiku, bet netiek attēlots SELECT vaicājuma izpildes rezultāts. Ērti izmantot tad, ja vaicājuma izpildes rezultāts ir liels un mūs neinteresē, bet interesē tikai izpildes plāns un statistika.
  • SET AUTOTRACE TRACEONLY EXPLAIN – autotrace atskaite attēlo izpildes plānu, bet netiek attēlots vaicājuma izpildes rezultāts. Ja tas ir SELECT teikums, tad šajā gadījumā patiesībā SQL SELECT teikums NETIEK izpildīts.
  • SET AUTOTRACE TRACEONLY STATISTICS – autotrace atskaite attēlo SQL teikuma izpildes statistiku, bet netiek attēlots vaicājuma izpildes rezultāts.

Dažas lietas, ko vērts atcerēties:

  • INSERT, UPDATE, DELETE, MERGE teikumi tiek reāli izpildīti vienmēr, bet SELECT teikums patiesībā netiek izpildīts, ja ir SET AUTOTRACE TRACEONLY EXPLAIN. Šis variants reizēm ir noderīgs, ja select teikums izpildās stundu, bet mēs gribam redzēt tikai izpildes plānu. Kā arī reizēm rodas nesapratne – kāpēc, ja ir SET AUTOTRACE TRACEONLY EXPLAIN, tad select teikums izpildās zibenīgi, bet citādi iet stundu? Atbilde tātad – select pieprasījums patiesībā netiek izpildīts, tiek uzģenerēts tikai izpildes plāns.
  • Nelietot autotrace SYS lietotājam. Šis lietotājs ir īpašs un šim lietotājam autotrace atskaite nav izmantojama.
  • Autotraces rezultātā iegūtais SQL pieprasījuma izpildes plāns var nebūt īstais, kas patiesībā ir jūsu programmā. Vairumā gadījumu izpildes plāni sakrīt un ir vienādi, bet var būt gadījumi, kad tas tā nav, piemēram, ja atšķiras vides uzstādījumi sesijām (izdalītā atmiņa utml). Otrs iemesls, kad izpildes plāni var atšķirties ir tad, ja jūs lietojat BIND mainīgos un Oracle datubāze reālā vaicājuma izpildes plāna ģenerēšanas laikā pirmajā reizē skatās uz doto mainīgo vērtībām. Autotrace ģenerējot SQL vaicājuma izpildes plānu to nedara. Piemērs – jums ir tabula ar kolonu, kurā ir viena “A” vērtība un 1000 “B” vērtības. Ja atlasa ierakstu ar “A” vērtību, tad tabulu ir vērts lasīt pēc indeksa, ja atlasa ierakstus ar “B” vērtību, tad tabulu ir izdevīgāk lasīt visu neizmantojot indeksu. Šajā gadījumā autotrace var rādīt vienu izpildes plānu, bet reālais var būt atšķirīgs.

Izmantošanas piemērs

Izmantotā tabula ir šāda: 

CREATE TABLE personas (
  prs_personas_kods VARCHAR2(11) NOT NULL PRIMARY KEY,
  prs_vards VARCHAR2(40),
  prs_uzvards VARCHAR2(40));
INSERT INTO personas VALUES ('11111112345', 'JĀNIS', 'BĒRZIŅŠ');
INSERT INTO personas VALUES ('12121212345', 'PĒTERIS', 'SŪNIŅŠ');
INSERT INTO personas VALUES ('13131312345', 'RŪDIS', 'BĒRZIŅŠ');
COMMIT;
SQL> set autotrace on
SQL> SELECT * FROM personas WHERE prs_personas_kods = '11111112345';
PRS_PERSONA PRS_VARDS                                PRS_UZVARDS
----------- ---------------------------------------- --------------
11111112345 JĀNIS                                    BĒRZIŅŠ
Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=1 Card=1
Bytes=51)
   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'PERSONAS' (TABLE)
(Cost=1 Card=1 Bytes=51)
   2    1     INDEX (UNIQUE SCAN) OF 'SYS_C00112708' (INDEX (UNIQUE))
(Cost=1 Card=1)
Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          2  consistent gets
          0  physical reads
          0  redo size
        459  bytes sent via SQL*Net to client
        377  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

Tātad mēs šeit redzam izpildes plānu, kurā tiek parādīts:

  • kādas darbības (SQL vaicājuma izpildes plāns) Oracle DB veic, lai iegūtu rezultātu,
  • kāds ir izpildes plāna un tās soļu izmaksu novērtējums (Cost);
  • kāds ir sagaidāmo ierakstu skaits ko Oracle DB cer iegūt katra soļa rezultātā (Card, no cardinality);
  • kāds ir rezultāta apjoms baitos (Bytes).

Ja Cost, Crad un Bytes nav, tad tas nozīmē, ka jūs izmantojat RBO (rule based optimizer)  un šeit ir rakstīts, kāpēc to nevajag darīt.

Par katru no statistikām vairāk nākošajā sadaļā.
Lai paskatītos, cik grūti ir iegūt visus mums pieejamos objektus no datu vārdnīcas, varam pašus rezultātus neskatīties, bet tikai statistiku.

SQL> set autotrace traceonly statistics
SQL> select * from all_objects;
 61295 rows selected.
Statistics
------------------------------------------------------
       5467  recursive calls
          0  db block gets
     113664  consistent gets
          0  physical reads
          0  redo size
    3032446  bytes sent via SQL*Net to client
      45458  bytes received via SQL*Net from client
       4088  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
      61295  rows processed

Tātad kā redzam, ieraksti rādīti netika, bet statistikas atskaite ir redzama.

Statistiku nozīme

  • recursive calls – rekursīvo izsaukumu skaits (SQL teikumu skaits), ko veic sistēmas vai lietotāja līmenī. Daži no izplatītākajiem iemesliem varētu būt lietotāja definēto funkciju izsaukumi, kas kaut ko dara datu bāzē un sistēmas izsaukumi, lai varētu izveidot SQL Pieprasījuma izpildes plānu.
  • db block gets – bloka nolasīšana current mode. Pārsvarā tas parādās datu koriģēšanā, kad jāmaina tikai bloka pēdējā versija.
  • consistent gets – bloka lasīšana no Oracle DB bufera keša read consistent mode. Pārvarā tas parādās vaicājumos un iekļauj arī bloka iegūšanu no UNDO segmentiem (iepriekšējām bloka versijām atmiņā).
  • physical reads – bloka lasīšana no diska gan izmantojot tiešo lasīšanu, gan bufera kešu. Protams, arī šeit jāatceras, ka ne vienmēr tā patiesi ir lasīšana no diska – jo pastāv vēl gan operētājsistēmas kešs, gan iespējams arī katram diskam ir kaut kāds kešs. Bet no Oracle DB viedokļa tā ir lasīšana no diska.
  • redo size – norāda cik daudz tiek ģenerēts REDO. Pārsvarā attiecas tikai uz datu koriģēšanas teikumiem.
  • bytes sent through SQL*Net to client – no servera uz klienta pārsūtīto baitu skaits.
  • bytes received via SQL*Net from client – no klienta uz servera pārsūtīto baitu skaits.
  • SQL*Net roundtrips to/from client – SQL*Net ziņojumu skaits, kas sūtīts starp datu bāzi un klientu.
  • sorts (memory) – veikto kārtošanu skaits atmiņā.
  • sorts (disk) – kārtošanu skaits, kam ir bijusi nepieciešamība pēc pagaidu vietas uz diska.
  • rows processed – atlasīto (select), pievienoto (insert, merge), koriģēto (update, merge), dzēsto (delete, merge),  ierakstu skaits.

Kam pievērst uzmanību (nosacītā svarīguma dilšanas kārtībā):

  • Pats svarīgākais ir censties samazināt consistent gets un db block gets. Jo tas nozīmē, ka jums mazāk datu būs jālasa no atmiņas, mazāk datu būs jāapstrādā, mazāk būs jāveic atmiņas struktūru skanēšana, kas protams ir ļoti ātra, bet tai pašā laikā prasa nozīmīgus CPU resursus. Nevajadzētu iedomāties, ka “ieraujot visu datu bāzi” atmiņā tiks atrisinātas visas ātrdarbības problēmas. Pie tam samazinot šo statistiku automātiski parasti samazinās arī physical reads. Consistent reads ir atkarīgs arī no tā kāds ir vienā reizē pārsūtīto ierakstu skaits starp datubāzi un klientu un līdz ar to pārsūtīto ziņojumu skaits (SQL*Net roundtrips to/from client) vienam un tam pašam SQL vaicājumam. Jo šis skaits ir lielāks, jo vienam un tam pašam SQL vaicājumam var būt vairāk consistent gets. Katrā vidē to nosaka savādāk, bet SQL*Plusā to nosaka izmantojot komandu SET ARRAYSIZE <skaitlis>.
  • recursive calls visu laiku (ne tikai pirmajā izsaukuma reizē) saglabājas liels skaitlis (simti, tūkstoši). Tas var norādīt uz to, ka vai nu nepārtraukti SQL teikums tiek parsēts atkal un atkal (kas autotraces un vienkārša DML teikuma gadījumā ir neparasti), vai arī tiek izpildītas lietotāja definētas funkcijas, kas var būt paslēptas skatījumā un vispārīgā gadījumā var būt pamatīgs ātrdarbības grāvējs.
  • Liels redo size. Jo lielāks redo size, jo vairāk datu Oracle ir spiesta rakstīt uz diska. Jāatceras, ka katrs indekss, kas datu modificēšanas laikā ir papildus jāuztur, palielina šo metriku.
  • Liels physical reads. Jānoskaidro kāpēc tas tāds ir. Iespējams, ka tas ir neizbēgami - ja jums piemēram ir jānolasa liela tabula un tā ir jānolasa visa, lai iegūtu kādu atskaiti, tad parasti visefektīvākais veids ir to visu arī vienkārši nolasīt.
  • Sorts – mērķis ir samazināt metriku sorts (disk), jo tas nozīmē, ka kārtošana nesatilpst atmiņā. Ir 2 iespējas kā to paveikt – palielināt atmiņu vai samazināt kārtošanu skaitu vispār :)

Turpmākā lasāmviela


MySQL + SUN

Janvāris 18, 2008

SUN ir nopircis MySQLu, par to jau raksta visi un visur, tas ir izziņots gan MySQL oficiālajā mājslapā, gan Sun preses relīzē  ar visām bildītēm :)

Darījuma cena ir 1 miljards dolāru. Šis protams, nav pirmais skaļais darījums datu bāzu pasaulē, viens no skaļākajiem pirms kāda laika bija, piemēram, Informix iegāde, ko nopirka IBM, kam jau bija DB2. Interesanti, ka arī toreiz cena bija viens miljards dolāru. Acīmredzot tā tāda standarta cena par iespaidīgu spēlētaju datu bāzu tirgū :)

Tiesa gan šis pirkums ir jāvērtē mazliet citādi, jo SUN pašam sava ļoti mīļa un nopietna datubāze nebija atšķirībā no IBM Db2, ja neskaita SUN atbalstu PostgreSQL. Attiecīgi Informix kopš pirkšanas brīža diezgan strauji ir gājis uz leju. Jādomā, ka šis noteikti nebūs no šāda veida darījumiem, jo MySQL nav SUN konkurents, kā tas bija Informix, DB2 un IBM gadījumā.

MySQL blogos vispār prakstiski nav nekādu citu rakstu kā tikai šīs tēmas apskate no visiem iespējamiem skatu punktiem sākot no tā, ka SUN tagad varēs nodrošināt web izstrādi no A līdz Z līdz pat tam, ka darba vietas tiks saglabātas lielākajai daļai MySQL izstrādātāju, no kuriem ~70% strādā no mājām dažādās pasaules malās. Lūk tā jau ir reāla globalizācija, nezinu laba vai slikta…

Tālākā lasāmviela:


Kopas operatori Select pieprasījumā

Janvāris 8, 2008

SELECT teikums

Pārējos rakstus var lasīt SQL pamatos.

    Kādi ir kopas operatori un ko tie dara?

    SQL standarts paredz šādus kopas operatorus UNION, EXCEPT, INTERSECT un katram no tiem divas iespējas ALL vai DISTINCT (noklusētā). Tiesa gan spriežot pēc dokumentācijas pilnu funkcionalitāti nodrošina tikai DB2 (no šeit uzskaitītajām datu bāzēm), bet, piemēram, Oracle, Microsoft SQL Server un MySQL katrs nodrošina tikai daļu standarta funkcionalitātes.

    OK skaidrs, Jūs teiksiet, bet ko tad tie kopas operatori dara? Kopas operatori kombinē divu atsevišķu SQL pieprasījumu rezultātus vienā rezultātā, kur katrs no šiem SQL pieprasījumiem ir pilntiesīgs SQL Select teikums un to var izpildīt atsevišķi. To vispārīgā forma ir šāda:

    P1 OPERATORS P2

    kur P1 un P2 katrs ir atsevišķs pilntiesīgs SQL Select teikums.

    Operators Rezultāts Piezīmes
    P1 UNION [DISTINCT] P2 Visi ieraksti no P1 un P2, ne vairāk kā vienu reizi Daudzās datubāzēs distinct neļauj rakstīt, tā vietā raksta vienkārši UNION
    P1 UNION ALL P2 Visi ieraksti no P1 un P2 neveicot nekādu unikālu ierakstu atsijāšanu  
    P1 EXCEPT [DISTINCT] P2 Ieraksti, kas ir P1 izņemot tos ierakstus, kas ir P2 Oracle šī operatora vietā ir operators MINUS. Daudzās datubāzēs distinct neļauj rakstīt, tā vietā raksta vienkārši EXCEPT vai MINUS
    P1 EXCEPT ALL P2 Ieraksti, kas ir P1 izņemot tos ierakstus, kas ir P2 saglabājot šo ierakstu kardinalitāti Realizēts tikai daļā datubāzu
    P1 INTERSECT [DISTINCT] P2 Ieraksti, kas ir gan P1, gan P2 Daudzās datubāzēs distinct neļauj rakstīt, tā vietā raksta vienkārši INTERSECT
    P1 INTERSECT ALL P2 Ieraksti, kas ir gan P1, gan P2 saglabājot šo ierakstu kardinalitāti Realizēts tikai daļā datubāzu

    Protams, atsevišķajiem SQL pieprasījumiem ir jāatbilst vairākiem nosacījumiem, lai tos varētu kombinēt:

    • Pieprasījumu atlasīto kolonu skaitam ir jābūt vienādam.
    • Atlasīto kolonu datu tipiem ir jābūt savā starpā vai nu vienādiem vai vismaz tādiem, lai datubāze spētu tos konvertēt no viena uz otru (katrai datubāzei jāskatās individuāli).
    • SQL kopas operatorus var lietot vairākus vienlaicīgi, t.i., piemēram,
      P1 UNION ALL P2 UNION ALL P2 INTERSECT P3 MINUS P4. Tādā gadījumā jāskatās katras indivuduālās datu bāzes dokumentācijā, kā tādi tiek izpildīti, jo dažās (Oracle, gan ar piezīmi, ka tas nākotnē mainīsies) operatori vienkārši tiek izpildīti no kreisās uz labo pusi, citās (DB2) INTERSECT operators tiek izpildīts vispirms.
    • Parasti kolonu nosaukumi tiek ņemti no pirmā SQL pieprasījuma.
    • ORDER BY klauzas katrā individuālā SQL pieprasījumā, izņemot pēdējo, vai nu nedrīkst būt vispār (Oracle) vai arī netiek ņemtas vērā (MySQL).

    Dažas piezīmes par ātrdarbību un funkcionalitāti

    • Atsevišķo SQL pieprasījumu rakstīšanā, protams, jāatceras iepriekšējā rakstā minētās piezīmes.
    • Jāatceras ka visi UNION, EXCEPT (MINUS), INTERSECT bez ALL vienmēr atgriež tikai un vienīgi unikālās vērtības! Līdz ar to pat, ja jūsu pirmais SQL teikums atgriezīs 5 vienādas rindas un otrais nevienu, tad UNION rezultātā jūs dabūsiet mazāk rindiņas nekā pirmā SQL teikuma izpildes rezultātā, t.i., tikai vienu.
    • Ja jums ir garantēti zināms, ka SQL teikumu rezultātā rodas unikāli ieraksti, tad lietojiet UNION ALL nevis UNION, lai datubāzei nebūtu jāveic liekas darbības un jāfiltrē ārā tikai unikālie ieraksti, galu galā patērējot vairāk resursus, bet iegūstot to pašu rezultātu.
    • Kā jau teikts iepriekšējā vienkārša SQL teikuma apskatā, bez ORDER BY klauzas nekāda kārtība garantēta netiek, tāpēc vienmēr pēdējā SQL teikuma galā jāpieliek ORDER BY klauza, ja ir nepieciešams noteikts ierakstu sakārtojums. Nekādā ziņā nevajag domāt, ka pirmā SQL teikuma atgrieztie dati vienmēr tiks attēloti pirms otrā SQL teikuma datiem.
    • Ja ir svarīgi zināt no kura SQL teikuma ieraksts ir nācis, tad katrā SQL teikumā var pievienot konstantu karodziņu (kolonu), kas norāda ieraksta izcelsmi un kuru tālāk var izmantot kārtošanā vai kādu citu prasību risināšanā.
    • NULL vērtības lietojot kopas operatorus tiek uzskatītas kā vienādas.

    Nākošajā tabulā redzami sākotnējie divu tabulu dati un katra kopas operatora rezultāts.

    T1 10 10 10 20 20 20 30 40 40 50
    T2 10 10 30 30 30 30 40
    T1 UNION [DISTINCT] T2 10 20 30 40 50
    T1 UNION ALL T2 10 10 10 20 20 20 30 40 40 50 10 10 30 30 30 30 40
    T1 EXCEPT (MINUS) [DISTINCT] T2 20 50
    T1 EXCEPT ALL T2 10 20 20 20 40 50
    T1 INTERSECT [DISTINCT] T2 10 30 40
    T1 INTERSECT ALL T2 10 10 30 40

    Labākai saprašanai šo operatoru ideju ir iespējams grafiski attēlot izmantojot Venna diagrammas. Tiesa gan pilnībā atbilstošas tās ir tikai tādām kopām, kur katrs no elementiem ir tieši vienu reizi.

    UNION operatora diagramma

    SQL union operator

    EXCEPT (MINUS) operatora diagramma

    SQL except operator

    INTERSECT operatora diagramma

    SQL intersect operator

    Daži vaicājumu piemēri. Tabulu definīcija un tās dati ir šādi:

    create table t1 (n number);
    create table t2 (n number);
    insert into t1 values (10);
    insert into t1 values (10);
    insert into t1 values (10);
    insert into t1 values (20);
    insert into t1 values (20);
    insert into t1 values (20);
    insert into t1 values (30);
    insert into t1 values (40);
    insert into t1 values (40);
    insert into t1 values (50);
    insert into t2 values (10);
    insert into t2 values (10);
    insert into t2 values (30);
    insert into t2 values (30);
    insert into t2 values (30);
    insert into t2 values (30);
    insert into t2 values (40);
    commit;
    Piemērs 1. Atlasa datus no abām tabulām, tikai unikālos ierakstus.
    SQL> SELECT n FROM t1
      2  UNION
      3  SELECT n FROM t2;
             N
    ----------
            10
            20
            30
            40
            50
    Piemērs 2. Atlasa datus no abām tabulām, visus ierakstus.
    SQL> SELECT n FROM t1
      2  UNION ALL
      3  SELECT n FROM t2;
             N
    ----------
            10
            10
            10
            20
            20
            20
            30
            40
            40
            50
            10
            10
            30
            30
            30
            30
            40
    Piemērs 3. Atlasa datus no abām tabulām, visus ierakstus tos sakārtojot.
    SQL> SELECT n FROM t1
      2  UNION ALL
      3  SELECT n FROM t2
      4  ORDER BY n
      5  /
             N
    ----------
            10
            10
            10
            10
            10
            20
            20
            20
            30
            30
            30
            30
            30
            40
            40
            40
            50
    Piemērs 4. Atlasa tos datus kas ir pirmajā tabulā atņemot nost tos, kas ir otrajā, tikai unikālos ierakstus.
    SQL> SELECT n FROM t1
      2  MINUS
      3  SELECT n FROM t2;
             N
    ----------
            20
            50
    Piemērs 5. Atlasa kopīgos datus abās tabulās tikai unikālos ierakstus.
    SQL> SELECT n FROM t1
      2  INTERSECT
      3  SELECT n FROM t2;
             N
    ----------
            10
            30
            40
    Piemērs 6. Atlasa datus no pirmās tabulas apvienojot tos ar tukšu kopu, tikai unikālos ierakstus.
    SQL> SELECT n FROM t1
      2  UNION
      3  SELECT n FROM t1 WHERE 1=2;
             N
    ----------
            10
            20
            30
            40
            50
    Piemērs 6. Atlasa datus no pirmās tabulas apvienojot tos ar tukšu kopu, visus ierakstus.
    SQL> SELECT n FROM t1
      2  UNION ALL
      3  SELECT n FROM t1 WHERE 1=2;
             N
    ----------
            10
            10
            10
            20
            20
            20
            30
            40
            40
            50

    Tālākā lasāmviela


    Kas glabā datus par mani?

    Janvāris 3, 2008

    Jaunajā gadā iesāksim citās noskaņās kā bijis līdz šim. Mazliet paskatīsimies uz dažām datubāzēm nevis no tehniskā, bet no juridiskā un satura viedokļa.

    Ikvienam Latvijas iedzīvotājam ;) un vēl jo vairāk datubāzu izstrādātājiem būtu vērts zināt, kādu tad informāciju valsts par mums krāj un kas mums jāievēro, ja nu gadījumā sanāk kādu valsts nozīmes informācijas sistēmu (VIS) vai datubāzi veidot.
    Izejas punkts šai gadījumā ir Valsts informācijas sistēmu likums. Likumā, protams, šīs valsts nozīmes informācijas sistēmas uzskaitītas nav. Tam ir paredzēti speciāli Ministru kabineta noteikumi Nr. 572 “Valsts informācijas sistēmu reģistrācijas noteikumi“, kas precizē uzskaites kārtību un ir pat izveidota speciāla vietne Valsts informācijas sistēmu reģistrs, kurā vismaz daļa šo reģistru ir uzskaitīti. Pavisam pašlaik ir reģistrēti 79 valsts nozīmes reģistri.

    Pāris komentāru par Valsts informācijas sistēmu reģistru saraksta saturu. Acīmredzot informāciju par katru reģistru sniedz Sistēmas pārzinis, kā jau tas likumā noteikts. Paskatoties dažas no šīm sadaļām rodas tādas dīvainas sajūtas – sistēmu reģistrā ir paredzēts ievadīt tādu info kā “VIS no kurām saņem datus” un “VIS uz kurām sūta datus”, kas īsti likumā prasīts nav. Līdz ar to arī izskatās, ka neviens Sistēmas pārzinis neapgrūtina sevi ar papildus informācijas ievadi un parastam cilvēkam liekas, ka visas informācijas sistēmas Latvijā darbojas kā jau tas pierasts – katra pati par sevi, nevienam datus NEDOD un no neviena cita arī NEŅEM :)
    Otra lieta, kas bija nepatīkami pamanāma, ir lauka “Mājas lapas adrese” saturs. Acīmredzot tur ir domāts ievadīt hipersaiti, pie tam pilnu ar visu protokolu. Gala rezultātā ir radušās tādas dīvainas saites kā, piemēram, Ārstniecības personu reģistram, kur acīmredzami ir pietrūcis http:// saite ir šāda un Iedzīvotāju reģistram, kur tā izskatās šādi Reģistrs nav publiski pieejams.

    Izrādās, ka šai vietnē ir iespējams arī meklēt, piemēram, pēc pazīmes vai “VIS satur personu datus”. Tad nu katrs var pārliecināties un padomāt, kurā no šīm sistēmām Jūs jau esat :)

    Vēsturiski šāds Valsts nozīmes datubāzu saraksts ir kā minimums jau trešais. Iepriekšējā versija uz rakstīšanas brīdi vēl darbojas šeit Informācijas sistēmu reģistrs, bet megasistēmas ietvaros izstrādātais reģistru reģistrs kā izskatās jau ir miris kopā ar visu megasistēmu. Kāds tas izskatījās toreiz var mēģināt apskatīt izmantojot interneta arhīvu jeb “laika mašīnu” - šeit ir megasistēmas versijas, bet šeit reģistru saraksts.

    Nākošais likums, kas katram šai valstī būtu jāievēro, ja datubāzēs vēlas reģistrēt personu datus, ir Fizisko personu datu aizsardzības likums. Atbilstoši šim likumam jebkuru informācijas sistēmu, kas glabā personas datus (atbilstoši 21. pantam kurā uzskaitīti arī izņēmumi), ir jāreģistrē Datu valsts inspekcijā. Protams, interesantākā lieta atkal ir – kādas tad sistēmas tur ir reģistrētas?
    To var apskatīt Datu valsts inspekcijas mājaslapā Personas datu apstrādes sistēmu reģistrā. Meklēšana notiek pēc sistēmas pārziņa nosaukuma vai tā daļas. Nezinu cik kopā šādas sistēmas tur ir sareģistrētas, bet šķiet, ka to ir diezgan daudz, piemēram, meklējot pēc 3 burtiem pil iegūstam 1328 ierakstus sākot ar Iedzīvotāju reģistru un beidzot ar neskaitāmu pašvaldību un uzņēmumu sistēmām.

    To, ka savus datus nevajag metāt pa labi un pa kreisi, vairums cilvēku ir sapratuši ar proporcinālu atkarību starp sava e-pasta publicēšanu publiskajā internetā (forumos, mājaslapās utt) un mēstuļu daudzumu e-pasta kastītē. Attiecībā uz saviem personas datiem vajadzētu pieiet vismaz ar tikpat lielu rūpību un vismaz reizi mūžā izlasīt visiem cilvēkiem (ne tikai juristiem) saprotamu pārstāstu par savām tiesībām attiecība uz saviem personas datiem un to elektronisku saglabāšanu.

    Nevajadzētu gan dzīvot ilūzijās, ka augšminētās ir vienīgās informācijas sistēmas, kur Jūsu datus var sastapt :)  Vēl vismaz ir tādas lietas kā noziedzīgi nodarījumi, sodāmības, tiesas, kā arī likumā Par valsts noslēpumu minētā informācija, kas uzskaitīta MK 26.10.2004. noteikumos Nr.887 “Valsts noslēpuma objektu saraksts“. No otras puses jācer, ka vairumam cilvēku šāda veida uzskaite ies secen.

    Izstrādājot datubāzes, kas pretendē uz Valsts informācijas sistēmu statusu, vai arī tādas, kas satur personas datus, jāatceras, ka pamatojoties uz augšminētajiem Valsts informācijas sistēmu likumu un Fizisko personu datu aizsardzības likumu ir izstrādāts bariņš ar MK noteikumiem, no kuriem svarīgākie varētu būt: