د PostgreSQL پوښتنو لوی اصلاح کول. کیریل بوروویکوف (ټینسر)

راپور ځینې طریقې وړاندې کوي چې اجازه ورکوي د SQL پوښتنو فعالیت وڅارئ کله چې هره ورځ ملیونونه وي، او دلته په سلګونو څارل شوي PostgreSQL سرورونه شتون لري.

کوم تخنیکي حلونه موږ ته اجازه راکوي چې د معلوماتو دومره مقدار په مؤثره توګه پروسس کړو، او دا څنګه د عادي پراختیا کونکي ژوند اسانه کوي؟


څوک علاقه لري؟ د ځانګړو ستونزو تحلیل او د اصلاح کولو مختلف تخنیکونه د SQL پوښتنې او په PostgreSQL کې د DBA عادي ستونزې حل کول - تاسو هم کولی شئ د مقالو لړۍ ولولئ په دې موضوع.

د PostgreSQL پوښتنو لوی اصلاح کول. کیریل بوروویکوف (ټینسر)
زما نوم کیریل بوروویکوف دی، زه استازیتوب کوم د ټینسر شرکت. په ځانګړې توګه، زه زموږ په شرکت کې د ډیټابیسونو سره کار کولو کې تخصص لرم.

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

په عموم کې، زموږ د یو ملیون پیرودونکو لپاره ټینسر دی VLSI زموږ غوښتنلیک دی: کارپوریټ ټولنیز شبکه، د ویډیو اړیکو لپاره حلونه، د داخلي او بهرني اسنادو جریان لپاره، د حساب ورکولو او ګودامونو لپاره د محاسبې سیسټمونه، ... دا د مدغم سوداګرۍ مدیریت لپاره دا ډول "میګاکومبین" دی، په کوم کې چې له 100 څخه ډیر مختلف داخلي پروژې شتون لري. .

د دې لپاره چې ډاډ ترلاسه شي چې دوی ټول کار کوي او په نورمال ډول وده کوي، موږ په ټول هیواد کې 10 پراختیایي مرکزونه لرو چې نور یې په دوی کې دي 1000 پراختیا کونکي.

موږ د 2008 راهیسې د PostgreSQL سره کار کوو او د هغه څه لوی مقدار راټول کړي چې موږ پروسس کوو - د پیرودونکي ډیټا ، احصایوي ، تحلیلي ، د بهرني معلوماتو سیسټمونو ډاټا - له 400TB څخه ډیر. یوازې په تولید کې شاوخوا 250 سرورونه شتون لري، او په ټولیز ډول شاوخوا 1000 ډیټابیس سرورونه شتون لري چې موږ یې څارنه کوو.

د PostgreSQL پوښتنو لوی اصلاح کول. کیریل بوروویکوف (ټینسر)

SQL یوه اعلامیه ژبه ده. تاسو تشریح نه کړئ چې "څنګه" یو څه باید کار وکړي، مګر "څه" چې تاسو یې ترلاسه کول غواړئ. DBMS ښه پوهیږي چې څنګه یو ځای شي - څنګه خپل میزونه وصل کړئ، کوم شرایط وضع کړئ، څه به د شاخص څخه تیریږي، څه به نه وي ...

ځینې ​​​​DBMSs اشارې مني: "نه، دا دوه میزونه په داسې او داسې کتار کې وصل کړئ،" مګر PostgreSQL دا نشي کولی. دا د مخکښو پراختیا کونکو شعوري دریځ دی: "موږ د دې پرځای چې پراختیا کونکو ته اجازه ورکړو چې یو ډول اشارې وکاروو د پوښتنې اصلاح کوونکی پای ته ورسوو."

مګر، د دې حقیقت سره سره چې PostgreSQL "بهر" ته اجازه نه ورکوي چې خپل ځان کنټرول کړي، دا په بشپړه توګه اجازه ورکوي وګورئ چې د هغه دننه څه تیریږيکله چې تاسو خپله پوښتنه پرمخ وړئ، او چیرته چې دا ستونزه لري.

د PostgreSQL پوښتنو لوی اصلاح کول. کیریل بوروویکوف (ټینسر)

په عموم کې ، کوم کلاسیک ستونزې رامینځته کونکي [DBA ته] معمولا ورسره راځي؟ "دلته مو غوښتنه پوره کړه، او هرڅه زموږ سره سست ديهر څه ځوړند دي، یو څه پیښیږي ... یو ډول مصیبت!"

لاملونه تقریبا تل یو شان دي:

  • غیر موثر پوښتنې الګوریتم
    پرمخ وړونکی: "اوس زه هغه ته د شمولیت له لارې په SQL کې 10 میزونه ورکوم ..." - او تمه لري چې د هغه شرایط به په معجزه توګه په مؤثره توګه "خلاص" شي او هغه به هرڅه ژر ترلاسه کړي. مګر معجزې نه پیښیږي، او کوم سیسټم چې دا ډول تغیر لري (په یوه کې 10 میزونه) تل یو ډول تېروتنه ورکوي. [مقاله]
  • پخوانۍ احصایې
    دا ټکی په ځانګړې توګه د PostgreSQL لپاره خورا اړونده دی، کله چې تاسو په سرور کې یو لوی ډیټاسیټ "ورکړئ"، غوښتنه وکړئ، او دا ستاسو ټابلیټ "جنسي" کوي. ځکه چې پرون په دې کې 10 ریکارډونه وو، او نن 10 ملیونه دي، مګر PostgreSQL لا تر اوسه پدې اړه نه پوهیږي، او موږ باید د دې په اړه ووایو. [مقاله]
  • په سرچینو کې "پلگ".
    تاسو په یو ضعیف سرور کې لوی او ډیر بار شوي ډیټابیس نصب کړی چې کافي ډیسک ، حافظه یا پروسیسر فعالیت نلري. او دا ټول دي ... په کوم ځای کې د فعالیت چت شتون لري چې تاسو نور نشي کولی کود شئ.
  • بندول
    دا یو ستونزمن ټکی دی، مګر دا د بیالبیلو بدلونونو پوښتنو لپاره خورا اړونده دي (داخل، تازه کول، حذف کول) - دا یو جلا لوی موضوع ده.

