Oracle SQL teikuma izpildes plāns – prezentācija

marts 28, 2009

Latvijas Oracle lietotāju grupas (LVOUG) pirmā konference/seminārs ir veiksmīgi beidzies – paldies tā organizētājiem! Nezinu īsti, cik oficiāli bija cilvēku pieteikušies, bet es teiktu, ka kāds simtiņš kopā sanāca. Pasākums bija atšķirīgs no oficiālājām Oracle dienām ar to, ka nebija nevienas prezentācijas (vismaz no tām, ko apmeklēju es), kurā nodarbotos ar mārketingu 😉 Visas prezentācijas bija tehniski orientētas un bez oficiālajiem reklāmas rullīšiem.

Arī es stāstīju prezentāciju par SQL teikuma izpildes plānu – kā to iegūt, kā attēlot, kā saprast un kā uzlabot. Centos pastāstīt arī par dažām visbiežāk izpildāmajām operācijām un jo sevišķi sīkāk par fiziskajiem savienojumu izpildes veidiem (nested loops, hash join, sort merge join).

Tiem, kam ir dziļāka interese par SQL teikuma izpildes plānu un kam nepaveicās nokļūt uz neseno Tanela Podera semināru, es gribētu speciāli uzsvērt šo viņa emuāra rakstu, kurā ir saite uz failu “Oracle SQL Plan Execution: How It Really Works”. Tā prezentācija ir ļoti interesanta pat tad, ja klātienē nedzirdējāt sīkāku stāstu.

Un visbeidzot šeit ir arī saite uz manis lasīto prezentāciju par to kā saprast SQL teikuma izpildes plānu.


Indeksu spožums un posts

marts 4, 2009

Kas ir indekss?

Indeksi popularitātes ziņā droši vien ir nākošie objekti datubāzēm pēc tabulām. Tos bieži izmanto vietā un iespējams gandrīz tikpat bieži patiesībā lieto nevajadzīgi. Bet tātad vispirms būtu jāsaprot, kas tad tie ir un kāda aptuveni ir to uzbūve.

Parasti runājot par indeksiem vispirms tos saprot kā kokveidīgu struktūru, kuras pirmais un galvenais uzdevums ir ātri atrast datus tabulā, kuras dati, ja vien tā nav ļoti speciāla veida tabula, ir nesakārtoti. Nākošajā attēlā ir parādīta konceptuāla indeksa struktūra. Protams, ka reālajās implementācijās katrā DBVS tas ir mazliet atšķirīgi, bet ideja paliek viena un tā pati – koks, pa kuru ātri nonāk līdz nepieciešamajai vērtībai un tad taisnā ceļā izmantojot norādes dodas uz tabulu, no kuras var nolasīt konkrēto ierakstu. Nevajadzētu, protams, arī uztvert datu bloku skaitīšanu kā precīzu algoritmu, kas pie šīm vērtībām tā arī notiek, bet drīzāk kā konceptuālu ideju.

Indekss un tabula

Indekss un tabula

Tātad, ja mēs meklējam vērtību “Kuldīga” (nosacījums WHERE pilsetas_nosaukums = ‘Kuldīga’) tabulā, tad mums ir divas iespējas: Lasīt pārējo šī ieraksta daļu »


LVOUG pirmā konference

marts 2, 2009

Jauns gads ar jauniem vietējiem pasākumiem ir klāt. 27. martā (šajā 2009. gadā, protams 🙂 ) Latvijas Oracle lietotāju grupa rīko savu pirmo konferenci. Tā sākas pusdienlaikā 13.00 un paralēli notiks 2 sesijās. Konferencē uzstāsies vietējie LVOUG pārstāvji, kas dalīsies pieredzē par dažām Oracle 11g jaunajām iespējām ieskaitot 11g SQL plānu pārvaldību un Database replay iespēju, vairākas prezentācijas no administratoru skatupunkta, Oracle vs MySQL (kazi varētu būt interesanti ne tikai rūdītiem Oracle faniem) un Raimonda iemīļotais jājamzirdziņš Ruby on Rails. Arī es centīšos dot savu artavu šai lietā ar prezentāciju par SQL teikuma izpildes plānu (execution plan), tā iegūšanu un izpratni, mazdruscīt par biežākājām tajos sastopamajām operācijām, tai skaitā savienojumu (join) fiziskajiem izpildīšanas veidiem (nested loops, hash join, merge join) un mazliet par garajām operācijām (long operations).

