مواد من الاجتماع #RuPostgres - مقاطع فيديو وعروض تقديمية وتحليل مسابقة وتقرير مصور

في 15 سبتمبر ، تم عقد اجتماع في Avito ، حيث تحدثنا عن توسيع نطاق التطبيقات على PostgreSQL. اليوم أريد مشاركة مواد منه - مقاطع فيديو وعروض تقديمية من المتحدثين وعرض الصور. أيضًا ، بموجب الخفض ، أنشر مناقشة حول أسئلة الاختبار التي أجريناها هنا في حبري ، قبل mitap. وأتحدث عن انطباعاتي عن الاجتماع.



التقارير


المعاملات الموزعة والسفر عبر الزمن. ستاس كيلفيتش ، Postgres Professional


تحدث ستاس عن المعاملات الموزعة والسفر عبر الزمن.



عرض


التعليقات:


قام ستاس وفريقه بعمل ممتاز! آمل أن يوافق مجتمعهم على قرارهم وسنرى هذا الحل في إصدار Postgres الجديد.

توسيع نطاق تطبيق على PostgreSQL في Avito: النصائح والحيل. كونستانتين إفتييف ، أفيتو


لقد قدمت عرضًا تقديميًا حول توسيع نطاق تطبيق على PostgreSQL في Avito وشاركت نصائحنا وحيلنا.



عرض


التعليقات:


نهج مثير للاهتمام: حيث شرح Kostantin بشكل مثير للاهتمام ومفهوم للغاية المشكلات التي قد تواجهها عند العمل مع البيانات في بنية الخدمات الصغيرة ، واقترح أيضًا حلولًا لتوسيع نطاق IP. تذكر الملحمة :)

النسخ المتماثل المنطقي ومستويات عزل المعاملات PostgreSQL. ميخائيل تيورين


أعد مايكل تقريرًا عن النسخ المتماثل المنطقي ومستويات عزل المعاملات PostgreSQL.



عرض


التعليقات:


سلط مايكل الضوء على اللحظات الدقيقة للمعاملات ، والتي لا تكون مرئية على الفور ليس فقط للمبتدئين. على الجميع أن يعرفوا ذلك.

OZO هي مكتبة عميل PostgreSQL غير متزامنة وآمنة للرأس فقط لـ C ++ 17. سيرجي هاندريكوف ، ياندكس


أخبر Sergey الجمهور حول كيفية ترتيب OZO ، مكتبة عميل PostgreSQL غير المتزامنة والآمنة للرأس فقط لـ C ++ 17 ، ودعوتها للمساهمة في ذلك.



عرض


التعليقات:


تمكن المؤلف ، في رأيي ، من الكشف بسرعة عن المشاكل الموجودة في المكتبات الحالية والحلول في مكتبات C ++ الجديدة في وقت قصير. لذلك ، سأكون سعيدًا إذا تم تطوير هذه المكتبات في مصدر مفتوح ، كلما تم تنفيذ الأشياء الأساسية بالفعل ، والتي لا يمكن إلا أن نفرح.

إجابات على أسئلة الاختبار


قبل الاجتماع ، قمنا بدعوتك للإجابة على أسئلة حول Postgres. اليوم أريد أن أعرض الإجابات الصحيحة. هم تحت المفسدين (فقط في حالة).


يوجد جدول فارغ بدون سجلات المستخدمين ("UserId" int ، "Balance" int). ماذا سيعود نتيجة الاستعلام؟


with ins as ( insert into users select gs, gs * 10 from generate_series(1, 4) gs where gs%2 = 0) select * from users; 

الجواب

لا شيء.


ماذا سيعيد الطلب select * from users where UserId = 10; عند الوصول إلى جدول المستخدمين بعد الانتهاء من المهمة السابقة؟


الجواب

خطأ: العمود "userid" غير موجود.


محدد بواسطة Enum CREATE TYPE status AS ENUM ('wait'، 'init'، 'run'، 'stop')؛ أي أمر يمكن أن يزيل قيمة 'init'؟


الجواب

لا توجد طريقة قياسية لإزالة قيمة من التعداد.


كيف يمكنني الحصول على قائمة بالوظائف في PostgreSQL؟


الجواب

حدد * من pg_proc ؛


ماذا سيعود نتيجة الاستعلام؟


 select null = null, null is null, 1::smallint::boolean is true, null::bigint > 1 

الجواب

خطأ: لا يمكن إرسال نوع smallint إلى منطقي.


تم توجيه المطور الصغير Vasya لكتابة استعلام يعرض جميع الإدخالات من الجدول parent الذي لا توجد إدخالات له في الجدول الفرعي.


مخطط البيانات:


 create table parent (parent_id serial primary key, payload text); create table child (child_id serial primary key, parent_id integer unique references parent (parent_id)); 

حاول Vasya بجد ولم يرغب في مواجهة التراب ، لذلك توصل إلى ثمانية استفسارات مختلفة لحل المشكلة:


 -- 0 select p.parent_id, p.payload from parent p where not exists(select from child c where c.parent_id = p.parent_id); -- 1 select p.parent_id, p.payload from parent p where not (array[p.parent_id] && array(select c.parent_id from child c)); -- 2 select distinct p.parent_id, p.payload from parent p full join child c on (c.parent_id = p.parent_id) where c.parent_id is null; -- 3 select p.parent_id, p.payload from parent p where p.parent_id not in (select c.parent_id from child c); -- 4 select p.parent_id, p.payload from parent p left join child c on (c.parent_id = p.parent_id) where c.parent_id is null; -- 5 with w_child_with_parents as ( select c.parent_id, ( select count(*) from parent p where c.parent_id = p.parent_id) = 1 as parent_exists from child c) select p.parent_id, p.payload from parent p where p.parent_id in (select pc.parent_id from w_child_with_parents pc where not pc.parent_exists); -- 6 select p.parent_id, p.payload from parent p full join child c on (c.parent_id = p.parent_id) group by p.parent_id, p.payload having count(c) = 0; -- 7 select p.parent_id, p.payload from parent p where p.parent_id in ( select p2.parent_id from parent p2 except all select c2.parent_id from child c2); 

