Raacitaanka raadkii Highload++ Siberia 2019 - 8 hawlood oo ku saabsan Oracle

Hello!

Juun 24-25, shirka Highload++ Siberiya 2019 ayaa lagu qabtay Novosibirsk. warbixin "Xogta xogta ee weelka Oracle (CDB/PDB) iyo isticmaalkooda la taaban karo ee horumarinta software", waxaan daabici doonaa nooc qoraal ah wax yar ka dib. Waxay ahayd qabow, mahadsanid olegbunin ururka, iyo sidoo kale qof kasta oo yimid.

Raacitaanka raadkii Highload++ Siberia 2019 - 8 hawlood oo ku saabsan Oracle
Maqaalkan, waxaan jeclaan lahayn inaan kugula wadaagno dhibaatooyinka aan ku qabnay rugtayada si aad u tijaabiso aqoontaada Oracle. Hoos waxaa ku yaal 8 dhibaato, xulashooyin jawaabo iyo sharraxaad.

Waa maxay qiimaha isku xigxiga ugu badan ee aan arki doono natiijada fulinta qoraalka soo socda?

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
  • Maya, waxaa jiri doona qalad

JawaabSida ku cad dukumeenti Oracle (laga soo xigtay 8.1.6):
Hal bayaan SQL ah, Oracle wuxuu kordhin doonaa isku xigxiga hal mar oo keliya. Haddii bayaanku ka kooban yahay wax ka badan hal tixraac oo loogu talagalay NEXTVAL ee isku xigxiga, Oracle wuxuu kordhiyaa isku xigxiga hal mar wuxuuna soo celinayaa isla qiimaha dhammaan dhacdooyinka NEXTVAL. Haddii bayaanku ka kooban yahay tixraacyo labadaba CURRVAL iyo NEXTVAL, Oracle wuxuu kordhiyaa isku xigxiga oo wuxuu soo celiyaa isla qiimaha labadaba CURRVAL iyo NEXTVAL iyadoon loo eegin sida ay u kala horreeyaan bayaanka.

Sidaas darteed, qiimaha ugu badan wuxuu u dhigmi doonaa tirada xariiqyada, taasi waa 5.

Immisa saf ayaa ku jiri doona shaxda natiijada socodsiinta qoraalka soo socda?

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

JawaabSida ku cad dukumeenti Oracle (laga soo xigtay 11.2):

Kahor intaadan fulin wax bayaan ah oo SQL ah, Oracle wuxuu calaamadeeyaa barta kaydinta daahsoon (aan ku heli karin). Kadib, haddii bayaanku guuldareysto, Oracle si toos ah ayuu dib ugu rogaa oo wuxuu ku soo celiyaa koodka qaladka lagu dabaqi karo SQLCODE ee SQLCA. Tusaale ahaan, haddii bayaan INSERT uu keeno khalad iyadoo la isku dayayo in la geliyo qiime nuqul ka mid ah tusmada gaarka ah, bayaanku dib baa loo rogaa.

Ka wacaitaanka HP ee macmiilka sidoo kale waxaa loo tixgaliyaa oo loo baaraandegaa sidii hadal keliya. Haddaba, wiciddii ugu horreysay ee HP waxay ku dhammaatay si guul leh, iyadoo la galiyay saddex diiwaan; wicitaanka labaad ee HP wuxuu ku dhamaanayaa qalad wuxuuna dib u rogaa rikoorkii afraad ee ay ku guulaysatay inay geliso; wicitaankii seddexaad wuu fashilmay, waxaana miiska ku yaal saddex diiwaan.

Immisa saf ayaa ku jiri doona shaxda natiijada socodsiinta qoraalka soo socda?

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

JawaabSida ku cad dukumeenti Oracle (laga soo xigtay 11.2):

