د هایلوډ ++ سایبریا 2019 په پښو کې - 8 اوریکل دندې

سلام!

د جون په 24-25 کې، د هایلوډ ++ سایبریا 2019 کنفرانس په نووسیبیرسک کې ترسره شو راپور "د اوریکل کانټینر ډیټابیسونه (CDB/PDB) او د سافټویر پراختیا لپاره د دوی عملي کارول"، موږ به لږ وروسته د متن نسخه خپره کړو. دا ښه وه، مننه olegbunin د سازمان لپاره، او همدارنګه د هر چا لپاره چې راغلی.

د هایلوډ ++ سایبریا 2019 په پښو کې - 8 اوریکل دندې
پدې پوسټ کې ، موږ غواړو له تاسو سره هغه ستونزې شریکې کړو چې زموږ په بوت کې مو درلودې ترڅو تاسو د اوریکل پوهه ازموینه وکړئ. د کټ لاندې 8 ستونزې، د ځواب اختیارونه او توضیحات دي.

د لاندې سکریپټ اجرا کولو په پایله کې به موږ د اعظمي ترتیب ارزښت څه وي؟

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
  • نه، یوه تېروتنه به وي

ځوابد اوریکل اسنادو له مخې (له 8.1.6 څخه نقل شوی):
د یو واحد SQL بیان دننه، اوریکل به په هر قطار کې یوازې یو ځل ترتیب زیات کړي. که یو بیان د یوې ترتیب لپاره د NEXTVAL لپاره له یو څخه ډیر حوالې ولري، اوریکل یو ځل ترتیب زیاتوي او د NEXTVAL ټولو پیښو لپاره ورته ارزښت بیرته راولي. که یو بیان د CURRVAL او NEXTVAL دواړو لپاره حوالې ولري، اوریکل ترتیب زیاتوي او د CURRVAL او NEXTVAL دواړو لپاره ورته ارزښت بیرته راګرځوي پرته لدې چې په بیان کې د دوی ترتیب ته پام وکړي.

په دې توګه، اعظمي ارزښت به د لینونو شمیر سره مطابقت ولري ، دا 5 دی.

د لاندې سکریپټ چلولو په پایله کې به څومره قطارونه په جدول کې وي؟

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

ځوابد اوریکل اسنادو له مخې (له 11.2 څخه نقل شوی):

د هرې SQL بیان اجرا کولو دمخه، اوریکل یو ضمني خوندي نقطه په نښه کوي (تاسو ته شتون نلري). بیا، که بیان ناکام شي، اوریکل دا په اوتومات ډول بیرته راګرځوي او د تطبیق وړ غلطی کوډ SQLCA کې SQLCODE ته بیرته راګرځوي. د مثال په توګه، که چیرې د INSERT بیان په یو ځانګړي شاخص کې د نقل ارزښت د داخلولو په هڅه کې د تېروتنې لامل شي، بیان بیرته راګرځول کیږي.

د پیرودونکي څخه د HP زنګ وهل هم د یو واحد بیان په توګه په پام کې نیول کیږي او پروسس کیږي. په دې توګه، لومړی HP زنګ په بریالیتوب سره بشپړ شو، درې ریکارډونه یې دننه کړل؛ دوهم HP زنګ د یوې تېروتنې سره پای ته رسیږي او څلورم ریکارډ بیرته راوباسي چې دا یې اداره کړی. دریم کال ناکام شو او په جدول کې درې ریکارډونه شتون لري.

د لاندې سکریپټ چلولو په پایله کې به څومره قطارونه په جدول کې وي؟

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

ځوابد اوریکل اسنادو له مخې (له 11.2 څخه نقل شوی):

د چک محدودیت تاسو ته اجازه درکوي یو شرط مشخص کړئ چې په جدول کې هر قطار باید پوره کړي. د محدودیت د پوره کولو لپاره، په جدول کې هر قطار باید حالت یا هم ریښتیا یا نا معلوم وي (د ناپاکۍ له امله). کله چې اوریکل د یو ځانګړي قطار لپاره د چیک محدودیت حالت ارزوي، په حالت کې د کوم کالم نومونه په دې قطار کې د کالم ارزښتونو ته اشاره کوي.