قدم Vasya خياراته لك حتى تتمكن من مساعدته في اختيار الأفضل. يدعي أن جميع الاستعلامات تعمل بنفس الطريقة: يتم وضع الجداول في الذاكرة والفرق في الأداء ليس كبيرا (أو حتى غير مرئي). ومع ذلك ، فقد لاحظت كمطور أكثر خبرة أنه ربما لم تحل جميع الطلبات المهمة. اذكر الاستعلامات التي لا تحل المهمة (واشرح السبب).


إجابة قصيرة

لا تحل المهام 2 و 3 و 5 هذه المشكلة (في بعض الحالات ، طلب 1 أيضًا).


الجواب على نتيجة التجربة

بيانات الاختبار:


يتجلى "عدم صحة" السلوك عندما تكون هناك سجلات في الجدول التابع مع الأصل_الأمر فارغة.


 insert into parent (parent_id, payload) values (1, 'payload 1'), (2, 'payload 2'), (3, 'payload 3'), (4, 'payload 4'), (5, 'payload 5'); insert into child (child_id, parent_id) values (1, 1), (2, 3), (3, null), (5, 5); 

على بيانات الاختبار المعطاة


  • الاستعلام 1 ، اعتمادًا على ما إذا كان ملحق intarray مثبتًا ، قد يعمل أو لا يعمل.
  • يقوم الاستعلام 2 بإرجاع سلسلة إضافية (خالية ، خالية).
  • الاستعلامات 3 و 5 ترجع مجموعة نتائج فارغة.

تفسير النتائج التجريبية


الطلب 1: في حالة تثبيت امتداد intarray في قاعدة البيانات ( https://www.postgresql.org/docs/current/static/intarray.html ) ، يتعطل الطلب مع الخطأ "خطأ: يجب ألا يحتوي الصفيف على قيم خالية". يرجع هذا السلوك إلى حقيقة أن الامتداد يتجاوز عوامل التشغيل القياسية ويغير سلوك المصفوفات التي تحتوي على عناصر فارغة.


تقول الوثائق ما يلي:


تُعادل عوامل التشغيل && و @> و <@ عوامل التشغيل المضمنة في PostgreSQL التي تحمل نفس الأسماء ، باستثناء أنها لا تعمل إلا على المصفوفات الصحيحة التي لا تحتوي على قيم خالية ، بينما تعمل عوامل التشغيل المضمنة مع أي نوع صفيف. هذا التقييد يجعلها أسرع من عوامل التشغيل المضمنة في كثير من الحالات.

الطلب 2: نتيجة للانضمام الكامل ، تظهر سلسلة إضافية (خالية ، خالية) نتيجة لذلك.


الطلب 3: إرجاع مجموعة نتائج فارغة بسبب حقيقة أن المجموعة التي شكلها الاستعلام الفرعي تحتوي على عناصر فارغة.


التوثيق ( https://www.postgresql.org/docs/current/static/functions-subquery.html#FUNCTIONS-SUBQUERY-NOTIN ):


لاحظ أنه إذا كان التعبير الأيسر ينتج قيمة خالية ، أو إذا لم تكن هناك قيم متساوية في اليد اليمنى وكان صف واحد على الأقل في اليمين ينتج قيمة خالية ، فستكون نتيجة البناء NOT IN فارغة ، وليست صحيحة. هذا يتوافق مع قواعد SQL العادية للمجموعات المنطقية من القيم الخالية.

الاستعلام 5: يُرجع مجموعة نتائج فارغة لأن قسم w_child_with_parents يسمى ، والجدول الفرعي و الأصل_الأبدي فارغ أو لا ينعكس على الإطلاق في القسم.


تم الإجابة على جميع أسئلة الاختبار بشكل صحيح من قبل ثلاثة مشاركين. سلمنا واحدًا للجائزة في الاجتماع ، وتم إرسال مجموعتين إضافيتين من الهدايا التذكارية بالبريد.



خاتمة


حضر الاجتماع أكثر من مائة شخص. كان من اللطيف جدا مقابلة مثل هذا الجمهور. وفقا لمسح ، أكثر من 60 ٪ من ضيوف mitap لديهم خبرة في العمل مع قواعد البيانات لأكثر من خمس سنوات. ومن الجيد جدًا أن تحصل التقارير على استجابة حية من الجمهور:



على هامش الاجتماعات ، كان هناك الكثير من الحديث عن أن PostgreSQL أصبحت أداة شائعة بشكل متزايد. إنه كذلك حقًا. أغتنم هذه الفرصة لأقول أننا في Avito نخطط لتوسيع فريق DBA ، وإذا كنت مهتمًا بالمهام الطموحة في مشروع كبير ، فابحث عن الوظيفة الشاغرة في My Circle أو اكتب إلي.



في الختام ، أود أن أشكر الزملاء من Yandex و Postgres Professional ، وبالطبع Avito على التقارير الرائعة التي سمعناها. شكرا للضيوف الذين أتوا إلينا في يوم السبت هذا وللمشاهدين على الهواء مباشرة. وبالطبع ، مجتمع #RuPostgres للثقة.


قائمة التشغيل مع جميع التقارير هنا .
نشرنا تقارير الصور على Facebook و VKontakte .



اراك قريبا!

Source: https://habr.com/ru/post/ar424249/


All Articles