Nderek jejak Highload++ Siberia 2019 - 8 tugas ing Oracle

Hello!

Ing tanggal 24-25 Juni, konferensi Highload++ Siberia 2019 dianakake ing Novosibirsk. Wong lanang kita uga ana ing kana. laporan "Database wadhah Oracle (CDB / PDB) lan panggunaan praktis kanggo pangembangan piranti lunak", kita bakal nerbitake versi teks mengko. Iku kelangan, matur nuwun olegbunin kanggo organisasi, uga kanggo kabeh sing teka.

Nderek jejak Highload++ Siberia 2019 - 8 tugas ing Oracle
Ing kirim iki, kita pengin nuduhake karo sampeyan masalah sing ana ing stan supaya sampeyan bisa nyoba kawruh Oracle. Ing ngisor potongan kasebut ana 8 masalah, pilihan jawaban lan panjelasan.

Apa nilai urutan maksimum sing bakal kita deleng minangka asil ngeksekusi skrip ing ngisor iki?

create sequence s start with 1;
 
select s.currval, s.nextval, s.currval, s.nextval, s.currval
from dual
connect by level <= 5;

  • 1
  • 5
  • 10
  • 25
  • Ora, bakal ana kesalahan

NuwunMiturut dokumentasi Oracle (dikutip saka 8.1.6):
Ing statement SQL siji, Oracle bakal nambah urutan mung sapisan saben baris. Yen statement ngemot luwih saka siji referensi kanggo NEXTVAL kanggo urutan, Oracle nambah urutan sapisan lan ngasilake nilai sing padha kanggo kabeh kedadeyan NEXTVAL. Yen statement ngandhut referensi kanggo loro CURRVAL lan NEXTVAL, Oracle nambah urutan lan ngasilake nilai sing padha kanggo loro CURRVAL lan NEXTVAL preduli saka urutan ing statement.

Mangkono, Nilai maksimal bakal cocog karo jumlah garis, yaiku 5.

Pira larik bakal ana ing tabel minangka asil saka skrip ing ngisor iki?

create table t(i integer check (i < 5));
 
create procedure p(p_from integer, p_to integer) as
begin
    for i in p_from .. p_to loop
        insert into t values (i);
    end loop;
end;
/
 
exec p(1, 3);
exec p(4, 6);
exec p(7, 9);

  • 0
  • 3
  • 4
  • 5
  • 6
  • 9

NuwunMiturut dokumentasi Oracle (dikutip saka 11.2):

Sadurunge nglakokake statement SQL apa wae, Oracle menehi tandha titik panyimpenan implisit (ora kasedhiya kanggo sampeyan). Banjur, yen statement gagal, Oracle muter maneh kanthi otomatis lan ngasilake kode kesalahan sing ditrapake kanggo SQLCODE ing SQLCA. Contone, yen statement INSERT nyebabake kesalahan kanthi nyoba nglebokake nilai duplikat ing indeks unik, statement kasebut digulung maneh.

Telpon HP saka klien uga dianggep lan diproses minangka statement siji. Mangkono, telpon HP pisanan rampung kasil, wis nglebokake telung cathetan; telpon HP kaloro ends karo kesalahan lan muter maneh rekaman papat sing ngatur kanggo masang; telpon katelu gagal, lan ana telung cathetan ing meja.

Pira larik bakal ana ing tabel minangka asil saka skrip ing ngisor iki?

create table t(i integer, constraint i_ch check (i < 3));
 
begin
    insert into t values (1);
    insert into t values (null);
    insert into t values (2);
    insert into t values (null);
    insert into t values (3);
    insert into t values (null);
    insert into t values (4);
    insert into t values (null);
    insert into t values (5);
exception
    when others then
        dbms_output.put_line('Oops!');
end;
/

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

NuwunMiturut dokumentasi Oracle (dikutip saka 11.2):

Watesan mriksa ngidini sampeyan nemtokake kondisi sing kudu ditindakake saben baris ing tabel. Kanggo gawe marem alangan, saben baris ing tabel kudu nggawe kondisi salah siji TRUE utawa dingerteni (amarga null a). Nalika Oracle ngevaluasi kahanan kendala mriksa kanggo baris tartamtu, jeneng kolom ing kondisi kasebut nuduhake nilai kolom ing baris kasebut.