په دې توګه، ارزښت نالی به چک تیر کړي، او نامعلوم بلاک به په بریالیتوب سره اجرا شي تر هغه چې د 3 ارزښت داخلولو هڅه وشي. له دې وروسته، د غلطۍ سمبالولو بلاک به استثنا پاکه کړي، هیڅ رول بیک به واقع نشي، او په جدول کې به څلور قطارونه پاتې وي د ارزښتونو سره 1، null، 2 او null بیا.

د ارزښتونو کوم جوړه به په بلاک کې ورته مقدار ځای ونیسي؟

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 او X
  • B او Y
  • C او K
  • ج او ز
  • K او Z
  • زه او جي
  • J او X
  • ټول لیست شوي

ځوابدلته په اوریکل کې د مختلف ډوله ډیټا ذخیره کولو په اړه د اسنادو (12.1.0.2) څخه اقتباسات دي.

د CHAR ډیټا ډول
د CHAR ډیټا ډول د ډیټابیس کرکټر سیټ کې د ثابت اوږدوالي کریکټ سټرینګ مشخص کوي. تاسو د ډیټابیس کرکټر سیټ مشخص کوئ کله چې تاسو خپل ډیټابیس جوړ کړئ. اوریکل ډاډ ورکوي چې ټول ارزښتونه په CHAR کالم کې زیرمه شوي د ټاکل شوي اوږدوالي سیمانټیک کې د اندازې لخوا مشخص شوي اوږدوالی لري. که تاسو یو ارزښت داخل کړئ چې د کالم اوږدوالي څخه لنډ وي ، نو بیا اوریکل خالي پیډ ارزښت د کالم اوږدوالي ته ورکوي.

VARCHAR2 د معلوماتو ډول
د VARCHAR2 ډیټا ډول د ډیټابیس کرکټر سیټ کې د متغیر اوږدوالي کریکټ سټرینګ مشخص کوي. تاسو د ډیټابیس کرکټر سیټ مشخص کوئ کله چې تاسو خپل ډیټابیس جوړ کړئ. اوریکل د VARCHAR2 کالم کې د کرکټر ارزښت په سمه توګه ذخیره کوي لکه څنګه چې تاسو یې مشخص کوئ، پرته له کوم خالي پیډینګ، په دې شرط چې ارزښت د کالم له اوږدوالي څخه زیات نه وي.

د NUMBER ډیټا ډول
د NUMBER ډیټا ډول صفر او همدارنګه مثبت او منفي ثابت شمیرې د مطلق ارزښتونو سره له 1.0 x 10-130 څخه ذخیره کوي مګر د 1.0 x 10126 په شمول نه. 1.0 x 10126، بیا اوریکل یوه تېروتنه راګرځوي. هر NUMBER ارزښت له 1 څخه تر 22 بایټ پورې اړتیا لري. د دې په پام کې نیولو سره، د کالم اندازه په بایټس کې د ځانګړي شمیري ډیټا ارزښت NUMBER(p) لپاره، چیرې چې p د ورکړل شوي ارزښت دقیقیت دی، د لاندې فورمول په کارولو سره محاسبه کیدی شي: round((اوږدوالی(p)+s)/2))+1 چیرته چې s د صفر سره مساوي دی که شمیره مثبت وي، او s د 1 سره مساوي وي که شمیره منفي وي.

سربیره پردې ، راځئ چې د نول ارزښتونو ذخیره کولو په اړه د اسنادو څخه اقتباس واخلو.

