Materiais da reunião #RuPostgres - vídeos, apresentações, análise de questionário e reportagem fotográfica

Em 15 de setembro, foi realizada uma reunião no Avito, onde conversamos sobre o dimensionamento de aplicativos no PostgreSQL. Hoje eu quero compartilhar materiais dele - vídeos, apresentações de palestrantes, mostrar fotos. Além disso, publico uma discussão das perguntas do questionário que conduzimos aqui em Habré, antes do mitap. E eu falo sobre minhas impressões da reunião.



Relatórios


Transações distribuídas e viagens no tempo. Stas Kelvich, Profissional do Postgres


Stas falou sobre transações distribuídas e viagens no tempo.



Apresentação


Comentários:


Stas e sua equipe fizeram um excelente trabalho! Espero que a comunidade deles aprove a decisão e veremos esta solução na nova versão do Postgres.

Escalando um aplicativo no PostgreSQL no Avito: dicas e truques. Konstantin Evteev, Avito


Fiz uma apresentação sobre o dimensionamento de um aplicativo no PostgreSQL no Avito e compartilhei nossas dicas e truques.



Apresentação


Comentários:


Uma abordagem interessante: na qual o Kostantin explicou de maneira muito interessante e inteligente os problemas que você pode encontrar ao trabalhar com dados em uma arquitetura de microsserviço, e também sugeriu soluções para o dimensionamento de IP. Saga é lembrada :)

Replicação lógica e níveis de isolamento de transações do PostgreSQL. Mikhail Tyurin


Michael preparou um relatório sobre replicação lógica e níveis de isolamento de transações do PostgreSQL.



Apresentação


Comentários:


Michael destacou os momentos sutis das transações, que estão longe de serem imediatamente visíveis não apenas para iniciantes. Todo mundo precisa saber sobre isso.

OZO é uma biblioteca de cliente PostgreSQL assíncrona, segura e somente para cabeçalho, para C ++ 17. Sergey Handrikov, Yandex


Sergey disse à platéia sobre como o OZO, a biblioteca de cliente PostgreSQL assíncrona e segura para cabeçalho, apenas para tipo, é organizada e convidada a contribuir com ela.



Apresentação


Comentários:


O autor, na minha opinião, conseguiu revelar rapidamente os problemas nas bibliotecas existentes e as soluções nas novas bibliotecas C ++ em pouco tempo. Portanto, ficarei feliz se essas bibliotecas forem desenvolvidas em código aberto, as coisas mais básicas já estão implementadas, que não podem deixar de se alegrar.

Respostas às perguntas do questionário


Antes da reunião, convidamos você a responder perguntas sobre o Postgres. Hoje eu quero mostrar as respostas corretas. Eles estão sob os spoilers (apenas no caso).


Há uma tabela vazia sem registros de usuários ("UserId" int, "balance" int). O que retornará como resultado da consulta?


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

A resposta

Nada.


O que retornará a solicitação, select * from users where UserId = 10; ao acessar a tabela de usuários após concluir o trabalho anterior?


A resposta

ERRO: a coluna "userid" não existe.


Definido pelo Enum CREATE TYPE status AS ENUM ('wait', 'init', 'run', 'stop'); Qual comando pode remover o valor de 'init'?


A resposta

Não há uma maneira padrão de remover um valor da enumeração.


Como posso obter uma lista de funções no PostgreSQL?


A resposta

selecione * De pg_proc;


O que retornará como resultado da consulta?


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

A resposta

ERRO: não é possível converter o tipo smallint para booleano.


O desenvolvedor júnior Vasya foi instruído a escrever uma consulta que exibisse todas as entradas da tabela parent para as quais não há entradas na tabela child .


Esquema de dados:


 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 se esforçou muito e não queria enfrentar a sujeira, então ele fez oito consultas diferentes para resolver o problema:


 -- 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 apresentou suas opções para você, para que você pudesse ajudá-lo a escolher a melhor. Ele afirma que todas as consultas funcionam da mesma maneira: as tabelas são colocadas na memória e a diferença de desempenho não é significativa (ou mesmo invisível). No entanto, você, como desenvolvedor mais experiente, percebeu que talvez nem todas as solicitações resolvam a tarefa. Liste as consultas que não resolvem a tarefa (e explique o porquê).


Resposta curta

As tarefas 2, 3 e 5 não resolvem esse problema (em alguns casos, também solicite 1).


A resposta para o resultado do experimento

Dados de teste:


O "erro" do comportamento é manifestado quando há registros na tabela filho com parent_id é nulo.


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

Nos dados de teste fornecidos


  • A consulta 1, dependendo de a extensão intarray estar instalada, pode ou não funcionar.
  • A consulta 2 retorna uma sequência extra (nula, nula).
  • As consultas 3 e 5 retornam um conjunto de resultados vazio.

Interpretação dos resultados experimentais


Pedido 1: se a extensão intarray estiver instalada no banco de dados ( https://www.postgresql.org/docs/current/static/intarray.html ), a solicitação trava com o erro "ERRO: o array não deve conter nulos". Esse comportamento ocorre devido ao fato de a extensão substituir os operadores padrão e alterar o comportamento de matrizes que contêm elementos nulos.


A documentação diz o seguinte:


Os operadores &&, @> e <@ são equivalentes aos operadores internos do PostgreSQL com os mesmos nomes, exceto pelo fato de trabalharem apenas em matrizes inteiras que não contêm nulos, enquanto os operadores internos trabalham para qualquer tipo de matriz. Essa restrição os torna mais rápidos que os operadores internos em muitos casos.

Pedido 2: devido à junção completa, uma sequência extra (nula, nula) aparece como resultado.


Solicitação 3: retorna um conjunto de resultados vazio devido ao fato de o conjunto formado pela subconsulta ter elementos nulos.


Documentação ( https://www.postgresql.org/docs/current/static/functions-subquery.html#FUNCTIONS-SUBQUERY-NOTIN ):


Observe que, se a expressão à esquerda gerar nulo ou se não houver valores iguais à direita e pelo menos uma linha à direita gerar nulo, o resultado da construção NOT IN será nulo, não verdadeiro. Isso está de acordo com as regras normais do SQL para combinações booleanas de valores nulos.

Consulta 5: retorna um conjunto de resultados vazio porque a seção w_child_with_parents é chamada, as tabelas child e parent_id estão vazias ou não são refletidas na seção.


Todas as perguntas do questionário foram respondidas corretamente por três participantes. Entregamos um ao prêmio na reunião, mais dois conjuntos de lembranças foram enviados pelo correio.



Posfácio


Mais de cem pessoas compareceram à reunião. Foi muito bom conhecer esse público. Segundo uma pesquisa, mais de 60% dos hóspedes mitap têm experiência em trabalhar com bancos de dados por mais de cinco anos. E é muito bom quando os relatórios recebem uma resposta tão animada do público:



À margem das reuniões, houve muita discussão sobre o PostgreSQL se tornar uma ferramenta cada vez mais comum. É mesmo. Aproveito a oportunidade para dizer que, no Avito, planejamos expandir a equipe do DBA, e se você estiver interessado em tarefas ambiciosas em um grande projeto, observe a vaga no My Circle ou escreva para mim.



Concluindo, quero agradecer aos colegas da Yandex, Postgres Professional e, é claro, da Avito pelos maravilhosos relatórios que ouvimos. Agradecemos aos convidados que vieram até nós neste dia de sábado e aos espectadores ao vivo. E, claro, a comunidade #RuPostgres por confiança.


Lista de reprodução com todos os relatórios aqui .
Postamos reportagens fotográficas no Facebook e no VKontakte .



Até breve!

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


All Articles