Mangkono, nilai null bakal ngliwati mriksa, lan blok anonim bakal dieksekusi kanthi sukses nganti nyoba nglebokake nilai 3. Sawise iki, blok penanganan kesalahan bakal mbusak pangecualian, ora ana rollback, lan bakal ana papat larik ing meja kanthi nilai 1, null, 2 lan null maneh.

Pasangan nilai sing bakal njupuk jumlah papan sing padha ing blok kasebut?

create table t (
    a char(1 char),
    b char(10 char),
    c char(100 char),
    i number(4),
    j number(14),
    k number(24),
    x varchar2(1 char),
    y varchar2(10 char),
    z varchar2(100 char));
 
insert into t (a, b, i, j, x, y)
    values ('Y', 'Вася', 10, 10, 'Д', 'Вася');

  • A lan X
  • B lan Y
  • C lan K
  • C lan Z
  • K lan Z
  • Aku lan J
  • J lan X
  • Kabeh didhaptar

NuwunPunika kutipan saka dokumentasi (12.1.0.2) ing nyimpen macem-macem jinis data ing Oracle.

Tipe Data CHAR
Tipe data CHAR nemtokake string karakter sing dawane tetep ing set karakter database. Sampeyan nemtokake set karakter database nalika nggawe database. Oracle mesthekake yen kabeh nilai sing disimpen ing kolom CHAR nduweni dawa sing ditemtokake miturut ukuran ing semantik dawa sing dipilih. Yen sampeyan nglebokake nilai sing luwih cendhek tinimbang dawa kolom, banjur Oracle blank-pads nilai kanggo dawa kolom.

Tipe Data VARCHAR2
Tipe data VARCHAR2 nemtokake string karakter variabel-dawa ing set karakter database. Sampeyan nemtokake set karakter database nalika nggawe database. Oracle nyimpen nilai karakter ing kolom VARCHAR2 persis kaya sing sampeyan nemtokake, tanpa bantalan kosong, yen nilai kasebut ora ngluwihi dawa kolom.

NUMBER Tipe Data
Jinis data NUMBER nyimpen nol uga nomer tetep positif lan negatif kanthi nilai absolut saka 1.0 x 10-130 nganti nanging ora kalebu 1.0 x 10126. 1.0 x 10126, banjur Oracle ngasilake kesalahan. Saben nilai NUMBER mbutuhake saka 1 nganti 22 bita. Nganggep iki, ukuran kolom ing bita kanggo nilai data numerik tartamtu NUMBER(p), ing ngendi p minangka presisi nilai sing diwenehake, bisa diwilang nggunakake rumus ing ngisor iki: BABAK((dawa(p)+s)/2))+1 ngendi s padha karo nul yen nomer positif, lan s padha karo 1 yen nomer negatif.

Kajaba iku, ayo njupuk kutipan saka dokumentasi babagan nyimpen nilai Null.

Null yaiku ora ana nilai ing kolom. Nulls nuduhake data sing ilang, ora dingerteni, utawa ora bisa ditrapake. Nulls disimpen ing database yen padha tiba ing antarane kolom karo nilai data. Ing kasus kasebut, mbutuhake 1 byte kanggo nyimpen dawa kolom (nol). Null ing jejere ora mbutuhake panyimpenan amarga header baris anyar menehi tandha yen kolom sing isih ana ing baris sadurunge null. Contone, yen telung kolom pungkasan saka tabel null, ora ana data sing disimpen kanggo kolom kasebut.

Adhedhasar data kasebut, kita mbangun nalar. Kita nganggep yen database nggunakake enkoding AL32UTF8. Ing enkoding iki, huruf Rusia bakal manggoni 2 bait.

1) A lan X, nilai kolom a 'Y' njupuk 1 byte, nilai kolom x 'D' njupuk 2 byte
2) B lan Y, 'Vasya' ing b Nilai bakal empuk karo spasi nganti 10 karakter lan bakal njupuk 14 bait, 'Vasya' ing d bakal njupuk 8 bait.
3) C lan K. Kaloro kolom kasebut nduweni nilai NULL, sawise ana lapangan sing signifikan, mula padha manggoni 1 byte.
4) C lan Z. Loro-lorone kolom duwe nilai NULL, nanging lapangan Z iku pungkasan ing meja, supaya ora njupuk munggah spasi (0 bait). Bidang C ngenggoni 1 byte.
5) K lan Z. Padha karo kasus sadurunge. Nilai ing kolom K manggoni 1 byte, ing Z - 0.
6) I lan J. Miturut dokumentasi, loro nilai bakal njupuk 2 bita. Kita ngetung dawa nggunakake rumus sing dijupuk saka dokumentasi: round((1 + 0)/2) +1 = 1 + 1 = 2.
7) J lan X. Nilai ing lapangan J bakal njupuk 2 bita, nilai ing lapangan X bakal njupuk 2 bita.