Papildus pašmāju bāleliņiem (jā kur gan mums ir daiļā dzimuma pārstāves??) būs arī viesis Kuassi Mensah no Oracle, kurš uzstāsies ar divām prezentācijām.

Ja nu Tu, lasītāj, skaties un nesaproti, kāpēc Tevis nav konferences prezentētāju sarakstā, vai arī Tu varētu kaut ko interesantu citiem pastāstīt, tad seko līdzi LVOUG grupas e-pasta listei un nākošreiz piesakies! Pie tam vajadzētu atcerēties, ka ne jau tikai hiperjaunās un hipersarežģītās lietas ir vērts stāstīt, Oracle ir pietiekami liela un monstroza, lai atrastu gana interesantas tēmas arī it kā zināmākās lietās un vietās.

Vēl svarīgi zināt – dalība konferencē ir bezmaksas, bet nepieciešams reģistrēties šeit.

Un visbeidzot – konference notiks viesnīcā Monika Elizabetes ielā 21. Tā ir viesnīca uz Elizabetes un Pulkveža Brieža ielas stūra, turpat apakšā ir restorāns Vincents sevišķajiem gardēžiem 😉

Saites


Oracle datubāzes vēsture

februāris 5, 2009

Nesen vienā no forumiem piedalījos kārtējā diskusijā par SQL Server vs Oracle (visnotaļ kulturālā bez apvainojumu mētāšanas) un tur panesās mazliet arī kas kuram bijis pirmais. Tad nu pašizglītošanās un intereses nolūkos veltīju pāris stundas googlei un vēstures lasīšanai. Pirmais interesantais novērojums radās par pašiem rakstiem kā tādiem – SQL Server vēsture pārsvarā bija stāsti (interesanti, mazāk interesanti, bet stāsti) par vēsturi, stāstījuma formā ar versijām, dažām iesaistītajām personām, sastaptajām problēmām utml., bet ar relatīvi minimālu un neuzsvērtu iespēju (features) uzskaitījumu. Savukārt ar Oracle vēsturi bija krietni savādāk, jau otrajā saitē es atradu nosacītu vēsturi, kur visa vēsture bija versiju un to iespēju uzskaitījums smuki saformatēts, bez nekādiem stāstījumiem. Skatoties uz to man radās tāda interesanta doma – vai tik tas zināmā mērā neatspoguļo to cilvēku iezīmes, kas ar šim DBVS darbojas – vieni vairāk orientēti uz stāstījumu, otri vairāk uz sausu pārskaitījumu? 🙂

Bet tagad pie lietas – došu ieskatu par versijām, to izlaišanas gadiem un dažām sniegtajām iespējām -, ja kādu interesē sīkumos, tad lasiet materiālus zemāk dotajās saitēs.

Oracle

  • 1. versija oficiāli netika izlaista, tā bija eksperimentāla. Neatceros kur, bet esmu lasījis baumas, ka Oracle vispār neko nevēlējās izlaist ar versijas numuru 1, lai izskatītos, ka produkts ir nobriedušāks 🙂
  • 2. versija izlaista 1979. gadā, uzrakstīta assemblerī, tajā bija vaicājumi un savienojumi un arī rekursīvie vaicājumi.
  • 3. versija izlaista 1981. gadā, pārrakstīta iekš C, parādījās tranzakciju mehānisms un lasītāji vairs nebloķē pārējos DBVS lietotājus.
  • 4. versija izlaista 1984. gadā, konsistents skats uz datiem (read consistency) un DBVS jau var izmantot uz vairākām platformām.
  • 5.0 un 5.1 versijas izlaistas attiecīgi 1985. un 1986. gadā, parādījās klienta-servera arhitektūra atbalsts (klients uz personālā datora, datubāze uz servera) un sadalītie vaicājumi (distributed query).
  • 6.0 un 6.2 versijas izlaistas 1988 gadā. Parādījās tādas lietas kā ierakstu līmeņa bloķēšana, rezerves kopiju veidošana laikā, kamēr datubāze darbojas, b-koku indeksi un pl/sql aizmetņi datubāzē.

