Nuturkeun tapak suku Highload++ Siberia 2019 - 8 tugas dina Oracle

Salam!

Dina 24-25 Juni, konferensi Highload++ Siberia 2019 diayakeun di Novosibirsk. Urang ogé aya di dinya. laporan "Database wadahna Oracle (CDB / PDB) sarta pamakéan praktis maranéhna pikeun ngembangkeun software", urang bakal nyebarkeun versi téks saeutik engké. Ieu tiis, hatur nuhun olegbunin pikeun organisasi, kitu ogé ka dulur anu datang.

Nuturkeun tapak suku Highload++ Siberia 2019 - 8 tugas dina Oracle
Dina postingan ieu, kami hoyong bagikeun sareng anjeun masalah anu aya di stan kami supados anjeun tiasa nguji pangaweruh Oracle anjeun. Di handap cut aya 8 masalah, pilihan jawaban jeung katerangan.

Naon nilai runtuyan maksimum urang bakal ningali salaku hasil tina executing Aksara handap?

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
  • Henteu, bakal aya kasalahan

jawabanNumutkeun kana dokuméntasi Oracle (dicutat tina 8.1.6):
Dina hiji pernyataan SQL tunggal, Oracle bakal increment runtuyan ngan sakali per baris. Lamun hiji pernyataan ngandung leuwih ti hiji rujukan ka NEXTVAL pikeun runtuyan, Oracle increments runtuyan sakali tur mulih nilai sarua pikeun sakabéh kajadian anu lumangsungna NEXTVAL. Lamun hiji pernyataan ngandung rujukan pikeun duanana CURRVAL na NEXTVAL, Oracle increments runtuyan jeung mulih nilai sarua pikeun duanana CURRVAL na NEXTVAL paduli urutan maranéhanana dina pernyataan.

Ku kituna, nilai maksimum bakal pakait jeung jumlah garis, nyaeta 5.

Sabaraha baris dina tabél salaku hasil tina ngajalankeun skrip di handap ieu?

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

jawabanNumutkeun kana dokuméntasi Oracle (dicutat tina 11.2):

Sateuacan ngalaksanakeun naon waé pernyataan SQL, Oracle nandaan titik panyimpen implisit (henteu sayogi pikeun anjeun). Lajeng, lamun pernyataan gagal, Oracle gulung deui otomatis tur mulih kodeu kasalahan lumaku pikeun SQLCODE di SQLCA. Contona, upami pernyataan INSERT ngabalukarkeun kasalahan ku cara nyelapkeun nilai duplikat dina indéks unik, pernyataan ieu digulung deui.

Nelepon HP ti klien ogé dianggap tur diolah salaku pernyataan tunggal. Ku kituna, telepon HP munggaran réngsé kalawan sukses, sanggeus diselapkeun tilu rékaman; telepon HP kadua ditungtungan make kasalahan jeung gulung deui catetan kaopat yén éta junun nyelapkeun; telepon katilu gagal, tur aya tilu rékaman dina tabél.

Sabaraha baris dina tabél salaku hasil tina ngajalankeun skrip di handap ieu?

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

jawabanNumutkeun kana dokuméntasi Oracle (dicutat tina 11.2):

Konstrain cek ngamungkinkeun anjeun nangtukeun kaayaan anu kedah nyugemakeun unggal baris dina tabél. Pikeun nyugemakeun konstrain, unggal baris dina tabél kudu nyieun kaayaan boh BENER atawa kanyahoan (kusabab null a). Nalika Oracle ngaevaluasi kaayaan konstrain cek pikeun baris tinangtu, naon waé ngaran kolom dina kaayaan ngarujuk kana nilai kolom dina baris éta.

Ku kituna, nilai null bakal lulus cek, sarta blok anonim bakal dieksekusi hasil dugi usaha nyelapkeun nilai 3. Sanggeus ieu, blok penanganan kasalahan bakal mupus iwal, euweuh rollback bakal lumangsung, sarta bakal aya opat jajar ditinggalkeun dina tabél kalawan nilai 1, null, 2 jeung null deui.

