Pada 15 September, sebuah pertemuan diadakan di Avito, di mana kami berbicara tentang penskalaan aplikasi di PostgreSQL. Hari ini saya ingin berbagi materi darinya - video, presentasi dari pembicara, tunjukkan foto. Juga, di bawah potongan, saya menerbitkan diskusi tentang pertanyaan kuis yang kami lakukan di sini di Habré, sebelum mitap. Dan saya berbicara tentang kesan saya tentang pertemuan itu.

Laporan
Transaksi terdistribusi dan perjalanan waktu. Stas Kelvich, Postgres Professional
Stas berbicara tentang transaksi yang didistribusikan dan perjalanan waktu.
Presentasi
Ulasan:
Stas dan timnya melakukan pekerjaan yang sangat baik! Saya berharap keputusan mereka akan disetujui oleh komunitas dan kami akan melihat solusi ini dalam versi baru Postgres.
Melakukan penskalaan aplikasi pada PostgreSQL di Avito: tips dan trik. Konstantin Evteev, Avito
Saya membuat presentasi tentang penskalaan aplikasi pada PostgreSQL di Avito dan membagikan tips dan trik kami.
Presentasi
Ulasan:
Pendekatan yang menarik: di mana Kostantin dengan sangat menarik dan cerdas menjelaskan masalah apa yang mungkin Anda temui ketika bekerja dengan data dalam arsitektur layanan mikro, dan juga menyarankan solusi untuk penskalaan IP. Saga diingat :)
Replikasi logis dan tingkat isolasi transaksi PostgreSQL. Mikhail Tyurin
Michael menyiapkan laporan replikasi logis dan tingkat isolasi transaksi PostgreSQL.
Presentasi
Ulasan:
Michael menyoroti momen-momen transaksi yang halus, yang jauh dari langsung terlihat tidak hanya bagi pemula. Semua orang perlu tahu tentang ini.
OZO adalah pustaka klien PostgreSQL khusus-jenis header yang tidak sinkron untuk C ++ 17. Sergey Handrikov, Yandex
Sergey memberi tahu para hadirin tentang bagaimana OZO, pustaka klien PostgreSQL header-only asynchronous type-safe untuk C ++ 17 diatur, dan diundang untuk berkontribusi padanya.
Presentasi
Ulasan:
Penulis, menurut pendapat saya, berhasil dengan cepat mengungkapkan masalah di perpustakaan yang ada dan solusi di perpustakaan C ++ baru dalam waktu singkat. Oleh karena itu, saya akan senang jika perpustakaan ini dikembangkan di opensource, hal-hal yang lebih mendasar sudah diterapkan, yang tidak bisa tidak bersuka cita.
Jawaban untuk pertanyaan kuis
Sebelum pertemuan, kami mengundang Anda untuk menjawab pertanyaan tentang Postgres. Hari ini saya ingin menunjukkan jawaban yang benar. Mereka berada di bawah spoiler (untuk berjaga-jaga).
Ada tabel kosong tanpa catatan pengguna ("UserId" int, "balance" int). Apa yang akan kembali sebagai hasil dari permintaan?
with ins as ( insert into users select gs, gs * 10 from generate_series(1, 4) gs where gs%2 = 0) select * from users;
Apa yang akan mengembalikan permintaan select * from users where UserId = 10;
saat mengakses tabel pengguna setelah menyelesaikan pekerjaan sebelumnya?
JawabannyaGALAT: kolom "userid" tidak ada.
Didefinisikan oleh Enum CREATE TYPE status AS ENUM ('wait', 'init', 'run', 'stop'); Perintah mana yang dapat menghapus nilai 'init'?
JawabannyaTidak ada cara standar untuk menghapus nilai dari enum.
Bagaimana saya bisa mendapatkan daftar fungsi di PostgreSQL?
Apa yang akan kembali sebagai hasil dari permintaan?
select null = null, null is null, 1::smallint::boolean is true, null::bigint > 1
JawabannyaGALAT: tidak bisa menggunakan tipe smallint ke boolean.
Pengembang junior Vasya diperintahkan untuk menulis kueri yang menampilkan semua entri dari tabel parent
yang tidak ada entri di tabel child
.
Skema Data:
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 berusaha sangat keras dan tidak ingin menghadapi kotoran, jadi dia datang dengan delapan pertanyaan berbeda untuk menyelesaikan masalah:
-- 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 mempresentasikan pilihannya kepada Anda sehingga Anda dapat membantunya memilih yang terbaik. Dia mengklaim bahwa semua kueri bekerja dengan cara yang sama: tabel ditempatkan di memori dan perbedaan kinerja tidak signifikan (atau bahkan tidak terlihat). Namun, Anda, sebagai pengembang yang lebih berpengalaman, telah memperhatikan bahwa mungkin tidak semua permintaan menyelesaikan tugas. Buat daftar pertanyaan yang tidak menyelesaikan tugas (dan jelaskan alasannya).
Jawaban singkatTugas 2, 3, dan 5 tidak menyelesaikan masalah ini (dalam beberapa kasus, juga meminta 1).
Jawaban atas hasil percobaanData uji:
"Ketidaktepatan" dari perilaku dimanifestasikan ketika ada catatan dalam tabel anak dengan parent_id adalah nol.
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);
Pada data uji yang diberikan
- Kueri 1, tergantung pada apakah ekstensi intarray diinstal, mungkin atau tidak berfungsi.
- Kueri 2 mengembalikan string ekstra (null, null).
- Kueri 3 dan 5 mengembalikan set hasil kosong.
Interpretasi hasil eksperimen
Permintaan 1: jika ekstensi intarray dipasang di database ( https://www.postgresql.org/docs/current/static/intarray.html ), permintaan macet dengan kesalahan "ERROR: array tidak boleh mengandung nulls". Perilaku ini disebabkan oleh fakta bahwa ekstensi menimpa operator standar dan mengubah perilaku untuk array yang mengandung elemen nol.
Dokumentasi mengatakan sebagai berikut:
Operator &&, @> dan <@ setara dengan operator built-in PostgreSQL dengan nama yang sama, kecuali mereka hanya bekerja pada array integer yang tidak mengandung null, sedangkan operator built-in bekerja untuk semua tipe array. Pembatasan ini membuat mereka lebih cepat daripada operator built-in dalam banyak kasus.
Permintaan 2: karena bergabung penuh, string tambahan (null, null) muncul sebagai hasilnya.
Permintaan 3: mengembalikan resultset kosong karena fakta bahwa set yang dibentuk oleh subquery memiliki elemen nol.
Dokumentasi ( https://www.postgresql.org/docs/current/static/functions-subquery.html#FUNCTIONS-SUBQUERY-NOTIN ):
Perhatikan bahwa jika ekspresi sebelah kiri menghasilkan nol, atau jika tidak ada nilai kanan yang sama dan setidaknya satu baris kanan menghasilkan nol, hasil dari konstruksi NOT IN akan menjadi nol, tidak benar. Ini sesuai dengan aturan normal SQL untuk kombinasi Boolean dari nilai nol.
Kueri 5: mengembalikan hasil kosong karena bagian w_child_with_parents dipanggil, tabel child dan parent_id kosong atau tidak tercermin sama sekali di bagian tersebut.
Semua pertanyaan kuis dijawab dengan benar oleh tiga peserta. Kami menyerahkan satu ke hadiah di pertemuan itu, dua set suvenir lagi dikirimkan melalui pos.

Kata penutup
Lebih dari seratus orang datang ke pertemuan itu. Sangat menyenangkan bertemu dengan penonton seperti itu. Menurut sebuah survei, lebih dari 60% tamu mitap memiliki pengalaman bekerja dengan database selama lebih dari lima tahun. Dan itu sangat bagus ketika laporan mendapat tanggapan yang semarak dari audiens:

Di sela-sela pertemuan, ada banyak pembicaraan tentang PostgreSQL menjadi alat yang semakin umum. Memang benar. Saya mengambil kesempatan ini untuk mengatakan bahwa kami dalam Avito berencana untuk memperluas tim DBA, dan jika Anda tertarik pada tugas-tugas ambisius pada proyek besar, lihat lowongan di Lingkaran Saya atau kirim surat kepada saya.

Sebagai penutup, saya ingin mengucapkan terima kasih kepada rekan-rekan dari Yandex, Postgres Professional dan, tentu saja, Avito untuk laporan indah yang kami dengar. Terima kasih kepada para tamu yang datang kepada kami pada hari Sabtu ini dan kepada pemirsa langsung. Dan tentu saja, komunitas #RuPostgres untuk kepercayaan.
Daftar putar dengan semua laporan di sini .
Kami memposting laporan foto di Facebook dan VKontakte .

Sampai ketemu lagi!