یو پلان ترلاسه کول

...او د هر څه لپاره موږ یو پلان ته اړتیا لري! موږ باید وګورو چې د سرور دننه څه پیښیږي.

د PostgreSQL پوښتنو لوی اصلاح کول. کیریل بوروویکوف (ټینسر)

د PostgreSQL لپاره د پوښتنې اجرا کولو پلان د متن نمایندګۍ کې د پوښتنې اجرا کولو الګوریتم یوه ونه ده. دا دقیقا هغه الګوریتم دی چې د پلان جوړونکي لخوا د تحلیل په پایله کې خورا مؤثره وموندل شو.

د هر ونې نوډ یو عملیات دی: د میز یا شاخص څخه د معلوماتو ترلاسه کول، د بټ میپ جوړول، د دوو میزونو سره یوځای کول، یوځای کول، یو بل سره یوځای کول، یا د انتخابونو څخه ایستل. د یوې پوښتنې په ترسره کولو کې د دې ونې د نوډونو له لارې تګ شامل دی.

د پوښتنې پلان ترلاسه کولو لپاره، ترټولو اسانه لار د بیان اجرا کول دي EXPLAIN. د ټولو ریښتیني ځانګړتیاو سره ترلاسه کولو لپاره ، دا په حقیقت کې په اساس کې د پوښتنې پلي کول دي - EXPLAIN (ANALYZE, BUFFERS) SELECT ....

بد برخه: کله چې تاسو یې چلوئ، دا "دلته او اوس" پیښیږي، نو دا یوازې د ځایی ډیبګ کولو لپاره مناسب دی. که تاسو یو ډیر بار شوی سرور واخلئ چې د ډیټا بدلونونو قوي جریان لاندې وي ، او تاسو وګورئ: "اوه! دلته موږ یو ورو اعدام لروسییا غوښتنه." نیم ساعت، یو ساعت مخکې - په داسې حال کې چې تاسو روان یاست او دا غوښتنه د لاګونو څخه ترلاسه کوئ، دا بیرته سرور ته راوړو، ستاسو ټول ډیټاسیټ او احصایې بدلې شوې. تاسو دا د ډیبګ کولو لپاره پرمخ وړئ - او دا په چټکۍ سره پرمخ ځي! او تاسو نه پوهیږئ چې ولې، ولې وه ورو

د PostgreSQL پوښتنو لوی اصلاح کول. کیریل بوروویکوف (ټینسر)

د دې لپاره چې پوه شي چې دقیقا څه پیښ شوي کله چې غوښتنه په سرور کې اجرا شوه ، هوښیار خلکو لیکلي auto_explain ماډل. دا په نږدې ټولو خورا عام PostgreSQL توزیع کې شتون لري، او په ساده ډول په ترتیب فایل کې فعال کیدی شي.

که دا پوه شي چې ځینې غوښتنه د هغه حد څخه اوږده روانه ده چې تاسو ورته ویلي وو، دا کار کوي د دې غوښتنې د پلان "سنپ شاټ" او په لاګ کې یې یوځای لیکي.

د PostgreSQL پوښتنو لوی اصلاح کول. کیریل بوروویکوف (ټینسر)

اوس هرڅه سم ښکاري، موږ لاګ ته ځو او هلته ګورو ... [متن فوټ کلاتھ]. مګر موږ نشو کولی د دې په اړه څه ووایو، پرته له دې چې دا یو ښه پلان دی ځکه چې دا 11ms یې پلي کول.

هرڅه سم ښکاري - مګر هیڅ شی روښانه نده چې واقعیا څه پیښ شوي. د عمومي وخت سربیره، موږ واقعیا هیڅ نه ګورو. ځکه چې د ساده متن داسې "وری" لیدل عموما لید نه وي.

مګر حتی که دا روښانه نه وي، حتی که دا ناامنه وي، نور بنسټیز ستونزې شتون لري:

  • نوډ په ګوته کوي د ټولې فرعي ونې د سرچینو مجموعه د هغه لاندې. دا دی ، تاسو نشئ کولی دا ومومئ چې پدې ځانګړي شاخص سکین کې څومره وخت تیر شوی که چیرې د دې لاندې ځینې ځړول شوي حالت شتون ولري. موږ باید په متحرک ډول وګورو چې ایا دلته "ماشومان" او شرطي تغیرات شتون لري، CTEs دننه - او دا ټول "زموږ په ذهنونو کې" کموي.
  • دوهم ټکی: هغه وخت چې په نوډ کې ښودل شوی دی د واحد نوډ اجرا کولو وخت. که چیرې دا نوډ د بیلګې په توګه د جدول د ریکارډونو له لارې څو ځله اجرا شي، نو د لوپونو شمیر - د دې نوډ دورې - په پلان کې زیاتیږي. مګر د اټومي اجرا کولو وخت پخپله د پلان له مخې ورته پاتې دی. دا دی، د دې لپاره چې پوه شي چې دا نوډ څومره وخت په مجموع کې ترسره شوی، تاسو اړتیا لرئ یو شی د بل په واسطه ضرب کړئ - بیا، "ستاسو په سر کې."

په داسې حاالتو کې، پوه شئ "څوک ترټولو کمزوری اړیکه ده؟" تقریبا ناممکن. له همدې امله ، حتی پراختیا کونکي پخپله "د لارښود" کې لیکي "د پلان پوهه یو هنر دی چې باید زده شي، تجربه ...".

