{"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\/fr\/blog\/administrirovanie\/po-sledam-highload-siberia-2019-8-zadach-po-oracle","title":{"rendered":"\u00c0 la suite de Highload++ Sib\u00e9rie 2019 \u2014 8 t\u00e2ches sur Oracle","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Bonjour !<\/p>\n<p>Les 24 et 25 juin \u00e0 Novossibirsk s'est tenue la conf\u00e9rence Highload++ Siberia 2019. Nos \u00e9quipes \u00e9taient \u00e9galement pr\u00e9sentes. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.highload.ru\/siberia\/2019\/abstracts\/5211\">pr\u00e9sentation<\/a><\/noindex> \u00abBases de donn\u00e9es de conteneurs Oracle (CDB\/PDB) et leur utilisation pratique pour le d\u00e9veloppement de logiciels\u00bb, nous publierons la version textuelle un peu plus tard. C'\u00e9tait g\u00e9nial, merci. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/olegbunin\/\" class=\"user_link\">olegbunin<\/a><\/noindex> pour l'organisation, ainsi qu'\u00e0 tous ceux qui sont venus. <\/p>\n<p><img decoding=\"async\" alt=\"\u00c0 la suite de Highload++ Sib\u00e9rie 2019 \u2014 8 t\u00e2ches sur Oracle\" src=\"\/wp-content\/uploads\/2019\/07\/27f4707d4bb5968eaaa5c4748ff467cd.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDans ce post, nous aimerions partager avec vous les t\u00e2ches qui ont \u00e9t\u00e9 pr\u00e9sent\u00e9es \u00e0 notre stand, afin que vous puissiez tester vos connaissances en Oracle. Dans la suite, 8 t\u00e2ches, options de r\u00e9ponses et explications.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Quelle est la valeur maximale que le s\u00e9quenceur affichera comme r\u00e9sultat de l'ex\u00e9cution du script suivant?<\/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>Aucune, il y aura une erreur.<\/li>\n<\/ul>\n<p>\n<b class=\"spoiler_title\">R\u00e9ponse<\/b>Selon la documentation Oracle (cit\u00e9es depuis 8.1.6):<br \/>\nDans une seule instruction SQL, Oracle incr\u00e9mente la s\u00e9quence une seule fois par ligne. Si une instruction contient plus d'une r\u00e9f\u00e9rence \u00e0 NEXTVAL pour une s\u00e9quence, Oracle incr\u00e9mente la s\u00e9quence une fois et renvoie la m\u00eame valeur pour toutes les occurrences de NEXTVAL. Si une instruction contient des r\u00e9f\u00e9rences \u00e0 CURRVAL et NEXTVAL, Oracle incr\u00e9mente la s\u00e9quence et renvoie la m\u00eame valeur pour CURRVAL et NEXTVAL, peu importe leur ordre dans l'instruction.<\/p>\n<p>Ainsi, <b>la valeur maximale correspondra au nombre de lignes, soit 5.<\/b>.<\/p>\n<h3>Combien de lignes se trouveront dans la table \u00e0 la suite de l'ex\u00e9cution du script suivant?<\/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\">R\u00e9ponse<\/b>Selon la documentation Oracle (cit\u00e9es depuis 11.2):<\/p>\n<p>Avant d'ex\u00e9cuter une instruction SQL, Oracle marque un point de sauvegarde implicite (non accessible pour vous). Ensuite, si l'instruction \u00e9choue, Oracle revient automatiquement en arri\u00e8re et renvoie le code d'erreur applicable \u00e0 SQLCODE dans le SQLCA. Par exemple, si une instruction INSERT cause une erreur en essayant d'ins\u00e9rer une valeur dupliqu\u00e9e dans un index unique, l'instruction est annul\u00e9e.<\/p>\n<p>L'appel de la proc\u00e9dure stock\u00e9e depuis le client est \u00e9galement consid\u00e9r\u00e9 et trait\u00e9 comme une instruction unique. Ainsi, le premier appel est ex\u00e9cut\u00e9 avec succ\u00e8s, ins\u00e9rant trois enregistrements ; le deuxi\u00e8me appel \u00e9choue avec une erreur et annule le quatri\u00e8me enregistrement qu'il a r\u00e9ussi \u00e0 ins\u00e9rer ; le troisi\u00e8me appel \u00e9choue avec une erreur, <b>et la table contient donc trois enregistrements.<\/b>.<\/p>\n<h3>Combien de lignes se trouveront dans la table \u00e0 la suite de l'ex\u00e9cution du script suivant?<\/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\">R\u00e9ponse<\/b>Selon la documentation Oracle (cit\u00e9es depuis 11.2):<\/p>\n<p>Une contrainte de v\u00e9rification vous permet de sp\u00e9cifier une condition que chaque ligne de la table doit satisfaire. Pour satisfaire la contrainte, chaque ligne de la table doit rendre la condition soit VRAIE, soit inconnue (en raison d'un null). Lorsque Oracle \u00e9value une condition de contrainte de v\u00e9rification pour une ligne particuli\u00e8re, les noms de colonnes dans la condition font r\u00e9f\u00e9rence aux valeurs de colonne de cette ligne.<\/p>\n<p>Ainsi, la valeur null passera le contr\u00f4le, et le bloc anonyme s'ex\u00e9cutera avec succ\u00e8s jusqu'\u00e0 la tentative d'insertion de la valeur 3. Apr\u00e8s cela, le bloc de gestion des erreurs g\u00e9n\u00e9rera une exception, il n'y aura pas de retour en arri\u00e8re et <b>il restera quatre lignes dans la table<\/b> avec les valeurs 1, null, 2 et \u00e0 nouveau null.<\/p>\n<h3>Quelles paires de valeurs occuperont des volumes de place identiques dans le bloc ?<\/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', 'Vanya', 10, 10, 'D', 'Vanya');\n<\/code><\/pre>\n<p><\/p>\n<ul>\n<li>A et X<\/li>\n<li>B et Y<\/li>\n<li>C et K<\/li>\n<li>C et Z<\/li>\n<li>K et Z<\/li>\n<li>I et J<\/li>\n<li>J et X<\/li>\n<li>Tous les \u00e9num\u00e9r\u00e9s<\/li>\n<\/ul>\n<p>\n<b class=\"spoiler_title\">R\u00e9ponse<\/b>Donnons des extraits de la documentation (12.1.0.2) sur le stockage des diff\u00e9rents types de donn\u00e9es dans Oracle.<\/p>\n<p><b>TYPE DE DONN\u00c9ES CHAR<\/b><br \/>\nLe type de donn\u00e9es CHAR sp\u00e9cifie une cha\u00eene de caract\u00e8res de longueur fixe dans le jeu de caract\u00e8res de la base de donn\u00e9es. Vous sp\u00e9cifiez le jeu de caract\u00e8res de la base de donn\u00e9es lorsque vous cr\u00e9ez votre base de donn\u00e9es. Oracle garantit que toutes les valeurs stock\u00e9es dans une colonne CHAR ont la longueur sp\u00e9cifi\u00e9e par la taille dans la s\u00e9mantique de longueur choisie. Si vous ins\u00e9rez une valeur qui est plus courte que la longueur de la colonne, alors Oracle remplira la valeur avec des espaces jusqu'\u00e0 la longueur de la colonne.<\/p>\n<p><b>TYPE DE DONN\u00c9ES VARCHAR2<\/b><br \/>\nLe type de donn\u00e9es VARCHAR2 sp\u00e9cifie une cha\u00eene de caract\u00e8res de longueur variable dans le jeu de caract\u00e8res de la base de donn\u00e9es. Vous sp\u00e9cifiez le jeu de caract\u00e8res de la base de donn\u00e9es lorsque vous cr\u00e9ez votre base de donn\u00e9es. Oracle stocke une valeur de caract\u00e8re dans une colonne VARCHAR2 exactement comme vous l'avez sp\u00e9cifi\u00e9e, sans aucun remplissage, \u00e0 condition que la valeur ne d\u00e9passe pas la longueur de la colonne.<\/p>\n<p><b>TYPE DE DONN\u00c9ES NUMBER<\/b><br \/>\nLe type de donn\u00e9es NUMBER stocke z\u00e9ro ainsi que des nombres fixes positifs et n\u00e9gatifs avec des valeurs absolues allant de 1.0 x 10-130 \u00e0 mais n'incluant pas 1.0 x 10126. Si vous sp\u00e9cifiez une expression arithm\u00e9tique dont la valeur a une valeur absolue sup\u00e9rieure ou \u00e9gale \u00e0 1.0 x 10126, alors Oracle renvoie une erreur. Chaque valeur NUMBER n\u00e9cessite entre 1 et 22 octets. En tenant compte de cela, la taille de colonne en octets pour une valeur num\u00e9rique particuli\u00e8re NUMBER(p), o\u00f9 p est la pr\u00e9cision d'une valeur donn\u00e9e, peut \u00eatre calcul\u00e9e \u00e0 l'aide de la formule suivante : <i>ROUND((length(p)+s) \/ 2))+1<\/i> o\u00f9 s est \u00e9gal \u00e0 z\u00e9ro si le nombre est positif, et s est \u00e9gal \u00e0 1 si le nombre est n\u00e9gatif.<\/p>\n<p>De plus, prenons un extrait de la documentation concernant le stockage des valeurs Null.<\/p>\n<p>Un null est l'absence de valeur dans une colonne. Les Nulls indiquent des donn\u00e9es manquantes, inconnues ou non applicables. Les Nulls sont stock\u00e9s dans la base de donn\u00e9es s'ils se situent entre des colonnes avec des valeurs de donn\u00e9es. Dans ces cas, ils n\u00e9cessitent 1 octet pour stocker la longueur de la colonne (z\u00e9ro). Les nulls en fin de ligne ne n\u00e9cessitent aucun stockage car un nouvel en-t\u00eate de ligne signale que les colonnes restantes dans la ligne pr\u00e9c\u00e9dente sont null. Par exemple, si les trois derni\u00e8res colonnes d'une table sont nulles, alors aucune donn\u00e9e n'est stock\u00e9e pour ces colonnes.<\/p>\n<p>En nous basant sur ces donn\u00e9es, nous d\u00e9veloppons des raisonnements. Nous supposons que la base de donn\u00e9es utilise le codage AL32UTF8. Dans ce codage, les lettres russes occuperont 2 octets.<\/p>\n<p>1) A et X, la valeur du champ a &#8216;Y&#8217; occupe 1 octet, la valeur du champ x \u2018\u0414\u2019 \u2013 2 octets<br \/>\n2) B et Y, \u2018Vanya\u2019 dans b sera compl\u00e9t\u00e9 par des espaces jusqu'\u00e0 10 caract\u00e8res et occupera 14 octets, \u2018Vanya\u2019 dans d occupera 8 octets.<br \/>\n3) C et K. Les deux champs ont une valeur NULL, apr\u00e8s eux il y a des champs significatifs, donc ils occupent chacun 1 octet.<br \/>\n4) C et Z. Les deux champs ont une valeur NULL, mais le champ Z est le dernier dans la table, donc il n\u2019occupe pas de place (0 octet). Le champ C occupe 1 octet.<br \/>\n5) K et Z. Comme dans le cas pr\u00e9c\u00e9dent. La valeur dans le champ K occupe 1 octet, dans Z \u2013 0.<br \/>\n6) I et J. Selon la documentation, les deux valeurs prendront chacune 2 octets. La longueur est calcul\u00e9e selon la formule tir\u00e9e de la documentation : round( (1 + 0) \/ 2) + 1 = 1 + 1 = 2.<br \/>\n7) J et X. La valeur dans le champ J occupera 2 octets, la valeur dans le champ X occupera 2 octets.<\/p>\n<p><b>En tout, les options correctes sont : C et K, I et J, J et X.<\/b><\/p>\n<p><\/p>\n<h3>Quel sera environ le facteur de clustering de l'index T_I ?<\/h3>\n<p><\/p>\n<pre><code class=\"sql\">create table t (i integer);\n \ninsert into t select rownum from dual connect by level &lt;= 10000;\n \ncreate index t_i on t(i);\n<\/code><\/pre>\n<p><\/p>\n<ul>\n<li>De l'ordre de dizaines<\/li>\n<li>De l'ordre de centaines<\/li>\n<li>De l'ordre de milliers<\/li>\n<li>De l'ordre de dizaines de milliers<\/li>\n<\/ul>\n<p>\n<b class=\"spoiler_title\">R\u00e9ponse<\/b>Selon la documentation Oracle (cit\u00e9 de 12.1) :<\/p>\n<p>Pour un index B-arbre, le facteur de clustering de l'index mesure le regroupement physique des lignes par rapport \u00e0 une valeur d'index.<\/p>\n<p>Le facteur de clustering de l'index aide l'optimiseur \u00e0 d\u00e9cider si un scan d'index ou un scan complet de table est plus efficace pour certaines requ\u00eates). Un faible facteur de clustering indique un scan d'index efficace.<\/p>\n<p>Un facteur de clustering proche du nombre de blocs dans une table indique que les lignes sont physiquement ordonn\u00e9es dans les blocs de la table par la cl\u00e9 de l'index. Si la base de donn\u00e9es effectue un scan complet de la table, alors elle tend \u00e0 r\u00e9cup\u00e9rer les lignes telles qu'elles sont stock\u00e9es sur le disque tri\u00e9es par la cl\u00e9 de l'index. Un facteur de clustering proche du nombre de lignes indique que les lignes sont dispers\u00e9es de mani\u00e8re al\u00e9atoire \u00e0 travers les blocs de la base de donn\u00e9es par rapport \u00e0 la cl\u00e9 de l'index. Si la base de donn\u00e9es effectue un scan complet de la table, alors elle ne r\u00e9cup\u00e9rerait pas les lignes dans un ordre tri\u00e9 par cette cl\u00e9 d'index.<\/p>\n<p>Dans ce cas, les donn\u00e9es sont parfaitement tri\u00e9es, donc le facteur de clustering sera \u00e9gal ou proche du nombre de blocs occup\u00e9s dans la table. Pour une taille de bloc standard de 8 kilooctets, on peut s'attendre \u00e0 ce qu'un bloc contienne environ mille valeurs de type number \u00e9troites, donc le nombre de blocs, et en cons\u00e9quence le facteur de clustering sera <b>de l'ordre de dizaines<\/b>.<\/p>\n<h3>Pour quelles valeurs de N le script suivant s'ex\u00e9cutera-t-il avec succ\u00e8s dans une base de donn\u00e9es normale avec les param\u00e8tres par d\u00e9faut ?<\/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\">R\u00e9ponse<\/b>Selon la documentation Oracle (cit\u00e9es depuis 11.2):<\/p>\n<p>Limites logiques de la base de donn\u00e9es<\/p>\n<p><strong>Article<\/strong><br \/>\n<strong>Type de limite<\/strong><br \/>\n<strong>Valeur limite<\/strong><\/p>\n<p>Indexes<br \/>\nTaille totale de la colonne index\u00e9e<br \/>\n75 % de la taille du bloc de la base de donn\u00e9es moins certaines surcharges<\/p>\n<p>\nAinsi, la taille totale des colonnes index\u00e9es ne doit pas d\u00e9passer 6 Ko. Tout le reste d\u00e9pend de l'encodage choisi pour la base de donn\u00e9es. Pour l'encodage AL32UTF8, un caract\u00e8re peut occuper un maximum de 4 octets, donc dans 6 kilooctets, au pire des cas, il y a place pour environ 1500 caract\u00e8res. Par cons\u00e9quent, Oracle interdira la cr\u00e9ation d'un index lorsque N = 400 (lorsque la longueur de la cl\u00e9 dans le pire des cas sera de 1600 caract\u00e8res * 4 octets + la longueur du rowid), tandis que <b>pour N = 200 (et moins)<\/b> la cr\u00e9ation de l'index se fera sans probl\u00e8me.<\/p>\n<h3>L'instruction INSERT avec l'indice APPEND est destin\u00e9e \u00e0 charger des donn\u00e9es en mode direct. Que se passera-t-il si elle est appliqu\u00e9e \u00e0 une table sur laquelle un trigger est suspendu ?<\/h3>\n<p><\/p>\n<ul>\n<li>Les donn\u00e9es seront charg\u00e9es en mode direct, le trigger se d\u00e9clenchera comme pr\u00e9vu<\/li>\n<li>Les donn\u00e9es seront charg\u00e9es en mode direct, mais le trigger ne sera pas ex\u00e9cut\u00e9<\/li>\n<li>Les donn\u00e9es seront charg\u00e9es en mode conventionnel, le trigger se d\u00e9clenchera comme pr\u00e9vu<\/li>\n<li>Les donn\u00e9es seront charg\u00e9es en mode conventionnel, mais le trigger ne sera pas ex\u00e9cut\u00e9<\/li>\n<li>Les donn\u00e9es ne seront pas charg\u00e9es, une erreur sera enregistr\u00e9e<\/li>\n<\/ul>\n<p>\n<b class=\"spoiler_title\">R\u00e9ponse<\/b>En principe, c'est une question plus logique. Pour trouver la bonne r\u00e9ponse, je proposerais le mod\u00e8le de raisonnement suivant :<\/p>\n<ol>\n<li>L'insertion en mode direct se fait par la formation directe d'un bloc de donn\u00e9es, sans passer par le moteur SQL, ce qui assure une grande vitesse. Ainsi, il est tr\u00e8s difficile, voire impossible, d'assurer l'ex\u00e9cution du trigger, et cela n'a pas de sens, car cela ralentirait de toute fa\u00e7on l'insertion de mani\u00e8re radicale.<\/li>\n<li>Le non-ex\u00e9cution du trigger entra\u00eenera le fait qu'avec des donn\u00e9es identiques dans la table, l'\u00e9tat de la base dans son ensemble (d'autres tables) d\u00e9pendra du mode dans lequel ces donn\u00e9es ont \u00e9t\u00e9 ins\u00e9r\u00e9es. Cela d\u00e9truira manifestement l'int\u00e9grit\u00e9 des donn\u00e9es et ne peut pas \u00eatre utilis\u00e9 comme solution en production.<\/li>\n<li>L'impossibilit\u00e9 d'ex\u00e9cuter l'op\u00e9ration demand\u00e9e est g\u00e9n\u00e9ralement interpr\u00e9t\u00e9e comme une erreur. Mais il faut se rappeler que APPEND est un indice, et la logique g\u00e9n\u00e9rale des indices est qu'ils sont pris en compte si possible, sinon l'instruction s'ex\u00e9cute sans tenir compte de l'indice.<\/li>\n<\/ol>\n<p>\nAinsi, la r\u00e9ponse attendue est <b>les donn\u00e9es seront charg\u00e9es en mode normal (SQL), le trigger se d\u00e9clenchera.<\/b><\/p>\n<p>Selon la documentation d'Oracle (cit\u00e9e \u00e0 partir de 8.04) :<\/p>\n<p>Les violations des restrictions entra\u00eeneront l'ex\u00e9cution de l'instruction en s\u00e9rie, en utilisant le chemin d'insertion conventionnel, sans avertissements ni messages d'erreur. Une exception est la restriction sur les instructions acc\u00e9dant \u00e0 la m\u00eame table plus d'une fois dans une transaction, ce qui peut entra\u00eener des messages d'erreur.<br \/>\nPar exemple, si des d\u00e9clencheurs ou une int\u00e9grit\u00e9 r\u00e9f\u00e9rentielle sont pr\u00e9sents sur la table, l'indice APPEND sera ignor\u00e9 lorsque vous essayez d'utiliser l'INSERT de chargement direct (s\u00e9rie ou parall\u00e8le), ainsi que l'indice ou clause PARALLEL, le cas \u00e9ch\u00e9ant.<\/p>\n<h3>Que se passera-t-il lors de l'ex\u00e9cution du script suivant?<\/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>Ex\u00e9cution r\u00e9ussie<\/li>\n<li>\u00c9chec en raison d'une erreur de syntaxe<\/li>\n<li>Erreur li\u00e9e \u00e0 l'impossibilit\u00e9 de la transaction autonome<\/li>\n<li>Erreur li\u00e9e au d\u00e9passement de la profondeur d'appel maximale<\/li>\n<li>Erreur li\u00e9e \u00e0 la violation de la cl\u00e9 \u00e9trang\u00e8re<\/li>\n<li>Erreur li\u00e9e aux blocages<\/li>\n<\/ul>\n<p>\n<b class=\"spoiler_title\">R\u00e9ponse<\/b>La table et le d\u00e9clencheur sont cr\u00e9\u00e9s tout \u00e0 fait correctement et cette op\u00e9ration ne devrait pas poser de probl\u00e8mes. Les transactions autonomes dans le d\u00e9clencheur sont \u00e9galement autoris\u00e9es, sinon il serait impossible, par exemple, de faire du logging.<\/p>\n<p>Apr\u00e8s l'insertion de la premi\u00e8re ligne, l'activation r\u00e9ussie du d\u00e9clencheur entra\u00eenerait l'insertion d'une deuxi\u00e8me ligne, ce qui d\u00e9clencherait \u00e0 nouveau le d\u00e9clencheur, ins\u00e9rerait une troisi\u00e8me ligne, et ainsi de suite jusqu'\u00e0 ce que l'instruction \u00e9choue en raison du d\u00e9passement de la profondeur d'appel maximale. Cependant, il y a un autre point d\u00e9licat. Au moment de l'ex\u00e9cution du d\u00e9clencheur pour la premi\u00e8re ligne ins\u00e9r\u00e9e, le commit n'a pas encore \u00e9t\u00e9 effectu\u00e9. Par cons\u00e9quent, le d\u00e9clencheur fonctionnant dans une transaction autonome tente d'ins\u00e9rer dans la table une ligne se r\u00e9f\u00e9rant par cl\u00e9 \u00e9trang\u00e8re \u00e0 un enregistrement encore non engag\u00e9. Cela entra\u00eene un blocage (la transaction autonome attend le commit principal pour savoir si elle peut ins\u00e9rer des donn\u00e9es) et en m\u00eame temps, la transaction principale attend le commit autonome pour continuer apr\u00e8s le d\u00e9clencheur. <b>Un deadlock se produit et par cons\u00e9quent, la transaction autonome est annul\u00e9e en raison de probl\u00e8mes li\u00e9s aux blocages.<\/b>.<\/p>\n<p class=\"for_users_only_msg\">Seuls les utilisateurs enregistr\u00e9s peuvent participer au sondage. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Connectez-vous<\/a><\/noindex>, s'il vous pla\u00eet.<\/p>\n<h2 class=\"default-block__polling-title\">C'\u00e9tait compliqu\u00e9?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Comme deux doigts dans le nez, j'ai r\u00e9solu tout correctement.<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Pas vraiment, je me suis tromp\u00e9 sur quelques questions.<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    J'ai r\u00e9solu la moiti\u00e9 correctement.<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    J'ai devin\u00e9 la r\u00e9ponse deux fois!<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    J'\u00e9crirai dans les commentaires<\/p>\n<\/li>\n<\/ul>\n<p>    14 utilisateurs ont vot\u00e9. 10 utilisateurs se sont abstenus.<br \/>\n<br \/>Source : <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.2 - 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\/fr\/blog\/administrirovanie\/po-sledam-highload-siberia-2019-8-zadach-po-oracle\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\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\/fr\/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\udd47\u00c0 la suite de Highload++ Siberia 2019 \u2014 8 t\u00e2ches sur Oracle | ProHoster","description":"Bonjour! La conf\u00e9rence Highload++ Siberia 2019 a eu lieu \u00e0 Novossibirsk les 24 et 25 juin.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/po-sledam-highload-siberia-2019-8-zadach-po-oracle","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","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\/fr\/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\/fr\/wp-json\/wp\/v2\/posts\/36171","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=36171"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/36171\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/27053"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=36171"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=36171"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=36171"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}