Sākot ar 7. versiju izmaiņas ir tik nozīmīgas, ka katru laidienu ir vērts pieminēt atsevišķi.

  • 7.0 versija izlaista 1992 gadā. Ieviesti datubāzes integritātes ierobežojumi, saglabātās procedūras (stored procedures), funkcijas un pakotnes, trigeri, izmaksu bāzētais optimizators (cost based optimizer, CBO) un vēl daudz citi.
  • 7.1 versija izlaista 1994 gadā. Replicēšana (Advanced Replication), Dinamiskais SQLs un paralēlie vaicājumi un vēl citi jaunumi šai versijā.
  • 7.2 versija izlaista 1995 gadā. Lielākās izmaiņas – datu failus iespējams palināt gan automātiski, gan manuāli, apakšvaicājumi FROM klauzā, PL/SQL kursoru mainīgie, periodiski procesi datubāzē – DBMS_JOB pakotne.
  • 7.3. versija izlaista 1996 gadā. Lielākie jaunumi – bitmapu indeksi, konteksta un spatial (ģeogrāfisko datu) glabāšanas iespējas, treisošana u.c. daudzas mazākas iespējas.
  • 8.0 versija izlaista 1997 gadā. Jaunumi – objektu tipi, dažādas lietas particionēšanai, Recovery manager (RMAN, rīks jebkuram DBA, kam rūp datubāzes drošība), indeksu organizētās tabulas u.c.
  • 8.1. arī 8i (i – internet) versija, 1999 gads. Šeit nu jauno iespēju klāsts ir vienkārši biedējošs, bet svarīgākās no tām ir:
    •  java datubāzē,
    • virtuālā privātā datubāze – veids kā nodrošināt pieeju tikai noteiktiem datiem neatkarīgi no aplikācijas,
    • atkal jaunas particionēšanas iespējas,
    • pagaidu tabulas (temporary tables),
    • transportējamās tabultelpas (transportable tablespaces) – tabultelpu kopēšana no vienas db uz otru,
    • funkciju bāzēti ineksi,
    • analītiskās funkcijas u.c.
  • 9.0 (9i versijas pirmais laidiens), 2001. gads. Iespējas atkal ir krietni daudz:
    •  automātiskā undo pārvaldība, iespēja aizmirst atrites segmentus (rollback segments) un to pareizu izmēru izveidi.
    • Flashback vaicājumi – iespēja skatīties datus pagātnē pat pēc Commit veikšanas,
    • paralēlais serveris ieguvis jaunu vārdu Real Application Clusters un tam tiek izmantots speciāls kešs, tādējādi ļoti būtiski uzlabojot tā ātrdarbību,
    • dinamiska atmiņas pārvaldība,
    • XML datu tipi datubāzē,
    • Oracle Standby pārsaukta par Oracle Data Guard, nodrošina loģisko un fizisko rezerves (standby) datubāzi u.c.
  • 9.2 (9i versijas otrais laidiens), 2002. gads. Jaunās iespējas:
    • Oracle Streams – jauna datu kopēšanas/replikācijas iespēja,
    • XML DB,
    • datu kompresija tabulu un indeksu datiem,
    • dažādi drošības uzlabojumi.
  • 10.1 (10g versijas pirmais laidiens, g – grid), 2004. gads. Jaunās iespējas:
    • model klauza,
    • Automatic Workload Repository (AWR) un Automatic Database Diagnostic Monitor (ADDM) – informācijas krātuve un automātisks analīzes rīks ātrdarbības problēmu risināšanai – pagaidām vēl bērna autiņos, bet sākums ir,
    • Flashback operācijas ierakstu, tabulu un datubāzes līmenī – tai skaitā iespēja atjaunot dzēstu (drop) tabulu un visu datubāzi atgriezt stāvoklī, kāds tas bija pirms kāda laiciņa – bez rezerves kopiju pielietošanas,
    • tabultelpas izmēros līdz 8 eksabaitiem,
    • datapump – rīks datu pārnešanai no vienas db uz otru, daudz ātrāks nekā oriģinālais eksports/imports,
    • pakotne dbms_scheduler ar milzīgām iespējām periodisko procesu organizēšanā,
    • rezerves kopiju kompresēšana,
    • Automatic Storage Mangement (ASM) – speciāla instance, kas nodrošina failu vadību, tai skaitā, automātisku IO balansēšanu, spoguļošanu, vietas pievienošanu, nav vairs nepieciešams norādīt tabultelpu faila vārdus, pietiek norādīt, ka tie glabājas ASM diskgrupā,
    • regulārās izteiksmes utt.
  • 10.2 (10g versijas otrais laidiens), 2005. gads. Jaunās lietas:
    • Rules Manager – notikumu apstrāde un darbību izpilde, ja izpildās noteikti nosacījumi,
    • XQuery,
    • iespēja tabultelpas pārvietot starp dažādām (piemēram, windows, linux) operētājsistēmām,
    • Transparent Data Encryption – tabulu kolonas var šifrēt neatkarīgi no aplikācijas,
    • ātrdarbības un funkcionāli uzlabojumi ļoti daudzām DBVS iespējām.
  • 11.1 (11g versijas pirmais laidiens), 2007. gads. Atkal vesels bars ar pilnīgi jaunām iespējām un, protams, uzlabojumi jau esošajām:
    • Total Recall – norādītām tabulām ierakstu vēsture tiek automātiski saglabāta drošā arī administratoram nepieejamā vietā (vismaz datu mainīšanai) un pieejama vienkāršiem datu atlases vaicājumiem no bāzes tabulām ar speciālu sintaksi,
    • Advanced Compression – datu kompresija, kam iestrādes jau bija iepriekšējās versijās iznesta atsevišķā pakā un nodrošina kompresiju tabulām, rezerves kopijām, DatPump eksporta failiem un atsevišķām tīkla operācijām,
    • Real Application Testing (RAT) – iespēja ierakstīt visas veiktās darbības vienā datubāzē un izpildīt to vēlreiz citā vidē, pēc jaunas versijas, ielāpa, servera vai kā cita maiņas un analizēt ātrdarbības izmaiņas,
    • Virtuālas kolonas,
    • tabulas var uzstādīt tikai lasāmas,
    • jaunas PIVOT un UNPIVOT operācijas,
    • SQL, PL/SQL vaicājumu un funkciju vērtību kešošana atmiņā,
    • OCI klienta puses SQL vaicājumu kešošana,
    • dažādi PL/SQL uzlabojumi – iespēja norādīt trigeru kārtību, salikti trigeri, iespēja referencēt tieši sekvences utt.,
    • tabultelpu šifrēšana,
    • iespēja pilnībā automātiski pārvaldīt operatīvo atmiņu,
    • un vēl vairāk kā 300 dažādu uzlabojumu.