مګر موږ 1000 پراختیا کونکي لرو، او تاسو نشئ کولی دا تجربه هر یو ته ورسوي. زه، ته، هغه پیژني، خو هلته څوک نور نه پوهیږي. شاید هغه به زده کړي، یا شاید نه، مګر هغه اوس کار کولو ته اړتیا لري - او دا تجربه به چیرته ترلاسه کړي؟

پلان بصری کول

له همدې امله موږ پوهیږو چې د دې ستونزو سره د مقابلې لپاره موږ اړتیا لرو د پلان ښه لید. [مقاله]

د PostgreSQL پوښتنو لوی اصلاح کول. کیریل بوروویکوف (ټینسر)

موږ لومړی د "بازار له لارې" لاړو - راځئ چې انټرنیټ وګورو ترڅو وګورو چې حتی شتون لري.

مګر دا معلومه شوه چې ډیر لږ نسبتا "ژوندی" حلونه شتون لري چې ډیر یا لږ وده کوي - په لفظي توګه، یوازې یو: تشریح.depesz.com د Hubert Lubaczewski لخوا. کله چې تاسو د "فیډ" ساحې ته د پلان نمایش متن داخل کړئ، دا تاسو ته د تجزیه شوي ډاټا سره یو جدول ښیې:

  • د نوډ خپل پروسس وخت
  • د ټول فرعي ونې لپاره ټول وخت
  • د ریکارډونو شمیر چې بیرته ترلاسه شوي چې د احصایې له مخې تمه کیده
  • د نوډ بدن پخپله

دا خدمت د لینکونو آرشیف شریکولو وړتیا هم لري. تاسو خپل پلان هلته وغورځاوه او ویې ویل: "ای، واسیا، دلته یو لینک دی، هلته یو څه غلط دی."

د PostgreSQL پوښتنو لوی اصلاح کول. کیریل بوروویکوف (ټینسر)

مګر کوچنۍ ستونزې هم شتون لري.

لومړی، د "کاپي پیسټ" لوی مقدار. تاسو د لاګ یوه ټوټه واخلئ، هلته یې وخورئ، او بیا، او بیا.

دوهم، د لوستلو معلوماتو مقدار هیڅ تحلیل نشته - ورته بفرونه چې محصول لري EXPLAIN (ANALYZE, BUFFERS)، موږ یې دلته نه ګورو. هغه په ​​ساده ډول نه پوهیږي چې څنګه دوی جلا کړي، دوی پوهیږي او د دوی سره کار وکړي. کله چې تاسو ډیری ډیټا لوستلئ او پوهیږئ چې تاسو ممکن د ډیسک او حافظې کیچ غلط تخصیص کوئ ، دا معلومات خورا مهم دي.

دریم منفي ټکی د دې پروژې خورا کمزوری پرمختګ دی. ژمنې خورا کوچني دي، دا ښه ده که په هرو شپږو میاشتو کې یو ځل وي، او کوډ په پرل کې وي.

د PostgreSQL پوښتنو لوی اصلاح کول. کیریل بوروویکوف (ټینسر)

مګر دا ټول "غزلونه" دي، موږ کولی شو په یو ډول سره ژوند وکړو، مګر یو شی شتون لري چې موږ یې له دې خدمت څخه لیرې کړل. دا د عام جدول بیان (CTE) او مختلف متحرک نوډونو لکه InitPlan/SubPlan تحلیل کې تېروتنې دي.

که تاسو په دې انځور باور لرئ، نو د هر انفرادي نوډ ټول اعدام وخت د ټولې غوښتنې د بشپړ اجرا کولو وخت څخه ډیر دی. دا ساده ده - د دې CTE د نسل وخت د CTE سکین نوډ څخه نه دی کم شوی. له همدې امله، موږ نور سم ځواب نه پوهیږو چې د CTE سکین پخپله څومره وخت نیولی.

د PostgreSQL پوښتنو لوی اصلاح کول. کیریل بوروویکوف (ټینسر)

بیا موږ پوهیږو چې دا وخت دی چې خپل ځان ولیکئ - هورې! هر پرمخ وړونکی وايي: "اوس به موږ خپل ځان ولیکئ، دا به خورا اسانه وي!"

موږ د ویب خدماتو لپاره یو ځانګړی سټیک اخیستی: د Node.js + Express پر بنسټ یو کور، د ښکلي ډیاګرامونو لپاره بوټسټریپ او D3.js کارول شوي. او زموږ توقعات په بشپړ ډول توجیه شوي - موږ په 2 اونیو کې لومړی پروټوټایپ ترلاسه کړ:

  • دودیز پلان پارسر
    دا دی، اوس موږ کولی شو د PostgreSQL لخوا رامینځته شوي هر پلان تجزیه کړو.
  • د متحرک نوډونو سمه تحلیل - د CTE سکین، InitPlan، SubPlan
  • د بفر ویش تحلیل - چیرته چې د معلوماتو پاڼې د حافظې څخه لوستل کیږي، چیرته د محلي زیرمې څخه، چیرته د ډیسک څخه
  • وضاحت ترلاسه کړ
    نو دا ټول په لاګ کې "کیندلو" نه ، مګر په عکس کې سمدلاسه "کمزوري لینک" وګورئ.

د PostgreSQL پوښتنو لوی اصلاح کول. کیریل بوروویکوف (ټینسر)

موږ د دې په څیر یو څه ترلاسه کړل ، د ترکیب روښانه کول پکې شامل دي. مګر معمولا زموږ پراختیا کونکي نور د پلان بشپړ نمایش سره کار نه کوي ، مګر د لنډ سره. په هرصورت ، موږ دمخه ټولې شمیرې پارس کړې او کیڼ او ښیې ته یې وغورځولې ، او په مینځ کې موږ یوازې لومړۍ کرښه پریښوده ، دا څه ډول نوډ دی: د CTE سکین ، CTE نسل یا سیق سکین د ځینې نښې سره سم.

دا هغه لنډیز استازیتوب دی چې موږ یې وایو د پلان نمونه.