Xayiraadda hubinta ayaa kuu ogolaanaysa inaad qeexdo shuruud ah in saf kasta oo miiska ku yaal uu qanciyo. Si loo qanciyo xannibaadda, saf kasta oo miiska ku yaal waa inuu shuruud ka dhigaa mid RUN ah ama mid aan la garanayn (sababtoo ah wax aan jirin). Marka Oracle uu qiimeeyo xaalada xaddidaadda jeeg ee saf gaar ah, magacyo kasta oo tiireedka xaaladdu waxay tixraacaan qiyamka tiirka ee safkaas.

Markaa, qiimaha null-ku wuu dhaafi doonaa jeegga, xannibaadda qarsoodiga ah ayaa si guul leh loo fulin doonaa ilaa isku dayga lagu gelinayo qiimaha miiska waxaa ku hadhi doona afar saf oo leh qiyamka 1, null, 2 iyo mar labaad.

Waa kuwee lamaanayaasha qiyamka ah ee qaadan doona qadar isku mid ah booska block?

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 iyo X
  • B iyo Y
  • C iyo K
  • C iyo Z
  • K iyo Z
  • aniga iyo J
  • J iyo X
  • Dhammaantood taxan

JawaabHalkan waxaa ah qaybo ka mid ah dukumeentiyada (12.1.0.2) ee ku saabsan kaydinta noocyada kala duwan ee xogta gudaha Oracle.

Nooca Xogta CHAR
Nooca xogta CHAR waxay qeexaysaa xarfo xarfo dhererkeedu go'an yahay oo ku jira jaantuska xogta. Waxaad sheegtaa jilaha keydka macluumaadka marka aad abuurto xogtaada. Oracle wuxuu xaqiijiyaa in dhammaan qiyamka lagu kaydiyo tiirka CHAR ay leeyihiin dhererka lagu qeexay cabbirka semantics dhererka la doortay. Haddii aad geliso qiime ka gaaban dhererka tiirka, markaas Oracle-pank-paspas qiimaha dhererka tiirka.

Nooca Xogta VARCHAR2
Nooca xogta VARCHAR2 ayaa qeexaya xarafka dhererka doorsoomaha ee keydka xarfaha. Waxaad sheegtaa jilaha keydka macluumaadka marka aad abuurto xogtaada. Oracle waxa uu ku kaydiyaa tiirka VARCHAR2 si sax ah sidaad u qeexday, iyada oo aan wax faaruq ah lahayn, waase haddii qiimuhu aanu dhaafin dhererka tiirka.

NUMBER Xogta Nooca
Nooca xogta NUMBER waxa uu kaydiyaa eber iyo sidoo kale tiro go'an oo togan iyo taban leh oo leh qiimayaal buuxa laga bilaabo 1.0 x 10-130 balse aan lagu darin 1.0 x 10126 1.0 x 10126, ka dib Oracle wuxuu soo celiyaa qalad. Qiimaha NUMBER kasta wuxuu u baahan yahay 1 ilaa 22 bytes. Iyada oo tan xisaabta lagu daro, cabbirka tiirka ee bytes ee qiime xog tirooyin gaar ah NUMBER(p), halkaasoo p ay tahay saxnaanta qiimaha la bixiyay, waxaa lagu xisaabin karaa iyadoo la isticmaalayo qaacidada soo socota: Wareeg ((dherer (p)+s)/2))+1 halka s uu la mid yahay eber haddii nambarku uu togan yahay, iyo s la mid yahay 1 haddii nambarku uu taban yahay.

Intaa waxaa dheer, aan soo qaadano qayb ka mid ah dukumeentiyada ku saabsan kaydinta qiyamka Null.

Nool waa maqnaanshaha qiimihii tiirka. Nulls waxay muujinayaan maqan, aan la aqoon, ama xog aan la dabaqi karin. Nulls waxa lagu kaydiyaa kaydka xogta haddii ay u dhexeeyaan tiirar leh qiyamka xogta. Xaaladahan, waxay u baahan yihiin 1 byte si ay u kaydiyaan dhererka tiirka (eber). Raadinta nulls ee isku xigta uma baahna kaydin sababtoo ah safka cusub ee madaxa ayaa tilmaamaya in tiirarka hadhay ee safkii hore ay yihiin waxba. Tusaale ahaan, haddii saddexda tiir ee ugu dambeeya ee miisku ay waxba ka jiraan, markaa wax xog ah looma kaydin tiirarkan.