Pasangan nilai anu mana anu bakal nyandak jumlah rohangan anu sami dina blok?

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 jeung X
  • B jeung Y
  • C jeung K
  • C jeung Z
  • K jeung Z
  • Abdi sareng J
  • J jeung X
  • Kabéh didaptarkeun

jawabanDi dieu excerpts tina dokuméntasi (12.1.0.2) dina nyimpen rupa-rupa data dina Oracle.

Tipe Data CHAR
Tipe data CHAR nangtukeun string karakter panjangna tetep dina set karakter database. Anjeun nangtukeun set karakter database mun anjeun nyieun database anjeun. Oracle mastikeun yén sadaya nilai anu disimpen dina kolom CHAR gaduh panjang anu ditangtukeun ku ukuran dina semantik panjang anu dipilih. Upami anjeun nyelapkeun nilai anu langkung pondok tibatan panjang kolom, maka Oracle kosongkeun nilai kana panjang kolom.

Tipe Data VARCHAR2
Tipe data VARCHAR2 nangtukeun string karakter panjangna variabel dina set karakter database. Anjeun nangtukeun set karakter database mun anjeun nyieun database anjeun. Oracle nyimpen nilai karakter dina kolom VARCHAR2 persis sakumaha anjeun nangtukeun eta, tanpa padding kosong, disadiakeun nilaina teu ngaleuwihan panjang kolom.

NUMBER Tipe Data
Tipe data NUMBER nyimpen enol ogé angka tetep positif jeung negatif kalayan nilai mutlak ti 1.0 x 10-130 nepi ka tapi teu kaasup 1.0 x 10126. Lamun nangtukeun hiji éksprési arithmetic anu nilaina boga nilai mutlak leuwih gede atawa sarua jeung 1.0 x 10126, lajeng Oracle mulih kasalahan. Unggal nilai NUMBER merlukeun ti 1 nepi ka 22 bait. Nyandak ieu kana akun, ukuran kolom dina bait pikeun nilai data numerik tinangtu NUMBER(p), dimana p nyaéta precision tina nilai dibikeun, bisa diitung ngagunakeun rumus ieu: BABAK((panjang(p)+s)/2))+1 dimana s sarua jeung nol lamun jumlahna positif, jeung s sarua 1 lamun jumlahna négatip.

Salaku tambahan, hayu urang nyandak petikan tina dokuméntasi ngeunaan nyimpen nilai Null.

Null nyaéta henteuna nilai dina kolom. Nulls nunjukkeun data leungit, kanyahoan, atawa teu bisa dipake. Nulls disimpen dina database lamun aranjeunna digolongkeun antara kolom kalawan nilai data. Dina kasus ieu, aranjeunna merlukeun 1 bait pikeun nyimpen panjang kolom (nol). Nulls labuh dina baris merlukeun euweuh gudang sabab lulugu baris anyar sinyal yén kolom sésana dina baris saméméhna null. Contona, upami tilu kolom panungtungan tabel null, lajeng euweuh data disimpen pikeun kolom ieu.

Dumasar data ieu, urang ngawangun penalaran. Urang nganggap yén database ngagunakeun AL32UTF8 encoding. Dina encoding ieu, hurup Rusia bakal ngeusian 2 bait.

1) A jeung X, nilai widang a 'Y' nyokot 1 bait, nilai widang x 'D' nyokot 2 bait
2) B jeung Y, 'Vasya' dina b nilai bakal padded kalawan spasi nepi ka 10 karakter tur bakal nyandak 14 bait, 'Vasya' dina d bakal nyandak 8 bait.
3) C jeung K. Duanana widang boga nilai NULL, sanggeus aranjeunna aya widang signifikan, ngarah nempatan 1 bait.
4) C jeung Z. Duanana widang boga nilai NULL, tapi widang Z nyaéta panungtungan dina tabél, jadi teu butuh spasi (0 bait). Widang C nempatan 1 bait.
5) K jeung Z. Sarua jeung kasus saméméhna. Nilai dina widang K ngawengku 1 bait, dina Z - 0.
6) I jeung J. Numutkeun dokuméntasi, duanana nilai bakal nyandak 2 bait. Kami ngitung panjangna nganggo rumus anu dicandak tina dokuméntasi: round((1 + 0)/2) +1 = 1 + 1 = 2.
7) J jeung X. Nilai dina widang J bakal nyandak 2 bait, nilai dina widang X bakal nyandak 2 bait.