Secara total, pilihan sing bener yaiku: C lan K, I lan J, J lan X.

Apa kira-kira faktor clustering saka indeks T_I?

create table t (i integer);
 
insert into t select rownum from dual connect by level <= 10000;
 
create index t_i on t(i);

  • Udakara puluhan
  • Kira-kira atusan
  • Kira-kira ewonan
  • Kira-kira puluhan ewu

NuwunMiturut dokumentasi Oracle (dikutip saka 12.1):

Kanggo indeks B-tree, faktor clustering indeks ngukur panglompokan fisik saka baris sing ana hubungane karo nilai indeks.

Faktor clustering indeks mbantu pangoptimal mutusake apa scan indeks utawa scan tabel lengkap luwih efisien kanggo pitakon tartamtu). Faktor clustering kurang nuduhake scan indeks efisien.

Faktor clustering sing cedhak karo jumlah pamblokiran ing tabel nuduhake yen larik kasebut diurutake sacara fisik ing blok meja kanthi tombol indeks. Yen database nindakake scan tabel lengkap, banjur database cenderung kanggo njupuk larik lagi disimpen ing disk diurutake dening tombol indeks. Faktor clustering sing cedhak karo jumlah larik nuduhake yen larik kasebut kasebar kanthi acak ing pamblokiran database sing ana hubungane karo kunci indeks. Yen database nindakake scan tabel lengkap, database ora bakal njupuk baris ing sembarang urutan diurutake dening tombol indeks iki.

Ing kasus iki, data diurutake kanthi becik, saengga faktor clustering bakal padha karo utawa cedhak karo jumlah blok sing dikuwasani ing tabel. Kanggo ukuran blok standar 8 kilobyte, sampeyan bisa nyana kira-kira sewu angka sing sempit bakal cocog karo siji blok, saengga jumlah blok, lan minangka asil, faktor clustering bakal dadi. udakara puluhan.

Apa nilai N skrip ing ngisor iki bakal kasil dieksekusi ing basis data biasa kanthi setelan standar?

create table t (
    a varchar2(N char),
    b varchar2(N char),
    c varchar2(N char),
    d varchar2(N char));
 
create index t_i on t (a, b, c, d);

  • 100
  • 200
  • 400
  • 800
  • 1600
  • 3200
  • 6400

NuwunMiturut dokumentasi Oracle (dikutip saka 11.2):

Batesan Database Logis

item
Jinis Limit
Limit Nilai

indeks
Ukuran total kolom sing diindeks
75% saka ukuran blok database minus sawetara overhead

Dadi, ukuran total kolom sing diindeks ora kudu ngluwihi 6Kb. Apa sing kedadeyan sabanjure gumantung saka enkoding dhasar sing dipilih. Kanggo enkoding AL32UTF8, siji karakter bisa ngenggoni maksimal 4 bait, dadi ing kasus paling awon, 6 kilobyte bakal pas karo 1500 karakter. Mula, Oracle ora ngidini nggawe indeks ing N = 400 (nalika dawa kunci kasus paling ala yaiku 1600 karakter * 4 bita + dawa rowid), ing N = 200 (utawa kurang) nggawe indeks bakal bisa tanpa masalah.

Operator INSERT kanthi petunjuk APPEND dirancang kanggo mbukak data ing mode langsung. Apa sing kedadeyan yen ditrapake ing meja sing digantung pemicu?

  • Data bakal dimuat ing mode langsung, pemicu bakal bisa kaya samesthine
  • Data bakal dimuat ing mode langsung, nanging pemicu ora bakal dieksekusi
  • Data bakal dimuat ing mode konvensional, pemicu bakal bisa digunakake
  • Data bakal dimuat ing mode konvensional, nanging pemicu ora bakal dieksekusi
  • Data ora bakal dimuat, kesalahan bakal direkam