د PostgreSQL پوښتنو لوی اصلاح کول. کیریل بوروویکوف (ټینسر)

بل څه به اسانه وي؟ دا به اسانه وي چې وګورو چې زموږ د ټول وخت کومه برخه کوم نوډ ته ځانګړې شوې - او یوازې اړخ ته یې "چپ کړئ". پټه چارټ.

موږ نوډ ته اشاره کوو او ګورو - دا معلومه شوه چې د سیق سکین د ټول وخت له څلورمې برخې څخه لږ وخت نیولی، او پاتې 3/4 د CTE سکین لخوا اخیستل شوی. وحشت! دا د CTE سکین "د اور د اندازې" په اړه یو کوچنی یادښت دی که تاسو په فعاله توګه په خپلو پوښتنو کې کاروئ. دوی خورا ګړندي ندي - دوی حتی د منظم میز سکین کولو څخه ټیټ دي. [مقاله] [مقاله]

مګر معمولا دا ډول ډیاګرامونه ډیر په زړه پوري ، ډیر پیچلي وي ، کله چې موږ سمدلاسه یوې برخې ته اشاره کوو او د مثال په توګه ګورو چې د نیمایي څخه ډیر وخت ځینې سیق سکین "خوړل". سربیره پردې ، دننه یو ډول فلټر شتون درلود ، د دې له مخې ډیری ریکارډونه رد شوي ... تاسو کولی شئ دا عکس مستقیم پرمخ وړونکي ته واستوئ او ووایاست: "واسیا ، دلته ستاسو لپاره هرڅه خراب دي! دا معلومه کړئ، وګورئ - یو څه غلط دی!

د PostgreSQL پوښتنو لوی اصلاح کول. کیریل بوروویکوف (ټینسر)

په طبیعي توګه، ځینې "ریکیک" ښکیل وو.

لومړی شی چې موږ ورسره مخ شو د ګردي کولو ستونزه وه. په پلان کې د هر انفرادي نوډ وخت د 1 μs دقت سره ښودل شوی. او کله چې د نوډ دورې شمیر ډیر شي ، د مثال په توګه ، 1000 - د اجرا کولو وروسته PostgreSQL "دقت دننه" ویشل شوی ، نو کله چې بیرته محاسبه کوو موږ ټول وخت "د 0.95ms او 1.05ms ترمینځ" ترلاسه کوو. کله چې شمیره مایکرو ثانیو ته ځي ، سمه ده ، مګر کله چې دا دمخه [ملي] ثانیې وي ، نو تاسو باید دا معلومات په پام کې ونیسئ کله چې د پلان نوډونو ته سرچینې "خلاصول" "چا له چا څخه څومره مصرف کړي."

د PostgreSQL پوښتنو لوی اصلاح کول. کیریل بوروویکوف (ټینسر)

دوهم ټکی، ډیر پیچلی، د متحرک نوډونو تر مینځ د سرچینو ویش (هغه بفرونه) دي. دا موږ ته د پروټوټایپ لومړۍ 2 اونۍ او نورې 4 اونۍ مصرفوي.

د دې ډول ستونزې ترلاسه کول خورا اسانه دي - موږ یو CTE کوو او په دې کې یو څه لوستل. په حقیقت کې، PostgreSQL "سمارټ" دی او په مستقیم ډول به هیڅ شی ونه لوستل شي. بیا موږ له دې څخه لومړی ریکارډ اخلو، او د ورته CTE څخه یو سل او لومړی ریکارډ.

د PostgreSQL پوښتنو لوی اصلاح کول. کیریل بوروویکوف (ټینسر)

موږ پلان ته ګورو او پوهیږو - دا عجیب دی، موږ په سیق سکین کې 3 بفرونه (د معلوماتو پاڼې) "مصرف شوي" لرو، 1 نور په CTE سکین کې، او 2 نور په دویم CTE سکین کې. دا دی، که موږ په ساده ډول هرڅه راټول کړو، موږ به 6 ترلاسه کړو، مګر د ټابلیټ څخه موږ یوازې 3 لوستلو! د CTE سکین له کوم ځای څخه هیڅ نه لوستل کیږي ، مګر د پروسې حافظې سره مستقیم کار کوي. دا دی، دلته یو څه په ښکاره ډول غلط دی!

په حقیقت کې، دا معلومه شوه چې دلته د ډیټا ټول هغه 3 پاڼې دي چې د سیق سکین څخه غوښتنه شوې وه، لومړی 1 د 1st CTE سکین غوښتنه وکړه، او بیا 2، او 2 نور هغه ته لوستل شوي. د 3 مخونو ډاټا لوستل شوي، نه 6.

د PostgreSQL پوښتنو لوی اصلاح کول. کیریل بوروویکوف (ټینسر)

او دا انځور موږ ته د دې پوهیدلو لامل شو چې د پلان اجرا کول نور ونې نه ده، مګر په ساده ډول یو ډول اکیلیک ګراف دی. او موږ د دې په څیر یو ډیاګرام ترلاسه کړ ، ترڅو موږ پوه شو چې "په لومړي ځای کې له کوم ځای څخه راغلی." دا دی، دلته موږ د pg_class څخه CTE جوړ کړ، او دوه ځله یې وغوښتل، او زموږ نږدې ټول وخت په څانګه کې تیر شو کله چې موږ د دویم ځل غوښتنه وکړه. دا روښانه ده چې د 2 ننوتلو لوستل یوازې د ټابلیټ څخه د لومړۍ ننوتلو لوستلو په پرتله خورا ګران دي.

د PostgreSQL پوښتنو لوی اصلاح کول. کیریل بوروویکوف (ټینسر)

موږ د یو څه وخت لپاره ساه ورکړه. دوی وویل: "اوس، نو، تاسو کونګ فو پیژنئ! اوس زموږ تجربه ستاسو په سکرین کې سمه ده. اوس تاسو کولی شئ دا وکاروئ." [مقاله]