Dina total, pilihan anu leres nyaéta: C sareng K, I sareng J, J sareng X.

Naon kira-kira bakal faktor clustering tina indéks 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);

  • Kira-kira puluhan
  • Kira-kira ratusan
  • Kira-kira rebuan
  • Kira-kira puluhan rébu

jawabanNumutkeun kana dokuméntasi Oracle (dicutat tina 12.1):

Pikeun indéks B-tangkal, faktor clustering indéks ngukur grup fisik baris dina hubungan hiji nilai indéks.

Faktor clustering indéks mantuan optimizer mutuskeun hiji scan indéks atawa scan tabel pinuh leuwih efisien keur queries tangtu). Faktor clustering low nunjukkeun hiji scan indéks efisien.

Faktor clustering nu deukeut ka jumlah blok dina tabel nunjukkeun yén barisan fisik maréntahkeun dina blok méja ku konci indéks. Upami pangkalan data ngalakukeun scan tabel lengkep, pangkalan data condong nyandak barisan nalika disimpen dina disk anu diurutkeun ku konci indéks. Faktor clustering nu deukeut jeung jumlah baris nunjukkeun yén baris sumebar acak sakuliah blok database dina hubungan konci indéks. Upami pangkalan data ngalakukeun scan tabel lengkep, maka pangkalan data moal nyandak barisan dina urutan anu diurutkeun ku konci indéks ieu.

Dina hal ieu, data ideally diurutkeun, jadi faktor clustering bakal sarua atawa deukeut jeung jumlah blok nempatan dina tabél. Pikeun ukuran blok standar 8 kilobytes, anjeun tiasa ngaharepkeun yén kira-kira sarébu nilai angka sempit bakal pas kana hiji blok, janten jumlah blok, sareng salaku hasilna, faktor clustering bakal ngeunaan puluhan.

Dina naon nilai N bakal skrip di handap ieu suksés dieksekusi dina database biasa sareng setélan 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

jawabanNumutkeun kana dokuméntasi Oracle (dicutat tina 11.2):

Batesan database logis

barang
Jinis Wates
Wates Nilai

Indéksna
Ukuran total kolom indéks
75% tina ukuran blok database dikurangan sababaraha overhead

Ku kituna, total ukuran kolom indéks teu kudu ngaleuwihan 6Kb. Naon anu lumangsung salajengna gumantung kana panyandian dasar anu dipilih. Pikeun panyandian AL32UTF8, hiji karakter tiasa ngeusian maksimal 4 bait, janten dina skenario anu paling parah, sakitar 6 karakter bakal pas kana 1500 kilobyte. Ku alatan éta, Oracle bakal ngalarang nyiptakeun indéks dina N = 400 (nalika panjang konci kasus parah nyaéta 1600 karakter * 4 bait + panjang rowid), sedengkeun dina N = 200 (atanapi kirang) nyieun indéks bakal dianggo tanpa masalah.

Operator INSERT sareng petunjuk APPEND dirancang pikeun ngamuat data dina modeu langsung. Naon anu lumangsung lamun dilarapkeun kana tabel nu pemicu hangs?

  • Data bakal dimuat dina modeu langsung, pemicu bakal dianggo saperti nu diharapkeun
  • Data bakal dimuat dina modeu langsung, tapi pemicu moal dieksekusi
  • Data bakal dimuat dina modeu konvensional, pemicu bakal dianggo sakumaha sakuduna
  • Data bakal dimuat dina modeu konvensional, tapi pemicu moal dieksekusi
  • Data moal dimuat, kasalahan bakal dirékam