11g pirmais laidiens pašlaik arī ir pēdējā versija. Par otro laidienu klīst baumas, ka tas būšot nu jau kaut kad šogad, kā arī pēc tam varētu parādīties 11 versija Express Edition (bezmaksas) datubāzes redakcijai.

Tie, kuriem nenormāli interesē vēsture, var gūt plašu un sīku ieskatu visās izmaiņās sākot no 7.0 versijas Oracle dokumentācijā:

Tālākā lasāmviela


Par objektu (ne)nosaukumiem

janvāris 31, 2009

Nesen boot forumā bija kārtējais jautājums – vai var izveidot tabulu kolonu nosaukumus izmantojot ciparus. Vismaz man zināmajās var gan, tikai problēma ir mazliet cita – tā rezultātā mēs veidojam objektu nosaukumus, ar kuriem var ļoti viegli kļūdīties. Padomājiet paši – ja kolonas nosaukums ir skaitlis, cik grūti ir vienai kolonai pieskaitīt nevis otru kolonu, kuras nosaukums ir “2”, bet vienkārši skaitli 2? Otra lieta – vienmēr jāatceras, ka kolonas nosaukums jāliek pēdiņās (Oracle) vai apostrofos (MySQL), vai iespējams vēl kādos citos specsimbolos, savukārt, ja ir ielikts, tad atkal lasot kodu ir ļoti viegli palaist garām to, ka tā ir kolona, nevis vienkārši skaitlis 2.