د ننوتلو یوځای کول

زموږ 1000 پراختیا کونکو د آرام ساه واخیسته. مګر موږ پوهیږو چې موږ یوازې په سلګونو "جنګي" سرورونه لرو، او دا ټول "کاپي پیسټ" د پراختیا کونکو په برخه کې هیڅ مناسب ندي. موږ پوه شو چې موږ باید دا پخپله راټول کړو.

د PostgreSQL پوښتنو لوی اصلاح کول. کیریل بوروویکوف (ټینسر)

په عموم کې، یو معیاري ماډل شتون لري چې کولی شي احصایې راټول کړي، په هرصورت، دا په ترتیب کې فعالولو ته هم اړتیا لري - دا pg_stat_statements ماډل. مګر هغه زموږ سره مناسب نه و.

لومړی، دا په ورته ډیټابیس کې د مختلف سکیمونو په کارولو سره ورته پوښتنو ته ګوماري مختلف پوښتنې IDs. دا دی، که تاسو لومړی وکړئ SET search_path = '01'; SELECT * FROM user LIMIT 1;او بیا SET search_path = '02'; او ورته غوښتنه، نو د دې ماډل احصایې به مختلف ریکارډونه ولري، او زه به ونه توانیدم چې عمومي احصایې په ځانګړې توګه د دې غوښتنې پروفایل په شرایطو کې راټول کړم، پرته له دې چې سکیمونه په پام کې ونیول شي.

دوهم ټکی چې موږ یې د کارولو مخه نیسي هغه دی د پلانونو نشتوالی. دا دی، هیڅ پلان نشته، یوازې پخپله غوښتنه ده. موږ ګورو چې څه ورو و، مګر موږ نه پوهیږو چې ولې. او دلته موږ د ګړندۍ بدلیدونکي ډیټاسیټ ستونزې ته راګرځو.

او وروستۍ شیبه - د "حقایقو" نشتوالی. دا، تاسو نشئ کولی د پوښتنې اجرا کولو یوه ځانګړې بیلګه په نښه کړئ - هیڅ نشته، یوازې راټول شوي احصایې شتون لري. که څه هم د دې سره کار کول ممکن دي، دا خورا ستونزمن کار دی.

د PostgreSQL پوښتنو لوی اصلاح کول. کیریل بوروویکوف (ټینسر)

له همدې امله، موږ پریکړه وکړه چې د کاپي پیسټ سره مبارزه وکړو او لیکل پیل کړو راټولونکی.

راټولونکی د SSH له لارې وصل کیږي ، د سند په کارولو سره ډیټابیس سره سرور ته خوندي اړیکه رامینځته کوي ، او tail -F په لاګ فایل کې دې ته "کلک کوي". نو په دې غونډه کې موږ د ټول لاګ فایل بشپړ "عکس" ترلاسه کوو، کوم چې سرور تولیدوي. په سرور کې بار پخپله لږترلږه دی ، ځکه چې موږ هلته هیڅ شی نه تجزیه کوو ، موږ یوازې ترافیک منعکس کوو.

لدې چې موږ دمخه په Node.js کې د انٹرفیس لیکل پیل کړي وو ، نو موږ پدې کې د راټولونکي لیکلو ته دوام ورکړ. او دا ټیکنالوژي پخپله توجیه کړې، ځکه چې دا د جاوا سکریپټ کارولو لپاره خورا اسانه دی چې د کمزوري بڼه شوي متن ډیټا سره کار وکړي، کوم چې لاګ دی. او د Node.js زیربنا پخپله د بیک انډ پلیټ فارم په توګه تاسو ته اجازه درکوي په اسانۍ او اسانۍ سره د شبکې اتصالاتو سره کار وکړئ ، او واقعیا د ډیټا جریانونو سره.

په دې اساس، موږ دوه اړیکې "غځوو": لومړی د ننوتلو لپاره "واورئ" او ځان ته یې لیږو، او دویم یې په وخت سره د اډې څخه پوښتنه کول. "مګر لاګ ښیې چې د oid 123 سره نښه بلاک شوې ده ،" مګر دا پراختیا کونکي ته هیڅ معنی نلري ، او دا به ښه وي چې ډیټابیس څخه وپوښتئ ، "په هرصورت OID = 123 څه شی دی؟" او له همدې امله موږ وخت په وخت له اډې څخه پوښتنه کوو چې موږ لاهم د ځان په اړه نه پوهیږو.

د PostgreSQL پوښتنو لوی اصلاح کول. کیریل بوروویکوف (ټینسر)

"یوازې یو شی دی چې تاسو یې په پام کې نه و نیولی، د هاتین په څیر د مچیو ډولونه شتون لري!" زموږ په پوهه کې ترټولو مهم، چیرې چې ځینې ستونزې رامینځته شوي چې ورسره معامله کول ستونزمن وو. مګر د لومړۍ ربع په جریان کې، موږ د څارنې لپاره سل ترلاسه کړل - ځکه چې سیسټم کار کاوه، هرڅوک یې غوښتل، هرڅوک آرام وو.

دا ټول باید اضافه شي، د معلوماتو جریان لوی او فعال دی. په حقیقت کې، هغه څه چې موږ یې څارنه کوو، هغه څه چې موږ ورسره معامله کولی شو، هغه څه دي چې موږ یې کاروو. موږ PostgreSQL د ډیټا ذخیره کولو په توګه هم کاروو. او هیڅ شی د آپریټر په پرتله پدې کې د ډیټا "راوستل" لپاره ګړندي ندي COPY تر اوسه نه.

مګر په ساده ډول "ډیریل" ډاټا واقعیا زموږ ټیکنالوژي نه ده. ځکه چې که تاسو په سلو سرورونو کې په هره ثانیه کې نږدې 50k غوښتنې ولرئ ، نو دا به هره ورځ 100-150GB لاګونه تولید کړي. له همدې امله، موږ باید په احتیاط سره اډه "کټ" کړو.