null په یوه کالم کې د ارزښت نشتوالی دی. نولس ورک شوي، نامعلوم، یا د تطبیق وړ معلومات په ګوته کوي. نولس په ډیټابیس کې زیرمه کیږي که چیرې دوی د ډیټا ارزښتونو سره د کالمونو تر مینځ راشي. په دې حالتونو کې، دوی د کالم اوږدوالی (صفر) ذخیره کولو لپاره 1 بایټ ته اړتیا لري. په یوه قطار کې تعقیب شوي نولس هیڅ ذخیره کولو ته اړتیا نلري ځکه چې د نوي قطار سرلیک سیګنال کوي چې په تیرو قطار کې پاتې کالمونه ناپاک دي. د مثال په توګه، که د جدول وروستي درې کالمونه ناپاک وي، نو د دې کالمونو لپاره هیڅ معلومات نه ساتل کیږي.

د دې معلوماتو پراساس ، موږ استدلال رامینځته کوو. موږ فرض کوو چې ډیټابیس د AL32UTF8 کوډ کولو کاروي. په دې کوډ کولو کې، روسی لیکونه به 2 بایټونه ونیسي.

1) A او X، د ساحې ارزښت 'Y' 1 بایټ اخلي، د ساحې x 'D' ارزښت 2 بایټ اخلي
2) B او Y، په ب کې 'واسیا' ارزښت به تر 10 حروفو پورې د ځایونو سره پیډ شي او 14 بایټ به واخلي ، په d کې 'واسیا' به 8 بایټ واخلي.
3) C او K. دواړه ساحې د NULL ارزښت لري، وروسته د پام وړ ساحې شتون لري، نو دوی 1 بایټ لري.
4) C او Z دواړه فیلډونه NULL ارزښت لري، مګر فیلډ Z په جدول کې وروستی دی، نو دا ځای نه نیسي (0 بایټ). ساحه C 1 بایټ نیسي.
5) K او Z. د تیرې قضیې سره ورته. په K ساحه کې ارزښت 1 بایټ لري، په Z - 0 کې.
6) I او J. د اسنادو له مخې، دواړه ارزښتونه به 2 بایټ واخلي. موږ اوږدوالی د اسنادو څخه اخیستل شوي فارمول په کارولو سره محاسبه کوو: ګردي (1 + 0)/2) +1 = 1 + 1 = 2.
7) J او X. د J په ساحه کې ارزښت به 2 بایټ واخلي، د X په ساحه کې ارزښت به 2 بایټ واخلي.

په مجموع کې، سم انتخابونه دي: C او K، I او J، J او X.

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

  • د لسګونو په اړه
  • په سلګونو
  • د زرګونو په اړه
  • شاوخوا لسګونه زره

ځوابد اوریکل اسنادو له مخې (له 12.1 څخه نقل شوی):

د بی ونې شاخص لپاره، د شاخص کلستر کولو فکتور د شاخص ارزښت سره په تړاو کې د قطارونو فزیکي ګروپ اندازه کوي.

د شاخص کلستر کولو فکتور د اصلاح کونکي سره مرسته کوي پریکړه وکړي چې ایا د شاخص سکین یا د بشپړ جدول سکین د ځانګړو پوښتنو لپاره خورا مؤثر دی). د ټیټ کلستر کولو فکتور د اغیزمن شاخص سکین په ګوته کوي.

د کلستر کولو فکتور چې په جدول کې د بلاکونو شمیر ته نږدې دی دا په ګوته کوي چې قطارونه په فزیکي توګه د جدول بلاکونو کې د شاخص کیلي لخوا ترتیب شوي. که ډیټابیس د بشپړ میز سکین ترسره کړي، نو ډیټابیس د قطارونو بیرته ترلاسه کولو ته لیوالتیا لري ځکه چې دوی د شاخص کیلي لخوا ترتیب شوي ډیسک کې زیرمه شوي. د کلستر کولو فکتور چې د قطارونو شمیر ته نږدې دی دا په ګوته کوي چې قطارونه په تصادفي ډول د ډیټابیس بلاکونو کې د شاخص کیلي پورې اړه لري. که ډیټابیس د بشپړ جدول سکین ترسره کړي، نو ډیټابیس به د دې شاخص کیلي لخوا په هر ترتیب شوي ترتیب کې قطارونه بیرته ترلاسه نکړي.