Iyada oo ku saleysan xogtan, waxaan dhisnaa sababaynta. Waxaan u maleyneynaa in keydka keydka uu isticmaalo AL32UTF8 codeynta. Codayntan, xarfaha Ruushku waxay qabsan doonaan 2 bytes.

1) A iyo X, qiimaha goobta a 'Y' waxay qaadataa 1 byte, qiimaha goobta x 'D' wuxuu qaataa 2 bytes
2) B iyo Y, 'Vasya' gudaha b qiimaha waxaa lagu dhejin doonaa meelo bannaan oo ilaa 10 xaraf ah waxayna qaadan doontaa 14 bytes, 'Vasya' in d waxay qaadan doontaa 8 bytes.
3) C iyo K. Labada gooboodba waxay leeyihiin qiimaha NULL, iyaga ka dib waxaa jira beero muhiim ah, sidaas darteed waxay qabsadeen 1 byte.
4) C iyo Z. Labada gooboodba waxay leeyihiin qiimaha NULL, laakiin goobta Z waa tan ugu dambeysa ee miiska, sidaas darteed boos kama qaadin (0 bytes). Goobta C waxay ku jirtaa 1 byte.
5) K iyo Z. La mid ah kiiskii hore. Qiimaha goobta K ayaa ku jira 1 byte, gudaha Z - 0.
6) I iyo J. Sida ku cad dukumeentiyada, labadaba qiimaha waxay qaadan doonaan 2 bytes. Waxaan xisaabineynaa dhererka anagoo adeegsanayna qaacidada laga soo qaatay dukumeentiyada: wareega(1 + 0)/2) +1 = 1 + 1 = 2.
7) J iyo X. Qiimaha goobta J wuxuu qaadanayaa 2 bytes, qiimaha goobta X wuxuu qaadanayaa 2 bytes.

Guud ahaan, fursadaha saxda ah waa: C iyo K, I iyo J, J iyo X.

Qiyaastee ayaa noqon doonta qodobka isugaynta ee tusmada 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);

  • Qiyaastii tobanaan
  • Qiyaastii boqollaal
  • Ilaa kumanaan
  • Ilaa tobanaan kun

JawaabSida ku cad dukumeenti Oracle (laga soo xigtay 12.1):

Tusmada geedka B, qodobka isugaynta tusmadu waxa uu cabbiraa kooxaynta safafka ee la xidhiidha qiimaha index.

Cunsurka ururinta tusaha ayaa ka caawiya kor u qaadaya in uu go'aamiyo in sawirka index-ka ama sawirka miiska oo buuxa uu waxtar badan u leeyahay weydiimaha qaarkood). Qodob kooxeed hoose ayaa tilmaamaysa iskaanka tusaha oo hufan.

Cunsurka isku-dhafka ah ee u dhow tirada baloogyada miisku wuxuu muujinayaa in safafka jir ahaan loogu dalbay baloogyada miiska furaha tusmada. Haddii xog-ururintu ay samayso iskaanka miiska oo buuxa, markaas xog-ururinta waxay u janjeertaa inay soo ceshato safafka maadaama ay ku kaydsan yihiin saxanka oo lagu kala soocay furaha index. Qodob isugeyn ah oo ku dhow tirada safafka ayaa muujineysa in safafku si aan kala sooc lahayn ugu kala firirsan yihiin qeybaha keydka xogta ee la xiriirta furaha tusmada. Haddi xog-ururintu ay samayso iskaanka miiska oo buuxa, markaa xog ururintu kama soo ceshanayso safafka si kasta oo loo kala soocay furaha tusmada.

