{"id":36171,"date":"2019-10-31T22:09:58","date_gmt":"2019-10-31T19:09:58","guid":{"rendered":"https:\/\/prohoster.info\/blog\/po-sledam-highload-siberia-2019-8-zadach-po-oracle\/"},"modified":"2019-10-31T22:09:58","modified_gmt":"2019-10-31T19:09:58","slug":"po-sledam-highload-siberia-2019-8-zadach-po-oracle","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/po-sledam-highload-siberia-2019-8-zadach-po-oracle","title":{"rendered":"Na esteira do Highload++ Siberia 2019 \u2014 8 desafios sobre Oracle","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ol\u00e1!<\/p>\n<p>Nos dias 24 e 25 de junho, ocorreu em Novosibirsk a confer\u00eancia Highload++ Siberia 2019. Nossa equipe tamb\u00e9m esteve l\u00e1. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.highload.ru\/siberia\/2019\/abstracts\/5211\">palestra<\/a><\/noindex> \"Bancos de dados em cont\u00eaineres Oracle (CDB\/PDB) e seu uso pr\u00e1tico para o desenvolvimento de software\", publicaremos a vers\u00e3o textual um pouco mais tarde. Foi incr\u00edvel, obrigado. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/olegbunin\/\" class=\"user_link\">olegbunin<\/a><\/noindex> pela organiza\u00e7\u00e3o, e a todos que compareceram. <\/p>\n<p><img decoding=\"async\" alt=\"Na esteira do Highload++ Siberia 2019 \u2014 8 desafios sobre Oracle\" src=\"\/wp-content\/uploads\/2019\/07\/27f4707d4bb5968eaaa5c4748ff467cd.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNeste post, gostar\u00edamos de compartilhar com voc\u00eas as quest\u00f5es que estavam em nosso estande, para que voc\u00eas possam testar seus conhecimentos em Oracle. Abaixo \u2014 8 quest\u00f5es, op\u00e7\u00f5es de respostas e explica\u00e7\u00f5es.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Qual \u00e9 o valor m\u00e1ximo da sequ\u00eancia que veremos como resultado da execu\u00e7\u00e3o do seguinte script?<\/h3>\n<p><\/p>\n<pre><code class=\"sql\">create sequence s start with 1;\n \nselect s.currval, s.nextval, s.currval, s.nextval, s.currval\nfrom dual\nconnect by level &lt;= 5;\n<\/code><\/pre>\n<p><\/p>\n<ul>\n<li>1<\/li>\n<li>5<\/li>\n<li>10<\/li>\n<li>25<\/li>\n<li>Nenhum, haver\u00e1 um erro<\/li>\n<\/ul>\n<p>\n<b class=\"spoiler_title\">Resposta<\/b>Segundo a documenta\u00e7\u00e3o Oracle (citada da vers\u00e3o 8.1.6):<br \/>\nDentro de uma \u00fanica instru\u00e7\u00e3o SQL, o Oracle ir\u00e1 incrementar a sequ\u00eancia apenas uma vez por linha. Se uma instru\u00e7\u00e3o contiver mais de uma refer\u00eancia a NEXTVAL para uma sequ\u00eancia, o Oracle incrementa a sequ\u00eancia uma vez e retorna o mesmo valor para todas as ocorr\u00eancias de NEXTVAL. Se uma instru\u00e7\u00e3o cont\u00e9m refer\u00eancias a tanto CURRVAL quanto NEXTVAL, o Oracle incrementa a sequ\u00eancia e retorna o mesmo valor para ambas, CURRVAL e NEXTVAL, independentemente da ordem dentro da instru\u00e7\u00e3o.<\/p>\n<p>Portanto, <b>o valor m\u00e1ximo corresponder\u00e1 ao n\u00famero de linhas, ou seja, 5<\/b>.<\/p>\n<h3>Quantas linhas haver\u00e1 na tabela como resultado da execu\u00e7\u00e3o do seguinte script?<\/h3>\n<p><\/p>\n<pre><code class=\"sql\">create table t(i integer check (i &lt; 5));\n \ncreate procedure p(p_from integer, p_to integer) as\nbegin\n    for i in p_from .. p_to loop\n        insert into t values (i);\n    end loop;\nend;\n\/\n \nexec p(1, 3);\nexec p(4, 6);\nexec p(7, 9);<\/code><\/pre>\n<p><\/p>\n<ul>\n<li>0<\/li>\n<li>3<\/li>\n<li>4<\/li>\n<li>5<\/li>\n<li>6<\/li>\n<li>9<\/li>\n<\/ul>\n<p>\n<b class=\"spoiler_title\">Resposta<\/b>Segundo a documenta\u00e7\u00e3o Oracle (citada da vers\u00e3o 11.2):<\/p>\n<p>Antes de executar qualquer instru\u00e7\u00e3o SQL, o Oracle marca um ponto de salvamento impl\u00edcito (n\u00e3o dispon\u00edvel para voc\u00ea). Depois, se a instru\u00e7\u00e3o falhar, o Oracle reverte automaticamente e retorna o c\u00f3digo de erro aplic\u00e1vel para SQLCODE no SQLCA. Por exemplo, se uma instru\u00e7\u00e3o INSERT causar erro ao tentar inserir um valor duplicado em um \u00edndice \u00fanico, a instru\u00e7\u00e3o \u00e9 revertida.<\/p>\n<p>A chamada de PL\/SQL a partir do cliente tamb\u00e9m \u00e9 considerada e tratada como uma \u00fanica instru\u00e7\u00e3o. Assim, a primeira chamada de PL\/SQL \u00e9 conclu\u00edda com sucesso, inserindo tr\u00eas registros; a segunda chamada de PL\/SQL resulta em um erro e reverte o quarto registro, que foi inserido; a terceira chamada resulta em erro, <b>e na tabela permanecem tr\u00eas registros.<\/b>.<\/p>\n<h3>Quantas linhas haver\u00e1 na tabela como resultado da execu\u00e7\u00e3o do seguinte script?<\/h3>\n<p><\/p>\n<pre><code class=\"sql\">create table t(i integer, constraint i_ch check (i &lt; 3));\n \nbegin\n    insert into t values (1);\n    insert into t values (null);\n    insert into t values (2);\n    insert into t values (null);\n    insert into t values (3);\n    insert into t values (null);\n    insert into t values (4);\n    insert into t values (null);\n    insert into t values (5);\nexception\n    when others then\n        dbms_output.put_line(&#039;Oops!&#039;);\nend;\n\/<\/code><\/pre>\n<p><\/p>\n<ul>\n<li>1<\/li>\n<li>2<\/li>\n<li>3<\/li>\n<li>4<\/li>\n<li>5<\/li>\n<li>6<\/li>\n<li>7<\/li>\n<\/ul>\n<p>\n<b class=\"spoiler_title\">Resposta<\/b>Segundo a documenta\u00e7\u00e3o Oracle (citada da vers\u00e3o 11.2):<\/p>\n<p>Uma restri\u00e7\u00e3o de verifica\u00e7\u00e3o permite especificar uma condi\u00e7\u00e3o que cada linha na tabela deve satisfazer. Para satisfazer a restri\u00e7\u00e3o, cada linha na tabela deve tornar a condi\u00e7\u00e3o verdadeira ou desconhecida (devido a um valor nulo). Quando o Oracle avalia a condi\u00e7\u00e3o da restri\u00e7\u00e3o de verifica\u00e7\u00e3o para uma linha espec\u00edfica, quaisquer nomes de colunas na condi\u00e7\u00e3o referem-se aos valores das colunas nessa linha.<\/p>\n<p>Assim, o valor nulo passar\u00e1 na verifica\u00e7\u00e3o, e o bloco an\u00f4nimo ser\u00e1 executado com sucesso at\u00e9 a tentativa de inserir o valor 3. Ap\u00f3s isso, o bloco de tratamento de erros apagar\u00e1 a exce\u00e7\u00e3o, n\u00e3o ocorrer\u00e1 rollback e <b>a tabela permanecer\u00e1 com quatro linhas<\/b> com valores 1, nulo, 2 e novamente nulo.<\/p>\n<h3>Quais pares de valores ocupar\u00e3o os mesmos volumes de espa\u00e7o no bloco?<\/h3>\n<p><\/p>\n<pre><code class=\"sql\">create table t (\n    a char(1 char),\n    b char(10 char),\n    c char(100 char),\n    i number(4),\n    j number(14),\n    k number(24),\n    x varchar2(1 char),\n    y varchar2(10 char),\n    z varchar2(100 char));\n \ninsert into t (a, b, i, j, x, y)\n    values ('Y', 'Vasiliy', 10, 10, 'D', 'Vasiliy');\n<\/code><\/pre>\n<p><\/p>\n<ul>\n<li>A e X<\/li>\n<li>B e Y<\/li>\n<li>C e K<\/li>\n<li>C e Z<\/li>\n<li>K e Z<\/li>\n<li>I e J<\/li>\n<li>J e X<\/li>\n<li>Todos os mencionados<\/li>\n<\/ul>\n<p>\n<b class=\"spoiler_title\">Resposta<\/b>Vamos apresentar trechos da documenta\u00e7\u00e3o (12.1.0.2) sobre o armazenamento de diferentes tipos de dados no Oracle.<\/p>\n<p><b>Tipo de Dados CHAR<\/b><br \/>\nO tipo de dados CHAR especifica uma string de caracteres de comprimento fixo no conjunto de caracteres do banco de dados. Voc\u00ea especifica o conjunto de caracteres do banco de dados ao criar seu banco de dados. O Oracle garante que todos os valores armazenados em uma coluna CHAR tenham o comprimento especificado pelo tamanho na sem\u00e2ntica de comprimento selecionada. Se voc\u00ea inserir um valor que \u00e9 mais curto que o comprimento da coluna, ent\u00e3o o Oracle preenche o valor com espa\u00e7os at\u00e9 o comprimento da coluna.<\/p>\n<p><b>Tipo de Dados VARCHAR2<\/b><br \/>\nO tipo de dados VARCHAR2 especifica uma string de caracteres de comprimento vari\u00e1vel no conjunto de caracteres do banco de dados. Voc\u00ea especifica o conjunto de caracteres do banco de dados ao criar seu banco de dados. O Oracle armazena um valor de caractere em uma coluna VARCHAR2 exatamente como voc\u00ea o especifica, sem qualquer preenchimento com espa\u00e7os, desde que o valor n\u00e3o exceda o comprimento da coluna.<\/p>\n<p><b>Tipo de Dados NUMBER<\/b><br \/>\nO tipo de dados NUMBER armazena zero, bem como n\u00fameros fixos positivos e negativos com valores absolutos de 1.0 x 10-130 a, mas n\u00e3o incluindo, 1.0 x 10126. Se voc\u00ea especificar uma express\u00e3o aritm\u00e9tica cujo valor tenha um valor absoluto maior ou igual a 1.0 x 10126, ent\u00e3o o Oracle retorna um erro. Cada valor NUMBER requer de 1 a 22 bytes. Tendo isso em conta, o tamanho da coluna em bytes para um valor num\u00e9rico espec\u00edfico NUMBER(p), onde p \u00e9 a precis\u00e3o de um determinado valor, pode ser calculado usando a seguinte f\u00f3rmula: <i>ROUND((length(p)+s)\/2))+1<\/i> onde s \u00e9 igual a zero se o n\u00famero for positivo, e s \u00e9 igual a 1 se o n\u00famero for negativo.<\/p>\n<p>Al\u00e9m disso, vamos apresentar um trecho da documenta\u00e7\u00e3o sobre o armazenamento de valores nulos.<\/p>\n<p>Um nulo \u00e9 a aus\u00eancia de um valor em uma coluna. Nulos indicam dados faltantes, desconhecidos ou n\u00e3o aplic\u00e1veis. Os nulos s\u00e3o armazenados no banco de dados se ca\u00edrem entre colunas com valores de dados. Nesses casos, eles requerem 1 byte para armazenar o comprimento da coluna (zero). Nulos finais em uma linha n\u00e3o requerem armazenamento porque um novo cabe\u00e7alho de linha sinaliza que as colunas restantes na linha anterior est\u00e3o nulas. Por exemplo, se as tr\u00eas \u00faltimas colunas de uma tabela est\u00e3o nulas, ent\u00e3o nenhum dado \u00e9 armazenado para essas colunas.<\/p>\n<p>Com base nesses dados, elaboramos racioc\u00ednios. Consideramos que no DB est\u00e1 sendo usada a codifica\u00e7\u00e3o AL32UTF8. Nessa codifica\u00e7\u00e3o, letras russas ocupar\u00e3o 2 bytes.<\/p>\n<p>1) A e X, o valor do campo a 'Y' ocupa 1 byte, o valor do campo x '\u0414' \u2013 2 bytes<br \/>\n2) B e Y, 'Vasja' em b ser\u00e1 preenchido com espa\u00e7os at\u00e9 10 caracteres e ocupar\u00e1 14 bytes, 'Vasja' em d ocupar\u00e1 8 bytes.<br \/>\n3) C e K. Ambos os campos t\u00eam valor NULL, e ap\u00f3s eles existem campos significativos, ent\u00e3o ocupam 1 byte cada.<br \/>\n4) C e Z. Ambos os campos t\u00eam valor NULL, mas o campo Z \u00e9 o \u00faltimo na tabela, portanto n\u00e3o ocupa espa\u00e7o (0 bytes). O campo C ocupa 1 byte.<br \/>\n5) K e Z. Similar ao caso anterior. O valor no campo K ocupa 1 byte, enquanto em Z ocupa 0.<br \/>\n6) I e J. De acordo com a documenta\u00e7\u00e3o, ambos os valores ocupar\u00e3o 2 bytes. A dura\u00e7\u00e3o \u00e9 calculada pela f\u00f3rmula da documenta\u00e7\u00e3o: round((1 + 0) \/ 2) + 1 = 1 + 1 = 2.<br \/>\n7) J e X. O valor no campo J ocupar\u00e1 2 bytes, e o valor no campo X ocupar\u00e1 2 bytes.<\/p>\n<p><b>Portanto, as op\u00e7\u00f5es corretas s\u00e3o: C e K, I e J, J e X.<\/b><\/p>\n<p><\/p>\n<h3>Qual ser\u00e1 aproximadamente o fator de clustering do \u00edndice T_I?<\/h3>\n<p><\/p>\n<pre><code class=\"sql\">create table t (i integer);\n \ninserir em t selecionar rownum de dual conectar por n\u00edvel &lt;= 10000;\n \ncreate index t_i on t(i);\n<\/code><\/pre>\n<p><\/p>\n<ul>\n<li>Cerca de dezenas<\/li>\n<li>Cerca de centenas<\/li>\n<li>Cerca de milhares<\/li>\n<li>Cerca de dezenas de milhares<\/li>\n<\/ul>\n<p>\n<b class=\"spoiler_title\">Resposta<\/b>De acordo com a documenta\u00e7\u00e3o da Oracle (citada a partir da vers\u00e3o 12.1):<\/p>\n<p>Para um \u00edndice B-tree, o fator de clustering do \u00edndice mede o agrupamento f\u00edsico das linhas em rela\u00e7\u00e3o a um valor de \u00edndice.<\/p>\n<p>O fator de clustering do \u00edndice ajuda o otimizador a decidir se uma varredura de \u00edndice ou uma varredura completa da tabela \u00e9 mais eficiente para certas consultas. Um fator de clustering baixo indica uma varredura de \u00edndice eficiente.<\/p>\n<p>Um fator de clustering pr\u00f3ximo ao n\u00famero de blocos em uma tabela indica que as linhas est\u00e3o ordenadas fisicamente nos blocos da tabela pelo valor da chave do \u00edndice. Se o banco de dados realizar uma varredura completa da tabela, ele tende a recuperar as linhas na ordem em que est\u00e3o armazenadas no disco, ordenadas pela chave do \u00edndice. Um fator de clustering pr\u00f3ximo ao n\u00famero de linhas indica que as linhas est\u00e3o espalhadas aleatoriamente across os blocos do banco de dados em rela\u00e7\u00e3o \u00e0 chave do \u00edndice. Se o banco de dados realizar uma varredura completa da tabela, ele n\u00e3o recuperaria as linhas em nenhuma ordem ordenada por essa chave do \u00edndice.<\/p>\n<p>Neste caso, os dados est\u00e3o perfeitamente ordenados, portanto o fator de clustering ser\u00e1 igual ou pr\u00f3ximo ao n\u00famero de blocos ocupados na tabela. Para um tamanho padr\u00e3o de bloco de 8 kilobytes, pode-se esperar que em um bloco caber\u00e3o cerca de mil valores de n\u00famero estreito, portanto o n\u00famero de blocos, e consequentemente o fator de clustering, ser\u00e1 <b>cerca de dezenas<\/b>.<\/p>\n<h3>Quais valores de N permitir\u00e3o que o seguinte script seja executado com sucesso em um banco de dados padr\u00e3o com configura\u00e7\u00f5es padr\u00e3o?<\/h3>\n<p><\/p>\n<pre><code class=\"sql\">create table t (\n    a varchar2(N char),\n    b varchar2(N char),\n    c varchar2(N char),\n    d varchar2(N char));\n \ncreate index t_i on t (a, b, c, d);\n<\/code><\/pre>\n<p><\/p>\n<ul>\n<li>100<\/li>\n<li>200<\/li>\n<li>400<\/li>\n<li>800<\/li>\n<li>1600<\/li>\n<li>3200<\/li>\n<li>6400<\/li>\n<\/ul>\n<p>\n<b class=\"spoiler_title\">Resposta<\/b>Segundo a documenta\u00e7\u00e3o Oracle (citada da vers\u00e3o 11.2):<\/p>\n<p>Limites de Banco de Dados L\u00f3gico<\/p>\n<p><strong>Item<\/strong><br \/>\n<strong>Tipo de Limite<\/strong><br \/>\n<strong>Valor do Limite<\/strong><\/p>\n<p>\u00cdndices<br \/>\nTamanho total da coluna indexada<br \/>\n75% do tamanho do bloco do banco de dados menos alguma sobrecarga<\/p>\n<p>\nAssim, o tamanho total das colunas indexadas n\u00e3o deve exceder 6 KB. O que vem a seguir depende da codifica\u00e7\u00e3o escolhida para o banco de dados. Para a codifica\u00e7\u00e3o AL32UTF8, um caractere pode ocupar no m\u00e1ximo 4 bytes; assim, em 6 kilobytes, no pior cen\u00e1rio, caber\u00e3o cerca de 1500 caracteres. Portanto, o Oracle proibir\u00e1 a cria\u00e7\u00e3o do \u00edndice quando N = 400 (quando o comprimento da chave, no pior caso, for 1600 caracteres * 4 bytes + o comprimento do rowid), enquanto <b>para N = 200 (ou menos)<\/b> a cria\u00e7\u00e3o do \u00edndice funcionar\u00e1 sem problemas.<\/p>\n<h3>O operador INSERT com o hint APPEND \u00e9 destinado a carregar dados em modo direto. O que acontecer\u00e1 se ele for aplicado a uma tabela que tem um trigger?<\/h3>\n<p><\/p>\n<ul>\n<li>Os dados ser\u00e3o carregados em modo direto, o trigger ser\u00e1 acionado como deveria<\/li>\n<li>Os dados ser\u00e3o carregados em modo direto, mas o trigger n\u00e3o ser\u00e1 executado<\/li>\n<li>Os dados ser\u00e3o carregados em modo convencional, o trigger ser\u00e1 acionado como deveria<\/li>\n<li>Os dados ser\u00e3o carregados em modo convencional, mas o trigger n\u00e3o ser\u00e1 executado<\/li>\n<li>Os dados n\u00e3o ser\u00e3o carregados, um erro ser\u00e1 registrado<\/li>\n<\/ul>\n<p>\n<b class=\"spoiler_title\">Resposta<\/b>Na verdade, esta quest\u00e3o \u00e9 mais l\u00f3gica. Para encontrar a resposta correta, eu sugeriria o seguinte modelo de racioc\u00ednio:<\/p>\n<ol>\n<li>A inser\u00e7\u00e3o em modo direto \u00e9 realizada criando diretamente o bloco de dados, saltando o motor SQL, o que garante alta velocidade. Assim, \u00e9 muito dif\u00edcil garantir a execu\u00e7\u00e3o do trigger, se \u00e9 que \u00e9 poss\u00edvel, e n\u00e3o faz sentido, pois isso de qualquer forma atrasar\u00e1 drasticamente a inser\u00e7\u00e3o.<\/li>\n<li>A n\u00e3o execu\u00e7\u00e3o do trigger far\u00e1 com que, com dados id\u00eanticos na tabela, o estado do banco de dados como um todo (outras tabelas) dependa de qual modo esses dados foram inseridos. Isso obviamente quebrar\u00e1 a integridade dos dados e n\u00e3o pode ser aplicado como solu\u00e7\u00e3o em produ\u00e7\u00e3o.<\/li>\n<li>A impossibilidade de realizar a opera\u00e7\u00e3o solicitada, de um modo geral, \u00e9 considerada um erro. Mas aqui \u00e9 preciso lembrar que APPEND \u00e9 um hint, e a l\u00f3gica geral dos hints \u00e9 que eles s\u00e3o considerados quando poss\u00edvel, se n\u00e3o, o operador \u00e9 executado sem levar em conta o hint.<\/li>\n<\/ol>\n<p>\nAssim, a resposta esperada \u00e9 <b>os dados ser\u00e3o carregados no modo normal (SQL), o trigger ser\u00e1 acionado.<\/b><\/p>\n<p>De acordo com a documenta\u00e7\u00e3o do Oracle (citado de 8.04):<\/p>\n<p>Viola\u00e7\u00f5es das restri\u00e7\u00f5es far\u00e3o com que a instru\u00e7\u00e3o seja executada em s\u00e9rie, usando o caminho de inser\u00e7\u00e3o convencional, sem avisos ou mensagens de erro. Uma exce\u00e7\u00e3o \u00e9 a restri\u00e7\u00e3o em instru\u00e7\u00f5es que acessam a mesma tabela mais de uma vez em uma transa\u00e7\u00e3o, o que pode causar mensagens de erro.<br \/>\nPor exemplo, se existem disparadores ou integridade referencial na tabela, o hint APPEND ser\u00e1 ignorado quando voc\u00ea tentar usar INSERT de carregamento direto (serial ou paralelo), assim como o hint ou cl\u00e1usula PARALLEL, se houver.<\/p>\n<h3>O que acontecer\u00e1 ao executar o seguinte script?<\/h3>\n<p><\/p>\n<pre><code class=\"sql\">create table t(i integer not null primary key, j integer references t);\n \ncreate trigger t_a_i after insert on t for each row\ndeclare\n    pragma autonomous_transaction;\nbegin\n    insert into t values (:new.i + 1, :new.i);\n    commit;\nend;\n\/\n \ninsert into t values (1, null);\n<\/code><\/pre>\n<p><\/p>\n<ul>\n<li>Execu\u00e7\u00e3o bem-sucedida<\/li>\n<li>Falha devido a erro de sintaxe<\/li>\n<li>Erro relacionado \u00e0 impossibilidade de transa\u00e7\u00e3o aut\u00f4noma<\/li>\n<li>Erro relacionado ao limite m\u00e1ximo de chamadas aninhadas excedido<\/li>\n<li>Erro relacionado \u00e0 viola\u00e7\u00e3o de chave estrangeira<\/li>\n<li>Erro relacionado a bloqueios<\/li>\n<\/ul>\n<p>\n<b class=\"spoiler_title\">Resposta<\/b>A tabela e o disparador s\u00e3o criados corretamente e essa opera\u00e7\u00e3o n\u00e3o deve causar problemas. Transa\u00e7\u00f5es aut\u00f4nomas em disparadores tamb\u00e9m s\u00e3o permitidas; caso contr\u00e1rio, n\u00e3o seria poss\u00edvel, por exemplo, registrar eventos.<\/p>\n<p>Ap\u00f3s a inser\u00e7\u00e3o da primeira linha, a ativa\u00e7\u00e3o bem-sucedida do disparador levaria \u00e0 inser\u00e7\u00e3o de uma segunda linha, o que acionaria novamente o disparador, insertando uma terceira linha e assim por diante, at\u00e9 que a instru\u00e7\u00e3o falhasse devido \u00e0 exced\u00eancia do limite m\u00e1ximo de chamadas aninhadas. No entanto, surge outro ponto sutil. No momento da execu\u00e7\u00e3o do disparador para o primeiro registro inserido, o commit ainda n\u00e3o foi realizado. Portanto, o disparador, que funciona em uma transa\u00e7\u00e3o aut\u00f4noma, tenta inserir na tabela uma linha que referencia uma chave estrangeira de um registro que ainda n\u00e3o foi comitado. Isso leva a uma espera (a transa\u00e7\u00e3o aut\u00f4noma aguarda o commit principal para entender se os dados podem ser inseridos) e, simultaneamente, a transa\u00e7\u00e3o principal aguarda o commit da aut\u00f4noma para continuar o trabalho ap\u00f3s o disparador. <b>Ocorre um deadlock e, como resultado, a transa\u00e7\u00e3o aut\u00f4noma \u00e9 abortada devido a problemas relacionados a bloqueios.<\/b>.<\/p>\n<p class=\"for_users_only_msg\">Apenas usu\u00e1rios registrados podem participar da pesquisa. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Entre<\/a><\/noindex>, por favor.<\/p>\n<h2 class=\"default-block__polling-title\">Foi dif\u00edcil?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Facinho, resolvi tudo certo na hora.<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Nada muito, errei em algumas perguntas.<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Acertou metade certo.<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Acertou duas vezes a resposta!<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Escreverei nos coment\u00e1rios<\/p>\n<\/li>\n<\/ul>\n<p>    14 usu\u00e1rios votaram. 10 usu\u00e1rios se abstiveram.<br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/459680\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442! 24-25 \u0438\u044e\u043d\u044f \u0432 \u041d\u043e\u0432\u043e\u0441\u0438\u0431\u0438\u0440\u0441\u043a\u0435 \u043f\u0440\u043e\u0448\u043b\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u044f Highload++ Siberia 2019. \u041d\u0430\u0448\u0438 \u0440\u0435\u0431\u044f\u0442\u0430 \u0442\u043e\u0436\u0435 \u0442\u0430\u043c \u0431\u044b\u043b\u0438 \u0434\u043e\u043a\u043b\u0430\u0434\u043e\u043c \u00ab\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043d\u044b\u0435 \u0431\u0430\u0437\u044b Oracle (CDB\/PDB) \u0438 \u0438\u0445 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u041f\u041e\u00bb, \u043c\u044b \u0432\u044b\u043b\u043e\u0436\u0438\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0437\u0436\u0435. \u0411\u044b\u043b\u043e \u043a\u0440\u0443\u0442\u043e, \u0441\u043f\u0430\u0441\u0438\u0431\u043e olegbunin \u0437\u0430 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044e, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432\u0441\u0435\u043c, \u043a\u0442\u043e \u043f\u0440\u0438\u0448\u0451\u043b. \u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u043c\u044b \u0445\u043e\u0442\u0435\u043b\u0438 \u0431\u044b \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441 \u0432\u0430\u043c\u0438 \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":27053,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-36171","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442! 24-25 \u0438\u044e\u043d\u044f \u0432 \u041d\u043e\u0432\u043e\u0441\u0438\u0431\u0438\u0440\u0441\u043a\u0435 \u043f\u0440\u043e\u0448\u043b\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u044f Highload++ Siberia 2019.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/po-sledam-highload-siberia-2019-8-zadach-po-oracle\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041f\u043e \u0441\u043b\u0435\u0434\u0430\u043c Highload++ Siberia 2019 \u2014 8 \u0437\u0430\u0434\u0430\u0447 \u043f\u043e Oracle | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442! 24-25 \u0438\u044e\u043d\u044f \u0432 \u041d\u043e\u0432\u043e\u0441\u0438\u0431\u0438\u0440\u0441\u043a\u0435 \u043f\u0440\u043e\u0448\u043b\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u044f Highload++ Siberia 2019.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/po-sledam-highload-siberia-2019-8-zadach-po-oracle\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:09:58+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:09:58+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Ap\u00f3s o Highload++ Siberia 2019 \u2014 8 desafios sobre Oracle | ProHoster","description":"Ol\u00e1! Nos dias 24-25 de junho, ocorreu em Novosibirsk a confer\u00eancia Highload++ Siberia 2019.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/po-sledam-highload-siberia-2019-8-zadach-po-oracle","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041f\u043e \u0441\u043b\u0435\u0434\u0430\u043c Highload++ Siberia 2019 \u2014 8 \u0437\u0430\u0434\u0430\u0447 \u043f\u043e Oracle | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442! 24-25 \u0438\u044e\u043d\u044f \u0432 \u041d\u043e\u0432\u043e\u0441\u0438\u0431\u0438\u0440\u0441\u043a\u0435 \u043f\u0440\u043e\u0448\u043b\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u044f Highload++ Siberia 2019.","og:url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/po-sledam-highload-siberia-2019-8-zadach-po-oracle","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:09:58+00:00","article:modified_time":"2019-10-31T19:09:58+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"36171","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-22 02:18:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:49:43","updated":"2026-01-22 02:18:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/36171","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=36171"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/36171\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/27053"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=36171"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=36171"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=36171"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}