په دې حالت کې، ډاټا په مثالي ډول ترتیب شوي، نو د کلستر کولو فکتور به په جدول کې د نیول شوي بلاکونو شمیر سره مساوي یا نږدې وي. د 8 کیلوبایټ معیاري بلاک اندازې لپاره ، تاسو تمه کولی شئ چې شاوخوا زر تنګ شمیر ارزښتونه به په یو بلاک کې فټ شي ، نو د بلاکونو شمیر ، او په پایله کې به د کلستر کولو فکتور وي. د لسګونو په اړه.

د N په کومو ارزښتونو کې به لاندې سکریپټ په منظم ډیټابیس کې د معیاري ترتیباتو سره په بریالیتوب سره اجرا شي؟

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

ځوابد اوریکل اسنادو له مخې (له 11.2 څخه نقل شوی):

منطقي ډیټابیس محدودیتونه

د قالب
د حد ډول
محدود ارزښت

شاخصونه
د شاخص شوي کالم ټوله اندازه
د ډیټابیس بلاک اندازه 75٪ منفي یو څه سر

په دې توګه، د شاخص شوي کالمونو ټوله اندازه باید د 6Kb څخه زیاته نه وي. بیا څه پیښیږي په ټاکل شوي بیس کوډ کولو پورې اړه لري. د AL32UTF8 کوډ کولو لپاره، یو کرکټر کولی شي اعظمي 4 بایټ ونیسي، نو په بدترین حالت کې، 6 کیلوبایټ به شاوخوا 1500 حروف سره سمون ولري. له همدې امله، اوریکل به په N = 400 کې د شاخص رامینځته کولو مخه ونیسي (کله چې د خورا بد حالت کیلي اوږدوالی 1600 حروف * 4 بایټ + د قطار اوږدوالی وي) ، پداسې حال کې چې په N = 200 (یا لږ) د شاخص رامینځته کول به پرته له ستونزو کار وکړي.

INSERT آپریټر د APPEND اشارې سره ډیزاین شوی ترڅو ډاټا په مستقیم حالت کې بار کړي. څه پیښیږي که چیرې دا په میز کې پلي شي چې محرک یې ځړول کیږي؟

  • ډاټا به په مستقیم حالت کې پورته شي، محرک به د توقع سره سم کار وکړي
  • ډاټا به په مستقیم حالت کې پورته شي، مګر محرک به اجرا نشي
  • ډاټا به په دودیز حالت کې پورته شي، محرک به لکه څنګه چې باید کار وکړي
  • ډاټا به په دودیز حالت کې پورته شي، مګر محرک به اجرا نشي
  • ډاټا به نه پورته کیږي، یوه تېروتنه به ثبت شي

ځوابپه اصل کې، دا د منطق یوه پوښتنه ده. د سم ځواب موندلو لپاره، زه به لاندې دلیل ماډل وړاندیز کړم:

  1. په مستقیم حالت کې داخلول د ډیټا بلاک مستقیم رامینځته کولو سره ترسره کیږي ، د SQL انجن څخه تیریږي ، کوم چې لوړ سرعت تضمینوي. په دې توګه، د محرک اجرا کول خورا ستونزمن دي، که ناممکن نه وي، او پدې کې هیڅ معنی نشته، ځکه چې دا به لاهم په بنسټیز ډول د ننوتلو سست کړي.
  2. د محرک په اجرا کولو کې پاتې راتلل به د دې حقیقت لامل شي چې که چیرې په جدول کې ډاټا یو شان وي، د ډیټابیس حالت په ټولیزه توګه (نور جدولونه) به په هغه حالت پورې اړه ولري چې دا معلومات پکې داخل شوي. دا به په ښکاره ډول د معلوماتو بشپړتیا له مینځه ویسي او په تولید کې د حل په توګه نشي پلي کیدی.
  3. د غوښتل شوي عملیاتو ترسره کولو کې پاتې راتلل عموما د یوې تېروتنې په توګه چلند کیږي. مګر دلته باید په یاد ولرو چې APPEND یو اشاره ده، او د اشارو عمومي منطق دا دی چې دوی د امکان په صورت کې په پام کې نیول کیږي، مګر که نه وي، چلونکی پرته له دې چې اشاره په پام کې ونیسي اجرا کیږي.