لومړی، موږ وکړل د ورځې په واسطه ویشل، ځکه چې ، په لویه کچه ، هیڅ څوک د ورځو ترمینځ اړیکې سره علاقه نلري. دا څه توپیر کوي هغه څه چې تاسو پرون درلودل، که نن شپه تاسو د غوښتنلیک نوې نسخه وړاندې کړه - او دمخه ځینې نوي احصایې.

دوهم، موږ زده کړل (مجبور وو) په کارولو سره د لیکلو لپاره خورا ګړندی COPY. دا، نه یوازې COPYځکه چې هغه په ​​​​پرتله ګړندی دی INSERT، او حتی چټک.

د PostgreSQL پوښتنو لوی اصلاح کول. کیریل بوروویکوف (ټینسر)

دریم ټکی - زه باید وم محرکونه، په ترتیب سره، او بهرنۍ کیلي پریږدئ. دا دی، موږ په هیڅ ډول د حوالې بشپړتیا نه لرو. ځکه چې که تاسو یو میز ولرئ چې د FKs یوه جوړه ولري، او تاسو د ډیټابیس جوړښت کې ووایاست چې "دلته د ننوتلو ریکارډ دی چې د FK لخوا راجع شوی، د بیلګې په توګه، د ریکارډونو یوې ډلې ته،" بیا کله چې تاسو دا داخل کړئ، PostgreSQL هیڅ شی نه دی پاتې مګر دا چې څنګه یې واخلو او په صادقانه توګه یې ترسره کړو SELECT 1 FROM master_fk1_table WHERE ... د هغه پیژندونکي سره چې تاسو یې د داخلولو هڅه کوئ - یوازې د دې لپاره چې وګورئ دا ریکارډ هلته شتون لري، دا چې تاسو دا بهرنۍ کیلي په خپل داخلولو سره "ماتې" نه کړئ.

د هدف جدول او د هغې شاخصونو ته د یو ریکارډ پرځای ، موږ د ټولو جدولونو لوستلو اضافي ګټه ترلاسه کوو چې دا ورته اشاره کوي. مګر موږ دې ته اړتیا نلرو - زموږ دنده دا ده چې د امکان تر حده او ژر تر ژره د لږترلږه بار سره ثبت کړو. نو FK - ښکته!

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

اوس تصور وکړئ چې تاسو یو میز لرئ په کوم کې چې تاسو په ساده ډول د هغو غوښتنو شمیره شمیرئ چې د ځانګړي کوربه څخه تیر شوي دي: +1, +1, +1, ..., +1. او تاسو، په اصل کې، دې ته اړتیا نلرئ - دا ټول ممکن دي په راټولونکي کې په حافظه کې مجموعه او په یو ځل ډیټابیس ته واستوئ +10.

هو، د ځینو ستونزو په صورت کې، ستاسو منطقي بشپړتیا ممکن "له منځه لاړه شي"، مګر دا تقریبا غیر واقعیتي قضیه ده - ځکه چې تاسو یو نورمال سرور لرئ، دا په کنټرولر کې بیټرۍ لري، تاسو د راکړې ورکړې لاګ لرئ، یو لاګ. د فایل سیسټم ... په عموم کې، دا د دې ارزښت نلري. د تولید زیان چې تاسو د چلولو محرکونو/FKs څخه ترلاسه کوئ د هغه لګښت ارزښت نلري چې تاسو یې اخلئ.

د هاشینګ سره ورته دی. یوه ځانګړې غوښتنه تاسو ته راځي، تاسو په ډیټابیس کې له هغه څخه یو مشخص پیژندونکی حساب کړئ، ډیټابیس ته یې ولیکئ او بیا یې ټولو ته ووایاست. هر څه سم دي تر هغه چې د ثبت کولو په وخت کې، یو دویم کس تاسو ته راشي چې غواړي ورته شی ثبت کړي - او تاسو بلاک شوي، او دا دمخه خراب دی. له همدې امله، که تاسو د ځینې IDs نسل پیرودونکي ته لیږدولی شئ (د ډیټابیس سره تړاو لري)، دا غوره ده چې دا کار وکړئ.

دا زموږ لپاره مناسبه وه چې له متن څخه MD5 وکاروو - غوښتنه، پلان، ټیمپلیټ، ... موږ دا د راټولونکي اړخ کې محاسبه کوو، او چمتو شوي ID ډیټابیس ته "وځوو". د MD5 اوږدوالی او ورځنی تقسیم کول موږ ته اجازه راکوي چې د احتمالي ټکرونو په اړه اندیښنه ونکړو.

د PostgreSQL پوښتنو لوی اصلاح کول. کیریل بوروویکوف (ټینسر)

مګر د دې ټولو ګړندي ثبتولو لپاره ، موږ اړتیا درلوده چې پخپله د ثبت کولو طرزالعمل بدل کړو.

تاسو معمولا معلومات څنګه لیکئ؟ موږ یو ډول ډیټا سیټ لرو، موږ یې په څو جدولونو ویشو، او بیا یې کاپي کوو - لومړی په لومړي کې، بیا په دویم کې، دریم ته ... دا ناشونی دی، ځکه چې داسې ښکاري چې موږ په دریو مرحلو کې یو ډیټا لیکو. په ترتیب سره. ناخوښه. ایا دا په چټکۍ سره ترسره کیدی شي؟ کولای شي!

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

د PostgreSQL پوښتنو لوی اصلاح کول. کیریل بوروویکوف (ټینسر)