Nu lūk domājot par šīm jaukajām iespējām, ka SQLā izmantot dažādas iespējas kā sabojāt gan savu, gan nākošo koda uzturētāju dzīvi, nāk prātā dažas iespējas, ar kurām gribējās padalīties publiski. Piemēri Oraclē, bet līdzīgas tehnikas noteikti var izmantot arī citur.

Mēs varam izveidot tabulas ar identiskiem nosaukumiem, tikai vienu lielajiem, vienu mazajiem burtiem:

SQL> create table A (lielais number);
Table created.
SQL> create table "a" (mazais number);
Table created.

Pētam kāda tad nu izskatā tabula A un tabula a:

SQL> desc A
 Name                                      Null?    Type
 ----------------------------------------- -------- -------
 LIELAIS                                            NUMBER
SQL> desc a
 Name                                      Null?    Type
 ----------------------------------------- -------- -------
 LIELAIS                                            NUMBER

Hmmm, kaut kā dīvaini, vai ne? Tas tāpēc, ka Oracle noklusēti visus nenopēdiņotus objektu identifikatorus pārveido uz lielajiem burtiem. Lai tiktu pie tabulas a, mums nosaukums jāraksta pēdiņās:

SQL> desc "a"
 Name                                      Null?    Type
 ----------------------------------------- -------- -------
 MAZAIS                                             NUMBER

Bet tas ir tikai priekš pirmziemniekiem. Krutāki džeki varētu spert soli tālāk un izveidot piemēram tabulas nosaukumu, kā tukšuma simbolu (space). Tad meklējot tabulu nosaukumus shēmā, cilvēkus ar vājākiem nerviem var viegli novest pie pārliecības, ka nupat ir iegūta nopietna Oracles kļūda – 3 ieraksti atlasīti, bet rāda tikai divus :O

SQL> create table " " (A number, "a" number);
Table created.
SQL> select table_name from user_tables;
TABLE_NAME
------------------------------
a

A
3 rows selected.

Bet nekas, arī tas vēl nav viss. Vai tad mums būtu jāapmierinās tikai ar simboliem, kas iegūstami uz klaviatūras? Noteikti nē! Atceramies (vai uzzinam kā nu kurš) par jauko iespēju lietot ALT taustiņu kopā ar cipartastatūras (numeric keypad) taustiņiem. Lūk izmantojam ALT+223 un iegūstam brīnišķīgu kolonas nosaukumu:

SQL> create table abnormal ("▀" number);
Table created.
SQL> desc abnormal
 Name                                      Null?    Type
 ----------------------------------------- -------- -------
 ▀                                                  NUMBER

Tiec nu tagad manai kolonai klāt! 😉

Varam, protams, paeksperimentēt ar iebūvētajām funkcijām, arī tas dod iespēju izveidot kolonu, pie kuras nemaz tik viegli nevar tikt klāt. Tātad neieliekot kolonas nosaukumu pēdiņās, to nemaz neredz.

SQL> create table personas (vards varchar2(10), "SYSDATE" date);
Table created.
SQL> insert into personas values ('Jānis', sysdate-1);
1 row created.
SQL> select vards, sysdate from personas;
VARDS      SYSDATE
---------- ---------
Jānis      31-JAN-09
1 row selected.
SQL> select vards, "SYSDATE" from personas;
VARDS      SYSDATE
---------- ---------
Jānis      30-JAN-09

Nu lūk  nepavisam nav nepieciešams apmierināties tikai ar cipariem un skaitļiem, novest ļaudis totālā nesapratnē var arī daudz elegantāk un efektīvāk 🙂