نو متوقع ځواب دی ډاټا به په نورمال (SQL) حالت کې پورته شي، محرک به اور شي.

د اوریکل اسنادو له مخې (له 8.04 څخه نقل شوی):

د محدودیتونو سرغړونې به د دې لامل شي چې بیان په سیریل ډول اجرا شي ، د دودیز داخلولو لارې په کارولو سره ، پرته له اخطارونو یا خطا پیغامونو. یو استثنا د بیانونو محدودیت دی چې ورته میز ته په لیږد کې له یو ځل څخه ډیر لاسرسی لري، کوم چې کولی شي د خطا پیغامونه رامینځته کړي.
د مثال په توګه، که محرکات یا د حوالې بشپړتیا په میز کې شتون ولري، نو د APPEND نښه به له پامه غورځول شي کله چې تاسو د مستقیم بار INSERT (سیریل یا موازي) کارولو هڅه کوئ، او همدارنګه د PARALLEL اشاره یا بند، که کوم وي.

څه به پیښ شي کله چې لاندې سکریپټ اجرا شي؟

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

  • په بریالیتوب سره اجرا کول
  • د نحوي تېروتنې له امله ناکامي
  • تېروتنه: خودمختاره معامله د اعتبار وړ نه ده
  • تېروتنه د زنګ وهلو له اعظمي حد څخه د تېرېدو اړوند
  • د بهرنۍ کلیدي سرغړونې تېروتنه
  • د بندونو اړوند تېروتنه

ځوابجدول او محرک په سمه توګه جوړ شوي او دا عملیات باید د ستونزو لامل نشي. په محرک کې خودمختاره راکړې ورکړې هم اجازه لري، که نه نو ننوتل ممکن نه وي، د بیلګې په توګه.

د لومړي قطار د داخلولو وروسته، یو بریالی محرک ډزې به د دویم قطار د داخلولو سبب شي، چې محرک بیا د اوریدو لامل شي، دریم قطار داخل کړي، او داسې نور تر هغه چې بیان د زنګونو د اعظمي حد څخه د تیریدو له امله ناکام شي. په هرصورت، یو بل فرعي ټکی په لوبې کې راځي. په هغه وخت کې چې محرک اجرا کیږي، ژمنه لا تر اوسه د لومړي داخل شوي ریکارډ لپاره بشپړه شوې نه ده. له همدې امله، یو محرک چې په خپلواکه لیږد کې روان دی هڅه کوي میز ته یو قطار داخل کړي چې یو ریکارډ ته بهرنۍ کیلي راجع کوي چې تر اوسه پورې ژمن ندي. دا د انتظار پایله ده (خپلواکه معامله د اصلي لیږد انتظار کوي ترڅو وګوري چې ایا دا ډاټا داخلولی شي) او په ورته وخت کې اصلي لیږد د محرک وروسته کار کولو ته دوام ورکولو لپاره د خپلواکې لیږد انتظار کوي. یو تعطل واقع کیږي او په پایله کې، خودمختاره معامله د قلفونو پورې اړوند دلایلو له امله لغوه کیږي.

یوازې راجستر شوي کاروونکي کولی شي په سروې کې برخه واخلي. ننوزئمهرباني وکړئ

دا ستونزمنه وه؟

  • د دوو ګوتو په څیر، ما سمدلاسه هرڅه په سمه توګه پریکړه وکړه.

  • واقعیا نه، زه په یو څو پوښتنو کې غلط وم.

  • ما د هغې نیمایي په سمه توګه حل کړه.

  • ما دوه ځله ځواب اټکل کړ!

  • زه به په نظرونو کې ولیکم

14 کاروونکو رایه ورکړه. 10 کاروونکي منع شوي.

سرچینه: www.habr.com

Add a comment