يعنې په جمع کوونکي کې تل یو جریان ويپه کوم کې چې زه کولی شم هغه معلومات ولیکم چې زه ورته اړتیا لرم. مګر د دې لپاره چې ډیټابیس دا ډاټا وګوري، او څوک د دې ډاټا لیکلو په انتظار کې پاتې نشي، COPY باید په ځینو وقفو کې ودرول شي. زموږ لپاره، ترټولو اغیزمنه دوره شاوخوا 100ms وه - موږ یې وتړو او سمدلاسه یې ورته میز ته خلاص کړو. او که موږ د ځینې چوټو په جریان کې کافي جریان ونه لرو ، نو بیا موږ تر یو ټاکلي حد پورې حوض کوو.

سربیره پردې ، موږ وموندله چې د داسې بار پروفایل لپاره ، هر ډول راټولول ، کله چې ریکارډونه په بیچونو کې راټولیږي ، بد دی. کلاسیک شر دی INSERT ... VALUES او نور 1000 ریکارډونه. ځکه چې پدې وخت کې تاسو په میډیا کې د لیکلو چوکۍ لرئ، او هرڅوک چې هڅه کوي ډیسک ته یو څه ولیکي انتظار به وي.

د داسې بې نظمیو څخه د خلاصون لپاره، په ساده ډول هیڅ شی مه راټولوئ، په هیڅ صورت کې مه اخلئ. او که چیرې ډیسک ته بفرینګ پیښ شي (خوشبختانه ، په Node.js کې سټریم API تاسو ته اجازه درکوي ومومئ) - دا اړیکه وځنډوئ. کله چې تاسو یوه پیښه ترلاسه کړئ چې دا بیا وړیا ده، د راټول شوي کتار څخه یې ولیکئ. او پداسې حال کې چې دا بوخت دی، راتلونکی وړیا د حوض څخه واخلئ او هغې ته یې ولیکئ.

مخکې لدې چې د ډیټا ثبتولو ته د دې طریقې معرفي کول ، موږ نږدې 4K لیکلو عملیات درلودل ، او پدې توګه موږ بار 4 ځله کم کړ. اوس دوی د نوي څارل شوي ډیټابیسونو له امله نور 6 ځله وده کړې - تر 100MB/s پورې. او اوس موږ د تیرو 3 میاشتو لاګونه د شاوخوا 10-15TB حجم کې ذخیره کوو ، پدې هیله چې یوازې په دریو میاشتو کې به کوم پراختیا کونکي وکولی شي کومه ستونزه حل کړي.

موږ په ستونزو پوهیږو

مګر په ساده ډول د دې ټولو معلوماتو راټولول ښه، ګټور، اړونده، مګر کافي ندي - دا باید پوه شي. ځکه چې دا هره ورځ ملیونونه مختلف پلانونه دي.

د PostgreSQL پوښتنو لوی اصلاح کول. کیریل بوروویکوف (ټینسر)

مګر ملیونونه د مدیریت وړ ندي ، موږ باید لومړی "کوچني" وکړو. او، لومړی، تاسو اړتیا لرئ پریکړه وکړئ چې تاسو به دا "کوچنی" شی څنګه تنظیم کړئ.

موږ درې مهم ټکي په ګوته کړل:

  • څوک دا غوښتنه لیږل شوې
    دا د کوم غوښتنلیک څخه "راوستل" دی: ویب انٹرفیس، بیک انډ، د تادیې سیسټم یا بل څه.
  • چې دا پیښه شوه
    په کوم ځانګړي سرور کې؟ ځکه چې که تاسو د یو غوښتنلیک لاندې څو سرورونه لرئ، او ناڅاپه یو "احمق" کیږي (ځکه چې "ډیسک خراب شوی"، "میموري لیک شوی"، یو څه بله ستونزه)، نو تاسو اړتیا لرئ چې په ځانګړې توګه سرور ته ځواب ووایاست.
  • څنګه ستونزه په یو ډول یا بل ډول ښکاره شوه

د پوهیدو لپاره چې "چا" موږ ته غوښتنه رالېږلې، موږ یو معیاري وسیله کاروو - د سیشن متغیر ترتیب کول: SET application_name = '{bl-host}:{bl-method}'; - موږ د سوداګرۍ منطق کوربه نوم لیږو چې غوښتنه ترې راځي، او د هغه میتود یا غوښتنلیک نوم چې دا یې پیل کړی.

وروسته له دې چې موږ د غوښتنې "مالک" تېر کړو، دا باید لاګ ته تولید شي - د دې لپاره موږ متغیر تنظیم کوو log_line_prefix = ' %m [%p:%v] [%d] %r %a'. د هغو کسانو لپاره چې لیوالتیا لري، شاید په لارښود کې وګورئدا ټول څه معنی لري. دا معلومه شوه چې موږ په لاګ کې ګورو:

  • время
  • د پروسې او لیږد پیژندونکي
  • د ډیټابیس نوم
  • د هغه چا IP چې دا غوښتنه یې لیږلې
  • او د میتود نوم

د PostgreSQL پوښتنو لوی اصلاح کول. کیریل بوروویکوف (ټینسر)

بیا موږ پوهیږو چې دا ډیره زړه پورې نه ده چې د مختلف سرورونو ترمنځ د یوې غوښتنې لپاره ارتباط وګورئ. دا اکثرا نه وي چې تاسو داسې وضعیت ولرئ چیرې چې یو غوښتنلیک دلته او هلته مساوي پیچل کیږي. مګر حتی که دا ورته وي، د دې سرورونو څخه کوم یو وګورئ.

نو دلته کټ دی "یو سرور - یوه ورځ" دا زموږ لپاره د هر ډول تحلیل لپاره کافي و.

لومړۍ تحلیلي برخه همدا ده "نمونه" - د پلان د وړاندې کولو لنډه بڼه، د ټولو شمیرو شاخصونو څخه پاک شوی. دوهم کټ د غوښتنلیک یا میتود دی، او دریم کټ د ځانګړي پلان نوډ دی چې موږ ته یې ستونزې رامینځته کړې.