NuwunSejatine, iki luwih saka pitakonan logika. Kanggo nemokake jawaban sing bener, aku bakal menehi saran model penalaran ing ngisor iki:

  1. Selipan ing mode langsung dileksanakake dening tatanan langsung saka pamblokiran data, bypassing engine SQL, kang njamin kacepetan dhuwur. Mangkono, mesthekake eksekusi pemicu angel banget, yen ora mokal, lan ora ana gunane, amarga isih bakal alon-alon nglebokake sisipan.
  2. Gagal kanggo nglakokaké pemicu bakal mimpin kanggo kasunyatan sing, yen data ing tabel padha, negara database minangka kabèh (tabel liyane) bakal gumantung ing mode kang data iki dilebokake. Iki temenan bakal ngrusak integritas data lan ora bisa ditrapake minangka solusi ing produksi.
  3. Ora bisa nindakake operasi sing dijaluk umume dianggep minangka kesalahan. Nanging ing kene kita kudu ngelingi sing APPEND minangka pitunjuk, lan logika umum pitunjuk yaiku yen bisa dianggep, nanging yen ora, operator dieksekusi tanpa njupuk pitunjuk kasebut.

Dadi jawaban sing dikarepake yaiku data bakal dimuat ing mode normal (SQL), pemicu bakal murub.

Miturut dokumentasi Oracle (dikutip saka 8.04):

Pelanggaran saka Watesan bakal nimbulaké statement kanggo nglakokaké serially, nggunakake path insert conventional, tanpa bebaya utawa pesen kesalahan. Pangecualian yaiku watesan ing statement sing ngakses tabel sing padha luwih saka sapisan ing transaksi, sing bisa nyebabake pesen kesalahan.
Contone, yen pemicu utawa integritas referensial ana ing meja, banjur APPEND pitunjuk bakal digatèkaké nalika sampeyan nyoba nggunakake langsung-muat INSERT (seri utawa podo karo), uga pitunjuk utawa klausa PARALLEL, yen ana.

Apa sing bakal kelakon nalika skrip ing ngisor iki dieksekusi?

create table t(i integer not null primary key, j integer references t);
 
create trigger t_a_i after insert on t for each row
declare
    pragma autonomous_transaction;
begin
    insert into t values (:new.i + 1, :new.i);
    commit;
end;
/
 
insert into t values (1, null);

  • Kasil rampung
  • Gagal amarga kesalahan sintaksis
  • Kesalahan: Transaksi Otonom Ora Sah
  • Kesalahan sing gegandhengan karo ngluwihi maksimum nesting telpon
  • Kesalahan Pelanggaran Kunci Asing
  • Kesalahan sing ana gandhengane karo kunci

NuwunTabel lan pemicu digawe kanthi bener lan operasi iki ora nyebabake masalah. Transaksi otonomi ing pemicu uga diijini, yen ora, logging ora bisa ditindakake, contone.

Sawise nglebokake baris pisanan, pemicu sing sukses bakal nyebabake baris kapindho dilebokake, nyebabake pemicu murub maneh, nglebokake baris katelu, lan sateruse nganti statement gagal amarga ngluwihi maksimum nesting telpon. Nanging, titik subtle liyane teka menyang muter. Nalika pemicu dieksekusi, komit durung rampung kanggo rekaman sing dilebokake pisanan. Mulane, pemicu sing mlaku ing transaksi otonom nyoba nglebokake ing tabel baris sing ngrujuk kunci manca menyang rekaman sing durung ditindakake. Iki nyebabake ngenteni (transaksi otonom ngenteni transaksi utama kanggo ndeleng manawa bisa nglebokake data) lan ing wektu sing padha transaksi utama ngenteni transaksi otonom kanggo terus kerja sawise pemicu. Ana deadlock lan, minangka asil, transaksi otonom dibatalake amarga alasan sing ana gandhengane karo kunci.

Mung pangguna pangguna sing bisa melu survey. mlebunggih.

Iku angel kanggo?

  • Kaya rong driji, aku langsung mutusake kabeh kanthi bener.

  • Ora tenan, aku salah ing sawetara pitakonan.

  • Aku ditanggulangi setengah saka iku bener.

  • Aku guessed jawaban kaping pindho!

  • Aku bakal nulis ing komentar

14 pangguna milih. 10 kedhaftar abstained.

Source: www.habr.com

Add a comment