jawabanDasarna, ieu langkung seueur patarosan ngeunaan logika. Pikeun mendakan jawaban anu leres, kuring bakal nyarankeun modél penalaran ieu:

  1. Selapkeun dina modeu langsung dipigawé ku formasi langsung tina blok data, bypassing mesin SQL, nu ensures speed tinggi. Ku kituna, mastikeun palaksanaan pemicu mangrupa hésé pisan, upami teu mungkin, tur teu aya gunana, sabab masih bakal radikal ngalambatkeun turun sisipan.
  2. Gagalna ngaéksekusi pemicu bakal ngakibatkeun kanyataan yén, lamun data dina tabél sarua, kaayaan database sakabéhna (tabél séjén) bakal gumantung kana mode nu data ieu diselapkeun. Ieu écés bakal ngancurkeun integritas data sarta teu bisa dilarapkeun salaku solusi dina produksi.
  3. Henteu mampuh pikeun ngalakukeun operasi anu dipénta umumna dianggap kasalahan. Tapi di dieu urang kedah émut yén APPEND mangrupikeun petunjuk, sareng logika umum petunjuk nyaéta yén aranjeunna dipertimbangkeun upami mungkin, tapi upami henteu, operator dieksekusi tanpa nyandak petunjuk.

Jadi jawaban nu dipiharep téh data bakal dimuat dina modeu normal (SQL), pemicu bakal seuneu.

Numutkeun kana dokuméntasi Oracle (dicutat tina 8.04):

Pelanggaran larangan bakal ngabalukarkeun pernyataan pikeun ngajalankeun serially, ngagunakeun jalur sisipan konvensional, tanpa warnings atawa pesen kasalahan. Pangecualian nyaéta larangan dina pernyataan anu ngaksés méja anu sami langkung ti sakali dina transaksi, anu tiasa nyababkeun pesen kasalahan.
Salaku conto, upami pemicu atanapi integritas referensial aya dina tabél, teras APPEND hint bakal dipaliré nalika anjeun nyobian nganggo INSERT langsung-beban (serial atanapi paralel), ogé petunjuk atanapi klausa PARALLEL, upami aya.

Naon anu bakal kajadian nalika skrip di handap ieu 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);

  • palaksanaan suksés
  • Gagal kusabab kasalahan sintaksis
  • Kasalahan: Transaksi Otonom Teu Sah
  • Kasalahan patali jeung ngaleuwihan maksimum panggero nyarang
  • Kasalahan Pelanggaran Key Asing
  • Kasalahan patali konci

jawabanMéja sareng pemicu didamel leres sareng operasi ieu henteu kedah nyababkeun masalah. Transaksi otonom dina pemicu ogé diijinkeun, upami henteu logging moal mungkin, contona.

Saatos nyelapkeun baris kahiji, pemicu anu suksés bakal nyababkeun baris kadua diselapkeun, nyababkeun pemicu hurung deui, nyelapkeun baris katilu, sareng saterasna dugi ka pernyataan gagal kusabab ngaleuwihan jumlah maksimum nyarang telepon. Sanajan kitu, titik halus sejen datang kana antrian. Dina waktos pemicu dieksekusi, komitmen henteu acan réngsé pikeun rékaman anu diselapkeun munggaran. Ku alatan éta, hiji pemicu ngajalankeun dina urus otonom nyoba nyelapkeun kana tabel baris nu rujukan konci asing ka catetan nu teu acan kungsi komitmen. Ieu ngakibatkeun antosan (transaksi otonom ngantosan urus utama komitmen pikeun ningali naha éta tiasa nyelapkeun data) sareng dina waktos anu sami urus utama ngantosan transaksi otonom pikeun neraskeun damel saatos pemicu. A deadlock lumangsung sarta, salaku hasilna, urus otonom dibatalkeun alatan alesan patali konci.

Ngan pamaké nu kadaptar bisa ilubiung dina survey. Daptar, Punten.

Éta hésé?

  • Kawas dua ramo, kuring langsung mutuskeun sagalana leres.

  • Teu bener, kuring salah dina sababaraha patarosan.

  • Kuring ngumbar satengahna leres.

  • Kuring nebak jawaban dua kali!

  • Abdi badé nyerat dina koméntar

14 pamaké milih. 10 pamaké abstained.

sumber: www.habr.com

Tambahkeun komentar