کله چې موږ د ځانګړو مثالونو څخه ټیمپلیټ ته لاړو، موږ په یوځل کې دوه ګټې ترلاسه کړې:

  • د تحلیل لپاره د شیانو په شمیر کې ډیری کمښت
    موږ باید ستونزه نور د زرګونو پوښتنو یا پلانونو په واسطه تحلیل نه کړو، بلکه د لسګونو نمونو په واسطه.
  • مهال ویش
    دا د یوې ځانګړې برخې دننه د "حقایقو" لنډیز کولو سره، تاسو کولی شئ د ورځې په اوږدو کې د دوی بڼه ښکاره کړئ. او دلته تاسو کولی شئ پوه شئ چې که تاسو یو ډول نمونه لرئ چې پیښیږي ، د مثال په توګه ، په یو ساعت کې یو ځل ، مګر دا باید په ورځ کې یو ځل پیښ شي ، تاسو باید د دې په اړه فکر وکړئ چې څه غلط شوي - څوک یې لامل شوي او ولې ، شاید دا باید دلته وي. باید نه. دا یو بل غیر عددي، خالص لید، د تحلیل میتود دی.

د PostgreSQL پوښتنو لوی اصلاح کول. کیریل بوروویکوف (ټینسر)

پاتې میتودونه د شاخصونو پراساس دي چې موږ یې له پلان څخه استخراج کوو: دا ډول نمونه څو ځله پیښ شوي، ټول او اوسط وخت، څومره معلومات د ډیسک څخه لوستل شوي، او څومره د حافظې څخه ...

ځکه چې، د بیلګې په توګه، تاسو د کوربه لپاره د تحلیل پاڼې ته راځي، وګورئ - یو څه په ډیسک کې ډیر لوستل پیل کوي. په سرور کې ډیسک نشي کولی دا اداره کړي - څوک له دې څخه لوستل کیږي؟

او تاسو کولی شئ د هر کالم له مخې ترتیب کړئ او پریکړه وکړئ چې تاسو به همدا اوس څه معامله کوئ - په پروسیسر یا ډیسک کې بار، یا د غوښتنو ټول شمیر... د اپلیکیشن یوه نوې نسخه خپره کړه.
[ویډیو لیکچر]

او سمدلاسه تاسو کولی شئ مختلف غوښتنلیکونه وګورئ چې د غوښتنې په څیر ورته ټیمپلیټ سره راځي SELECT * FROM users WHERE login = 'Vasya'. مخکینۍ، شاته، پروسس کول ... او تاسو حیران یاست چې ولې پروسس کول به کاروونکي ولولي که چیرې هغه ورسره اړیکه ونلري.

برعکس لاره دا ده چې سمدلاسه د غوښتنلیک څخه وګورئ چې دا څه کوي. د مثال په توګه، مخکنی پای دا دی، دا، دا، او دا په یو ساعت کې یو ځل ( مهال ویش مرسته کوي). او پوښتنه سمدلاسه راپورته کیږي: داسې بریښي چې دا د مخکیني کار دنده نه ده چې په ساعت کې یو ځل یو څه وکړي ...

د PostgreSQL پوښتنو لوی اصلاح کول. کیریل بوروویکوف (ټینسر)

د یو څه وخت وروسته، موږ پوهیږو چې موږ راټول شوي یو د پلان نوډونو لخوا احصایې. موږ د پلانونو څخه یوازې هغه نوډونه جلا کوو چې پخپله د میزونو ډیټا سره یو څه کوي (د شاخص په واسطه لوستل / لیکل کیږي یا نه). په حقیقت کې، یوازې یو اړخ د تیر انځور په پرتله اضافه شوی - دا نوډ موږ ته څومره ریکارډونه راوړي؟، او څومره یې رد شوي (قطارونه د فلټر لخوا لرې شوي).

تاسو په پلیټ کې مناسب شاخص نلرئ، تاسو ورته غوښتنه کوئ، دا د شاخص څخه تیریږي، په سیق سکین کې راځي ... تاسو د یو پرته ټول ریکارډونه فلټر کړي دي. تاسو ولې هره ورځ 100M فلټر شوي ریکارډونو ته اړتیا لرئ؟ ایا دا غوره نه ده چې شاخصونه پورته کړئ؟

د PostgreSQL پوښتنو لوی اصلاح کول. کیریل بوروویکوف (ټینسر)

د نوډ په واسطه د ټولو پلانونو نوډ تحلیل کولو سره، موږ پوهیږو چې په پالنونو کې ځینې ځانګړي جوړښتونه شتون لري چې ډیر احتمال لري شکمن ښکاري. او دا به ښه وي چې پرمخ وړونکي ته ووایاست: "ملګري، دلته تاسو لومړی د شاخص له مخې ولولئ، بیا ترتیب کړئ، او بیا پرې کړئ" - د یوې قاعدې په توګه، یو ریکارډ شتون لري.

هرڅوک چې پوښتنې لیکلي وي شاید د دې نمونې سره مخ شوي وي: "ما ته د واسیا لپاره وروستی امر راکړئ، د هغې نیټه." او که تاسو د نیټې له مخې شاخص نلرئ، یا په هغه شاخص کې چې تاسو یې کارولی وي هیڅ نیټه شتون نلري. په ورته "ریک" باندې ګام پورته کړئ.

مګر موږ پوهیږو چې دا یو "ریک" دی - نو ولې سمدلاسه پراختیا کونکي ته نه ووایی چې هغه باید څه وکړي. په همدې اساس ، کله چې اوس پلان خلاص کړئ ، زموږ پراختیا کونکی سمدلاسه د لارښوونو سره یو ښکلی عکس ګوري ، چیرې چې دوی سمدلاسه ورته ووایی: "تاسو دلته او هلته ستونزې لرئ ، مګر دوی په دې ډول حل کیږي."

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

د PostgreSQL پوښتنو لوی اصلاح کول. کیریل بوروویکوف (ټینسر)

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

Add a comment