Xaaladdan oo kale, xogta si fiican ayaa loo kala soocay, markaa qodobka kooxuhu wuxuu la mid noqonayaa ama ku dhow yahay tirada baloogyada la haysto ee miiska. Qiyaasta caadiga ah ee 8 kilobytes, waxaad filan kartaa in ku dhawaad ​​kun qiyamka tirada cidhiidhiga ah ay ku haboonaan doonaan hal baloog, sidaas darteed tirada blocks, iyo natiijada, qodobka isugeynta ayaa noqon doona. ilaa tobanaan.

Qiime noocee ah ayaa qoraalka soo socda lagu fulin doonaa si guul leh kaydka xogta caadiga ah ee leh goobaha caadiga ah?

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

JawaabSida ku cad dukumeenti Oracle (laga soo xigtay 11.2):

Xadka Xogta Macquulka ah

Shayga
Nooca Xadka
Xaddid Qiimaha

Tusmooyinka
Wadarta cabbirka tiirka la tilmaamay
75% ee kaydinta kaydka cabbirka oo laga jaray xoogaa sare ah

Sidaa darteed, wadarta guud ee tiirarka la calaamadeeyay waa in aanay dhaafin 6Kb. Waxa dhacaya marka xigta waxay ku xidhan tahay codaynta saldhiga la doortay. Codaynta AL32UTF8, hal xaraf waxa uu hayn karaa ugu badnaan 4 bytes, markaa xaalada ugu xun, 6 kilobytes waxay ku haboonaan doontaa ilaa 1500 xaraf. Sidaa darteed, Oracle wuxuu diidi doonaa abuurista tusaha N = 400 (marka kiiska ugu xun ee dhererka furaha uu yahay 1600 xaraf * 4 bytes + dhererka safka ah), halka N = 200 (ama ka yar) abuurista index waxay shaqayn doontaa dhibaato la'aan.

Hawl wadeenka INSERT ee leh tilmaamta APPEND waxaa loogu talagalay inuu ku shubo xogta qaab toos ah. Maxaa dhacaya haddii lagu dhejiyo miiska uu keebka ku dul laadlaadsan yahay?

  • Xogta waxaa lagu dhejin doonaa qaab toos ah, kicinta ayaa u shaqeyn doonta sida la filayo
  • Xogta waxaa lagu shubi doonaa qaab toos ah, laakiin kicinta lama fulin doono
  • Xogta waxaa lagu dhejin doonaa qaabka caadiga ah, kicinta ayaa u shaqeyn doonta sidii ay ahayd
  • Xogta waxaa lagu rari doonaa qaab caadi ah, laakiin kicinta lama fulin doono
  • Xogta lama rari doono, khalad waa la duubi doonaa

JawaabAsal ahaan, tani waa su'aal badan oo macquul ah. Si loo helo jawaabta saxda ah, waxaan soo jeedin lahaa qaabka soo socda ee sababaynta:

  1. Gelida habka tooska ah waxaa lagu sameeyaa samaynta tooska ah ee xannibaadda xogta, iyada oo la marayo matoorka SQL, kaas oo hubinaya xawaaraha sare. Sidaa darteed, hubinta fulinta kicinta waa mid aad u adag, haddii aysan suurtagal ahayn, mana jirto wax macno ah tan, maadaama ay wali si tartiib tartiib ah hoos u dhigi doonto gelinta.
  2. Ku guuldareysiga fulinta kiciya waxay horseedi doontaa xaqiiqda ah in, haddii xogta shaxda ku jirta ay isku mid tahay, xaaladda kaydka guud ahaan (miisaska kale) waxay ku xirnaan doontaa qaabka xogtan loo geliyo. Tani waxay si cad u burburin doontaa daacadnimada xogta mana loo adeegsan karo xal ahaan wax soo saarka.
  3. Awood la'aanta in la fuliyo hawlgalka la codsaday waxaa guud ahaan loola dhaqmaa sidii qalad. Laakin halkan waa in aan xasuusannaa in APPEND ay tahay tilmaan, caqli-galnimada guud ee tilmaamuhuna waa in la tixgeliyo haddii ay suurtagal tahay, laakiin haddii aysan ahayn, hawlwadeenka waa la fuliyay iyada oo aan xisaabta lagu darin.

Haddaba jawaabta la filayo waa Xogta waxaa lagu shubi doonaa qaabka caadiga ah (SQL), kicinta ayaa dab ku kici doonta.

Sida ku cad dukumeenti Oracle (laga soo xigtay 8.04):

Xadgudubyada xayiraadaha waxay keeni doontaa in bayaanku uu si taxane ah u fuliyo, iyada oo la adeegsanayo dariiqa gelinta caadiga ah, iyada oo aan digniin ama farriimo khalad ah lahayn. Waxa ka reebban waa xaddidaadda odhaahyada gelaya isla miis wax ka badan hal mar wax kala iibsiga, taas oo keeni karta farriimaha khaldan.
Tusaale ahaan, haddii kiciyeyaasha ama daacadnimada tixraacku ay miiska saaran yihiin, markaas tilmaamta APPEND waa la iska indhatiray marka aad isku daydo inaad isticmaasho INSERT-load-ka tooska ah (taxan ama barbar socda), iyo sidoo kale tilmaanta barbar-dhigga ama qodobka, haddii ay jiraan.

Maxaa dhacaya marka qoraalka soo socda la fuliyo?

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);

  • Dhamaystirka guusha leh
  • Ku guuldareysiga sababtoo ah qalad syntax
  • Khalad: Wax-is-dhaafsi madax-bannaani ma jiro
  • Khaladka la xidhiidha dhaafitaanka buulka wicitaanka ee ugu badan
  • Khaladka Xadgudubka Furaha Shisheeye
  • Cilad la xiriirta quful

JawaabMiiska iyo kicinta ayaa si sax ah loo abuuray, hawlgalkanina maaha inuu keeno dhibaatooyin. Waxa kale oo la ogol yahay wax kala iibsiga iskeed u madax banaan ee kiciya, haddii kale la gooyn kari maayo, tusaale ahaan.

Marka la geliyo safka koowaad ka dib, toogashada kiciya ee guusha leh waxay keenaysaa in safka labaad la geliyo, taasoo keenaysa in keebaha uu mar kale dab kaco, oo la galiyo saf saddexaad, iyo wixii la mid ah ilaa uu bayaanku guul-darraystay sababtoo ah waxay dhaaftay buulkii ugu badnaa ee wicitaannada. Si kastaba ha ahaatee, qodob kale oo qarsoodi ah ayaa soo galaya. Waqtiga kicinta la fulinayo, ballan-qaadku weli lama dhammaystirin diiwaankii ugu horreeyay ee la geliyo. Sidaa darteed, kiciye ku socda wax kala beddelasho madaxbannaan ayaa isku dayaya inuu miiska geliyo saf saf ah oo tixraacaya furaha shisheeye diiwaanka aan weli la samayn. Tani waxay keenaysaa sugitaan (wax kala beddelashada madaxbannaani waxay sugaysaa macaamilka ugu weyn si uu u sameeyo si uu u eego haddii ay geli karto xogta) isla markaana macaamilka ugu weyn wuxuu sugayaa macaamilka madaxbannaan inuu sii wado shaqada ka dib kicinta. Qufulku wuu dhacaa, natiijadeeduna, iswaydaarsiga ismaamulka waa la kansalay sababo la xidhiidha quful.

Isticmaalayaasha diiwaangashan oo keliya ayaa ka qaybqaadan kara sahanka. Soo gal, soo dhawoow.

Way adkayd?

  • Sida laba farood, waxaan isla markiiba wax walba si sax ah u go'aansaday.

  • Runtii maahan, waan ku khaldamay dhawr su'aalood.

  • Si sax ah ayaan u xaliyay kala badh.

  • Waxaan qiyaasay jawaabta laba jeer!

  • Waxaan ku qori doonaa faallooyinka

14 isticmaale ayaa u codeeyay. 10 isticmaale ayaa ka aamusay.

Source: www.habr.com

Add a comment