{"id":3940,"date":"2013-04-03T15:59:42","date_gmt":"2013-04-03T14:59:42","guid":{"rendered":"http:\/\/blog.capdata.fr\/?p=3940"},"modified":"2019-09-13T14:09:18","modified_gmt":"2019-09-13T13:09:18","slug":"oracle-et-sql-server-loptimizer","status":"publish","type":"post","link":"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-loptimizer\/","title":{"rendered":"Oracle et SQL Server: L&#8217;optimizer"},"content":{"rendered":"<a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-twitter nolightbox\" data-provider=\"twitter\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Twitter\" href=\"https:\/\/twitter.com\/intent\/tweet?url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F3940&#038;text=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"twitter\" title=\"Share on Twitter\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/twitter.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-linkedin nolightbox\" data-provider=\"linkedin\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Linkedin\" href=\"https:\/\/www.linkedin.com\/shareArticle?mini=true&#038;url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F3940&#038;title=Oracle%20et%20SQL%20Server%3A%20L%E2%80%99optimizer\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"linkedin\" title=\"Share on Linkedin\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/linkedin.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-mail nolightbox\" data-provider=\"mail\" rel=\"nofollow\" title=\"Share by email\" href=\"mailto:?subject=Oracle%20et%20SQL%20Server%3A%20L%E2%80%99optimizer&#038;body=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20:%20https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F3940\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"mail\" title=\"Share by email\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/mail.png\" \/><\/a><p>Lorsqu&#8217;une requ\u00eate est soumise au moteur de base de donn\u00e9es, celui-ci doit g\u00e9n\u00e9rer un plan d&#8217;ex\u00e9cution avant d&#8217;ex\u00e9cuter la requ\u00eate.<\/p>\n<p>L&#8217;organe en charge de la cr\u00e9ation du plan d&#8217;ex\u00e9cution est l&#8217;Optimizer. Son fonctionnement est globalement similaire pour Oracle et SQL Server, mais quelques\u00a0diff\u00e9rences\u00a0significatives existent. Voici les similitudes et les principales diff\u00e9rences dans les grandes lignes (je me suis efforc\u00e9 de pointer vers des compl\u00e9ments d&#8217;informations lorsque cela \u00e9tait possible).<\/p>\n<p>&nbsp;<\/p>\n<h2>Cost Based Optimizer<\/h2>\n<p>L&#8217;optimizer suit le m\u00eame mode de fonctionnement pour les deux moteurs: le plan d&#8217;ex\u00e9cution est choisi selon une notion de co\u00fbt (on parle de Cost Based Optimizer ou CBO).<\/p>\n<p>&nbsp;<\/p>\n<h2>Etapes de compilation<\/h2>\n<p><strong><em>Partie commune<\/em><\/strong><\/p>\n<p>Sans trop de surprise, les \u00e9tapes de l&#8217;ex\u00e9cution d&#8217;une requ\u00eate \u00a0sont dans l&#8217;ensemble les m\u00eames.<\/p>\n<ol>\n<li>Validation syntaxique<\/li>\n<li>Validation s\u00e9mantique<\/li>\n<li>Utilisation \u00e9ventuelle d&#8217;un plan pr\u00e9c\u00e9demment produit<\/li>\n<li>R\u00e9\u00e9criture\/Simplification de la requ\u00eate<\/li>\n<li>Exploration des chemins d&#8217;acc\u00e8s et estimation des co\u00fbts.<\/li>\n<li>D\u00e9signation du chemin le moins co\u00fbteux, g\u00e9n\u00e9ration du plan d&#8217;ex\u00e9cution et mise en cache de ce dernier.<\/li>\n<\/ol>\n<p><strong><em>Sp\u00e9cificit\u00e9s SQL Server<\/em><\/strong><\/p>\n<p>Le co\u00fbt associ\u00e9 \u00e0 chaque chemin d&#8217;acc\u00e8s ne prend pas en compte la consommation CPU (celle-ci est tout de m\u00eame indirectement prise en compte dans le co\u00fbt des diff\u00e9rents op\u00e9rations physiques, notamment les tris et les jointures physiques).<\/p>\n<p>Pour g\u00e9rer la compilation simultan\u00e9e d&#8217;un grand nombre de requ\u00eates, \u00a0le m\u00e9canisme de Compilation Gateways est impl\u00e9ment\u00e9:<\/p>\n<ul>\n<li>Une &#8220;petite&#8221; requ\u00eate (requ\u00eate dont le plan d&#8217;ex\u00e9cution occupe peu d&#8217;espace en m\u00e9moire) est compil\u00e9e dans la Small Gateway. Le nombre de compilations simultan\u00e9es dans cette Gateway est de 4x&lt;nombre de CPUs logiques vus par l&#8217;instance SQL Server.<\/li>\n<li>Une requ\u00eate &#8220;moyenne&#8221; (requ\u00eate dont le plan d&#8217;ex\u00e9cution occupe plus d&#8217;espace m\u00e9moire) peut continuer sa compilation dans la Medium Gateway. Celle-ci peut h\u00e9berger jusqu&#8217;\u00e0 &lt;nombre de CPUs logiques vus par l&#8217;instance SQL Server&gt; compilations simultan\u00e9es<\/li>\n<li>Une requ\u00eate &#8220;grande&#8221; peut terminer sa compilation dans la Large Gateway. dans celle-ci, une unique requ\u00eate peut \u00eatre compil\u00e9e \u00e0 la fois.<\/li>\n<\/ul>\n<p>Les seuils d&#8217;utilisation de la m\u00e9moire pour le passage entre Small vers Medium et Medium vers Large ne sont pas fixes, et d\u00e9pendent grosso modo du rapport &lt;M\u00e9moire allou\u00e9e \u00e0 l&#8217;instance&gt; \/ &lt;Nombre de CPUs logiques vus par l&#8217;instance&gt;.<\/p>\n<p>Un article assez complet sur le sujet peut \u00eatre lu ici:\u00a0<a href=\"http:\/\/blogs.msdn.com\/b\/support_sql_france\/archive\/2012\/02\/07\/sql-server-compilation-gateways-and-resource-semaphore-query-compile.aspx\" target=\"_blank\" rel=\"noopener noreferrer\">Compilation Gateways<\/a><\/p>\n<p>Afin d&#8217;\u00e9viter de stocker en m\u00e9moire des plans d&#8217;ex\u00e9cution qui ne seront pas r\u00e9utilis\u00e9s (cas de requ\u00eates g\u00e9n\u00e9r\u00e9es \u00e0 la vol\u00e9e), un param\u00e8tre de configuration peut \u00eatre positionn\u00e9: <a title=\"Optimize for Adhoc Workload\" href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/cc645587.aspx\" target=\"_blank\" rel=\"noopener noreferrer\">&#8220;Optimize for AdHoc Workload&#8221;\u00a0<\/a>. Seuls les plans correspondant aux requ\u00eates appel\u00e9es au moins deux fois seront remont\u00e9s en m\u00e9moire.<\/p>\n<p><em><strong>Sp\u00e9cificit\u00e9s Oracle<\/strong><\/em><\/p>\n<p>La m\u00e9moire utilis\u00e9e pour la compilation d&#8217;une requ\u00eate (on parle de curseur ou de Private SQL Area) est dans la zone priv\u00e9e de chaque session (PGA).<\/p>\n<p>Le calcul du co\u00fbt prend en compte la consommation CPU et sait exploiter les <a href=\"http:\/\/docs.oracle.com\/cd\/B28359_01\/server.111\/b28274\/stats.htm#i41496\" target=\"_blank\" rel=\"noopener noreferrer\">Statistiques Syst\u00e8me<\/a> (cadence CPU, dur\u00e9e moyenne d&#8217;une lecture al\u00e9atoire\/s\u00e9quentielle, &#8230;) qui peuvent \u00eatre collect\u00e9es sur l&#8217;instance.<\/p>\n<p>&nbsp;<\/p>\n<h2>Les principaux types d&#8217;op\u00e9rations physiques<\/h2>\n<p><em><strong>Partie commune<\/strong><\/em><\/p>\n<p>Ici encore, un grand nombre d&#8217;op\u00e9rations physiques sont communes, m\u00eame si le nom de l&#8217;op\u00e9ration diff\u00e8re:<\/p>\n<table width=\"601\" border=\"1\" cellspacing=\"0\" cellpadding=\"0\">\n<colgroup>\n<col width=\"228\" \/>\n<col width=\"131\" \/>\n<col width=\"242\" \/> <\/colgroup>\n<tbody>\n<tr>\n<td width=\"228\" height=\"20\">Op\u00e9ration<\/td>\n<td width=\"131\">SQL Server<\/td>\n<td width=\"242\">Oracle<\/td>\n<\/tr>\n<tr>\n<td height=\"20\">Balayage d&#8217;une table<\/td>\n<td>Table Scan<\/td>\n<td>Table Access Full<\/td>\n<\/tr>\n<tr>\n<td height=\"20\">Balayage des feuilles d&#8217;un Indexe<\/td>\n<td>Index Scan<\/td>\n<td>Full Index Scan et Fast Full Index Scan<\/td>\n<\/tr>\n<tr>\n<td height=\"20\">Recherche dans un indexe<\/td>\n<td>Index Seek<\/td>\n<td>Index Range Scan<\/td>\n<\/tr>\n<tr>\n<td height=\"20\">Acc\u00e8s \u00e0 une table depuis un indexe<\/td>\n<td>Bookmark Lookup<\/td>\n<td>Table Access By Index Rowid<\/td>\n<\/tr>\n<tr>\n<td height=\"20\">Jointure de type Fusion<\/td>\n<td>Merge Join<\/td>\n<td>Sort Merge Join<\/td>\n<\/tr>\n<tr>\n<td height=\"20\">Jointure d&#8217;exclusion<\/td>\n<td>Anti-Semi Join<\/td>\n<td>Anti Join<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Les deux autres jointures physiques (Nested Loop Join et \u00a0Hash Join) sont les m\u00eames, ainsi que les trois jointures partielles ( Semi Join).<\/p>\n<p><strong><em>Sp\u00e9cificit\u00e9s SQL Server<\/em><\/strong><\/p>\n<p>Le concept de l&#8217;indexe Clusteris\u00e9 (index pour lequel les feuilles sont en fait les donn\u00e9es de la table, correspondant au concept d&#8217;Index Organized Table d&#8217;Oracle) et sa g\u00e9n\u00e9ralisation (par d\u00e9faut, une cl\u00e9 primaire sous SQL Server est g\u00e9r\u00e9e par un indexe Clusteris\u00e9) am\u00e8nent \u00e0 la mise \u00e0 disposition de deux op\u00e9rateurs:<\/p>\n<ul>\n<li>Clustererd Index Seek<\/li>\n<li>Clustered Index Scan (qui correspond par d\u00e9finition au Table Scan pour toute table avec un indexe Clusteris\u00e9)<\/li>\n<\/ul>\n<p><em><strong>Sp\u00e9cificit\u00e9s Oracle<\/strong><\/em><\/p>\n<p>Un plus grand nombre d&#8217;op\u00e9rations physiques sont disponibles avec l&#8217;optimizer d&#8217;Oracle. \u00a0Les plus souvent rencontr\u00e9es sont:<\/p>\n<ul>\n<li>INDEX SKIP SCAN. Correspond \u00e0 une recherche dichotomique dans un indexe en ignorant la premi\u00e8re colonne de l&#8217;indexe<\/li>\n<li>BITMAP MINUS, BITMAP OR, BITMAP INDEX VALUE. \u00a0Correspond \u00e0 l&#8217;utilisation d&#8217;indexes de type BITMAP<\/li>\n<li>UNIQUE INDEX SCAN. Oracle distingue la recherche dans un indexe non unique de celle dans un indexe unique<\/li>\n<li>CARTESIAN JOIN. Oracle utilise cet op\u00e9rateur pour r\u00e9soudre une jointure crois\u00e9e (SQL Server se contente d&#8217;un Nested Loop)<\/li>\n<\/ul>\n<h2>Gestion du parall\u00e9lisme<\/h2>\n<p><em><strong>Partie commune<\/strong><\/em><\/p>\n<p>Les types d&#8217;op\u00e9rations parall\u00e8les (disponibles par d\u00e9faut) sont les m\u00eames sur les deux moteurs:<\/p>\n<ul>\n<li>Parall\u00e9lisation d&#8217;un balayage de table (partitionn\u00e9e ou non) ou d&#8217;indexe<\/li>\n<li>Parall\u00e9lisation d&#8217;op\u00e9rations (typiquement des scans pr\u00e9c\u00e9dant une jointure)<\/li>\n<li>Parall\u00e9lisation de jointures<\/li>\n<\/ul>\n<p>Mais l&#8217;utilisation du parall\u00e9lisme par l&#8217;Otmizer est fondalement diff\u00e9rente.<\/p>\n<p><em><strong>SQL Server propose par d\u00e9faut le parall\u00e9lisme<\/strong><\/em>. Une requ\u00eate pourra \u00eatre parall\u00e9lis\u00e9e en autant de processus esclaves que de CPUs logiques vus par l&#8217;instance. Ceci est conditionn\u00e9 par le param\u00e8tre de configuration Max Degree Of Parallelism qui vaut 0 par d\u00e9faut. Pour d\u00e9sactiver le parall\u00e9lisme, il faut passer ce param\u00e8tre \u00e0 1.<\/p>\n<p>Une requ\u00eate sera candidate au parall\u00e9lisme d\u00e8s que sa dur\u00e9e d&#8217;ex\u00e9cution\u00a0exc\u00e9dera 5 secondes. Ceci correspond \u00e0 la valeur du param\u00e8tre de configuration Cost Threshold for Parallelism.<\/p>\n<p>&nbsp;<\/p>\n<p><em><strong>Oracle ne permet pas par d\u00e9faut\u00a0l\u2019utilisation\u00a0de parall\u00e9lisme dans une requ\u00eate<\/strong><\/em>. Pour qu&#8217;une requ\u00eate puisse b\u00e9n\u00e9ficier du parall\u00e9lisme, il faut que la directive PARALLEL soit explicitement utilis\u00e9e dans la requ\u00eate, OU qu&#8217;une des tables (ou indexes) de la requ\u00eate soit d\u00e9clar\u00e9e comme acceptant le parall\u00e9lisme (clause PARALLEL de CREATE TABLE et ALTER TABLE). Dans ce cas, le\u00a0degr\u00e9\u00a0de parall\u00e9lisme est la valeur la plus faible parmi La directive PARALLEL, la clause PARALLEL de l&#8217;objet, et le produit\u00a0PARALLEL_THREADS_PER_CPU x CPU_COUNT (typiquement 2 fois le nombre de CPUs logiques de la machine h\u00e9bergeant l&#8217;instance Oracle).<\/p>\n<p>&nbsp;<\/p>\n<p><strong><em>Sp\u00e9cificit\u00e9 Oracle<\/em><\/strong><\/p>\n<p>Oracle permet la parall\u00e9lisation d&#8217;ordres de modification (INSERT &#8230; SELECT, UPDATE, DELETE et MERGE), principalement sur des tables partitionn\u00e9es. Ce m\u00e9canisme peut \u00eatre activ\u00e9 via ALTER SESSION ENABLE PARALLEL DML<\/p>\n<h2>Enrichissement des statistiques<\/h2>\n<p>Lorsque l&#8217;optimizer estime qu&#8217;il ne dispose pas de statistique pour une requ\u00eate pr\u00e9cise, il est capable d&#8217;en collecter \u00e0 la vol\u00e9e. Ce m\u00e9canisme est effectif par d\u00e9faut, et est g\u00e9r\u00e9 comme suit:<\/p>\n<p><em><strong>Oracle Optimizer Dynamic Sampling<\/strong><\/em>. Le param\u00e8tre <a href=\"http:\/\/docs.oracle.com\/cd\/E11882_01\/server.112\/e16638\/stats.htm#CHDHAFBJ\">OPTIMIZER_DYNAMIC_SAMPLING<\/a> d\u00e9finit le niveau d&#8217;utilisation du m\u00e9canisme de collecte. Ce m\u00e9canisme peut collecter des statistiques sur une table, une colonne, ainsi qu&#8217;une statistique \u00e9tendue (statistique sur une requ\u00eate, ou sur un ensemble de colonnes).<\/p>\n<p><em><strong>SQL Server Auto Create Statistics<\/strong><\/em>. Cette option de base, positionn\u00e9e \u00e0 Vraie par d\u00e9faut, permet au moteur de collecter automatiquement une statistique sur une ou plusieurs colonnes lorsqu&#8217;une telle statistique est manquante. Il ne permet pas de collecter de statistique filtr\u00e9e.<\/p>\n<h2>R\u00e9utilisation d&#8217;un plan<\/h2>\n<p>&nbsp;<\/p>\n<p><strong><em>Partie commune<\/em><\/strong><\/p>\n<p>L&#8217;utilisation d&#8217;un plan pr\u00e9c\u00e9demment g\u00e9n\u00e9r\u00e9 est globalement la m\u00eame.<\/p>\n<p>&nbsp;<\/p>\n<p><em><strong>Oracle CURSOR_SHARING<\/strong><\/em>. Ce param\u00e8tre d\u00e9finit la similitude que doivent avoir deux requ\u00eates pour pouvoir b\u00e9n\u00e9ficier du m\u00eame plan d&#8217;ex\u00e9cution. Il prend trois valeurs:<\/p>\n<ul>\n<li>EXACT (valeur par d\u00e9faut). Une requ\u00eate n&#8217;utilisera un plan g\u00e9n\u00e9r\u00e9 que si celui-ci correspond exactement au texte de la requ\u00eate. <span style=\"text-decoration: underline;\"><em>&#8220;SELECT * FROM EMPLOYEES WHERE EMP_ID = 5&#8221;<\/em><\/span> et\u00a0<span style=\"text-decoration: underline;\"><em>&#8220;SELECT * FROM EMPLOYEES WHERE EMP_ID = 6&#8221;<\/em><\/span> ne partageront donc pas leur plan.<\/li>\n<li>SIMILAR. Deux requ\u00eates partageront le m\u00eame plan d&#8217;ex\u00e9cution si elles sont similaires et que les cardinalit\u00e9s des valeurs utilis\u00e9es sont proches.\u00a0<span style=\"text-decoration: underline;\"><em>&#8220;SELECT * FROM EMPLOYEES WHERE EMP_ID = 5&#8221;<\/em><\/span> et\u00a0<span style=\"text-decoration: underline;\"><em>&#8220;SELECT * FROM EMPLOYEES WHERE EMP_ID = 6&#8221;<\/em><\/span> partageront le m\u00eame plan si le nombre de lignes correspondant \u00e0 EMP_ID=5 est du m\u00eame ordre de grandeur que celui des lignes correspondant \u00e0 EMP_ID=6.<\/li>\n<li>FORCE. Deux requ\u00eates partageront le m\u00eame plan d&#8217;ex\u00e9cution si elles sont similaires, en ignorant toutes les \u00a0valeurs directes.\u00a0<span style=\"text-decoration: underline;\"><em>&#8220;SELECT * FROM EMPLOYEES WHERE EMP_ID = 5&#8221;<\/em><\/span> et\u00a0<span style=\"text-decoration: underline;\"><em>&#8220;SELECT * FROM EMPLOYEES WHERE EMP_ID = 6&#8221;<\/em><\/span> \u00a0partageront donc leur plan, qui correspondra \u00e0\u00a0<span style=\"text-decoration: underline;\"><em>&#8220;SELECT * FROM EMPLOYEES WHERE EMP_ID = :1&#8221;<\/em><\/span><\/li>\n<\/ul>\n<p>SQL Server PARAMETRIZATION. Cette option d&#8217;une base SQL Server va r\u00e9gir la r\u00e9utilisation des plans. Il peut prendre deux valeurs<\/p>\n<ul>\n<li>SIMPLE (valeur par d\u00e9faut). Seules les requ\u00eates simples pourront partager le m\u00eame plan d&#8217;ex\u00e9cution. Une requ\u00eate simple est une requ\u00eate ne contenant pas de jointure, pas\u00a0d\u2019agr\u00e9gat, et pour laquelle les \u00e9ventuels pr\u00e9dicats ne concernent que des colonnes uniques.<span style=\"text-decoration: underline;\"><em>\u00a0&#8220;SELECT * FROM EMPLOYEES WHERE EMP_ID = 5&#8221;<\/em><\/span> et\u00a0<span style=\"text-decoration: underline;\"><em>&#8220;SELECT * FROM EMPLOYEES WHERE EMP_ID = 6&#8221;<\/em><\/span> partageront leur plan si EMP_ID est une colonne unique.<\/li>\n<li>FORCE. Lors de l&#8217;ex\u00e9cution d&#8217;une requ\u00eate, tout pr\u00e9dicat utilisant une valeur directe est r\u00e9\u00e9crit en utilisant une variable. Les requ\u00eates<span style=\"text-decoration: underline;\"><em>\u00a0&#8220;SELECT * FROM EMPLOYEES E INNER JOIN COMPANIES C ON C.COMP_ID = E.CMP_ID WHERE EMP_SALARY &gt;10 \u00a0AND C.COMP_NAME=&#8217;CAPDATA&#8217; &#8220;<\/em><\/span> et<span style=\"text-decoration: underline;\"><em>\u00a0&#8220;SELECT * FROM EMPLOYEES E INNER JOIN COMPANIES C ON C.COMP_ID = E.CMP_ID WHERE EMP_SALARY &gt;50 \u00a0AND C.COMP_NAME=&#8217;OSMOZIUM&#8217; &#8220;<\/em> <\/span>utiliseront le m\u00eame plan, qui correspondra \u00e0\u00a0<span style=\"text-decoration: underline;\"><em>&#8220;SELECT * FROM EMPLOYEES E INNER JOIN COMPANIES C ON C.COMP_ID = E.CMP_ID WHERE EMP_SALARY &gt;@1 \u00a0AND C.COMP_NAME=@2&#8221;<\/em><\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p><em><strong>Sp\u00e9cificit\u00e9 Oracle<\/strong><\/em><\/p>\n<p>Pour r\u00e9soudre le (grand) probl\u00e8me du &#8220;Bind Variable Peeking&#8221;, Oracle propose (depuis la version 11gR1) le m\u00e9canisme <a title=\"Adaptive Cursor Sharing\" href=\"http:\/\/docs.oracle.com\/cd\/E11882_01\/server.112\/e16638\/optimops.htm#autoId7\" target=\"_blank\" rel=\"noopener noreferrer\">Adaptive Cursor Sharing<\/a>.<\/p>\n<p>Ce m\u00e9canisme permettra l&#8217;existence de plusieurs plans d&#8217;ex\u00e9cution pour une requ\u00eate contenant des variables (qu&#8217;elles aient \u00e9t\u00e9 explicitement utilis\u00e9es dans le texte de la requ\u00eate ou qu&#8217;elles aient \u00e9t\u00e9 cr\u00e9\u00e9es par le Cursor_Sharing). \u00a0Concr\u00e8tement, lors du calcul d&#8217;un plan, Oracle sait si ce plan est candidat \u00e0 l&#8217;utilisation du Adaptive Cursor sharing (on parle alors de Bind-Aware Cursor, et on conna\u00eet cette information via la colonne IS_SHAREABLE de la vue V$SQL). Si c&#8217;est le cas, il compare r\u00e9guli\u00e8rement les statistiques estim\u00e9es lors du calcul du plan avec celles correspondant aux diff\u00e9rentes ex\u00e9cutions, et peut d\u00e9cider de g\u00e9n\u00e9rer un nouveau plan quand ces statistiques estim\u00e9es et r\u00e9elles sont trop diff\u00e9rentes.<\/p>\n<p>&nbsp;<\/p>\n<p><em><strong>Sp\u00e9cificit\u00e9 SQL Server<\/strong><\/em><\/p>\n<p>SQL Server propose un autre m\u00e9canisme pour ce m\u00eame probl\u00e8me de Bind Variable Peeking: la directive <a title=\"Optimize For\" href=\"http:\/\/msdn.microsoft.com\/fr-fr\/library\/ms181714.aspx\" target=\"_blank\" rel=\"noopener noreferrer\">Optimize For<\/a>.<\/p>\n<p>L&#8217;id\u00e9e ici est de sp\u00e9cifier dans la requ\u00eate la valeur des variables pour laquelle le plan doit \u00eatre optimis\u00e9.<\/p>\n<p>&nbsp;<\/p>\n<h2>Affichage d&#8217;un plan<\/h2>\n<p>Il est possible d&#8217;afficher le plan d&#8217;ex\u00e9cution estim\u00e9 par le moteur, et celui existant en m\u00e9moire pour une requ\u00eate donn\u00e9e:<\/p>\n<p><em><strong>Oracle: Explain Plan et Display Cursor<\/strong><\/em>. L&#8217;ordre EXPLAIN PLAN FOR &lt;ordre SQL&gt; permet d&#8217;afficher le plan d&#8217;ex\u00e9cution. Un pr\u00e9requis \u00e0 l&#8217;utilisation de cet ordre est la cr\u00e9ation de la table PLAN_TABLE via le script @?\/rdbms\/admin\/utlxplan.sql. La proc\u00e9dure DBMS_XPLAN.DISPLAY_CURSOR permet de conna\u00eetre le plan d&#8217;ex\u00e9cution en m\u00e9moire pour une requ\u00eate donn\u00e9e (identifi\u00e9e par son identifiant SQL_ID).<\/p>\n<p><strong><em>SQL Server: SET SHOWPLAN_XML ON et sys.dm_exec_cached_plan<\/em><\/strong>. L&#8217;utilisation de l&#8217;option SET SHOWPLAN_XML ON permet, au lieu d&#8217;ex\u00e9cuter une requ\u00eate, d&#8217;afficher son plan d&#8217;ex\u00e9cution au format XML (le plan au format XML est interpr\u00e9t\u00e9 nativement par SQL Server Management Studio et offre une vue ergonomique du plan). La fonction sys.dm_exec_query_plan permet de conna\u00eetre le plan d&#8217;ex\u00e9cution en m\u00e9moire pour une requ\u00eate donn\u00e9e (au format XML).<\/p>\n<p>A noter que l&#8217;affichage du plan au format texte est disponible via l&#8217;option SET SHOWPLAN_TEXT et la fonction sys.dm_exec_text_query_plan.<\/p>\n<h2>Influencer un plan d&#8217;ex\u00e9cution<\/h2>\n<p><strong><em>Partie commune<\/em><\/strong><\/p>\n<p>Les deux moteurs proposent divers m\u00e9canismes pour prendre la main, partiellement ou totalement, sur le plan d&#8217;ex\u00e9cution d&#8217;une requ\u00eate donn\u00e9e:<\/p>\n<p>Les directives (Hints) d&#8217;une requ\u00eate fonctionnent de fa\u00e7on similaire sur les deux moteurs (<strong> \/*+ &lt;directives&gt; *\/<\/strong> sur Oracle et <strong>OPTION( &lt;directives&gt;)<\/strong> sur SQL Server). Une directive peut porter sur l&#8217;utilisation:<\/p>\n<ul>\n<li>D&#8217;un indexe<\/li>\n<li>D&#8217;une jointure physique particuli\u00e8re<\/li>\n<li>Du parall\u00e9lisme<\/li>\n<li>De l&#8217;ordre sp\u00e9cifique des op\u00e9rations<\/li>\n<\/ul>\n<p>Ces m\u00eames directives peuvent \u00eatre sp\u00e9cifi\u00e9es a posteriori pour une requ\u00eate (allant jusqu&#8217;\u00e0 la sp\u00e9cification compl\u00e8te du plan). Pour Oracle, c&#8217;est le m\u00e9canisme des <a title=\"Stored Outlines\" href=\"http:\/\/docs.oracle.com\/cd\/E25178_01\/server.1111\/e16638\/outlines.htm\" target=\"_blank\" rel=\"noopener noreferrer\">Stored Outlines<\/a> qui offre cette fonctionnalit\u00e9. Pour SQL Server, le m\u00e9canisme est celui du <a title=\"Plan Guide\" href=\"http:\/\/technet.microsoft.com\/en-us\/library\/ms190417.aspx\" target=\"_blank\" rel=\"noopener noreferrer\">Plan Guide<\/a>.<\/p>\n<p>Le concept de mat\u00e9rialisation de requ\u00eates est disponible dans l&#8217;\u00e9dition Enterprise des deux moteurs. Oracle sait reconna\u00eetre une <a title=\"Vue Mat\u00e9rialis\u00e9e\" href=\"http:\/\/docs.oracle.com\/cd\/E11882_01\/server.112\/e17118\/statements_6002.htm\" target=\"_blank\" rel=\"noopener noreferrer\">Vue Mat\u00e9rialis\u00e9e<\/a>\u00a0dans une requ\u00eate et l&#8217;utiliser pour am\u00e9liorer les performances, tant que celle ci est valide (c-\u00e0-d tant que les donn\u00e9es des tables sous-jacentes n&#8217;ont pas \u00e9t\u00e9 modifi\u00e9es depuis le dernier rafra\u00eechissement de la vue mat\u00e9rialis\u00e9e). SQL Server sait reconna\u00eetre une <a title=\"Vue Index\u00e9e\" href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/dd171921(v=sql.100).aspx\" target=\"_blank\" rel=\"noopener noreferrer\">Vue Index\u00e9e<\/a>\u00a0dans une requ\u00eate et l&#8217;utiliser. Une vue index\u00e9e est automatiquement mise \u00e0 jour lors de la mise \u00e0 jour d&#8217;une table sous-jacente.<\/p>\n<p>&nbsp;<\/p>\n<p><em><strong>Sp\u00e9cificit\u00e9 Oracle<\/strong><\/em><\/p>\n<p>Un certain nombre de param\u00e8tres d&#8217;initialisation permettent d&#8217;influencer globalement le fonctionnement de l&#8217;Optimizer.<\/p>\n<p>La liste et la description de ces param\u00e8tres est disponible <a title=\"Param\u00e8tres d'initialisation sur l'Optimizer\" href=\"http:\/\/docs.oracle.com\/cd\/E11882_01\/server.112\/e16638\/optimops.htm#CIHJCJBB\" target=\"_blank\" rel=\"noopener noreferrer\">ici (pour la version 11gR2)<\/a>.<\/p>\n<p>&nbsp;<\/p>\n<a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-twitter nolightbox\" data-provider=\"twitter\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Twitter\" href=\"https:\/\/twitter.com\/intent\/tweet?url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F3940&#038;text=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"twitter\" title=\"Share on Twitter\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/twitter.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-linkedin nolightbox\" data-provider=\"linkedin\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Linkedin\" href=\"https:\/\/www.linkedin.com\/shareArticle?mini=true&#038;url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F3940&#038;title=Oracle%20et%20SQL%20Server%3A%20L%E2%80%99optimizer\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"linkedin\" title=\"Share on Linkedin\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/linkedin.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-mail nolightbox\" data-provider=\"mail\" rel=\"nofollow\" title=\"Share by email\" href=\"mailto:?subject=Oracle%20et%20SQL%20Server%3A%20L%E2%80%99optimizer&#038;body=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20:%20https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F3940\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"mail\" title=\"Share by email\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/mail.png\" \/><\/a>","protected":false},"excerpt":{"rendered":"<p>Lorsqu&#8217;une requ\u00eate est soumise au moteur de base de donn\u00e9es, celui-ci doit g\u00e9n\u00e9rer un plan d&#8217;ex\u00e9cution avant d&#8217;ex\u00e9cuter la requ\u00eate. L&#8217;organe en charge de la cr\u00e9ation du plan d&#8217;ex\u00e9cution est l&#8217;Optimizer. Son fonctionnement est globalement similaire pour Oracle et SQL&hellip; <a href=\"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-loptimizer\/\" class=\"more-link\">Continuer la lecture <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":14,"featured_media":7866,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,5],"tags":[229,38,231,230,232,221],"class_list":["post-3940","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-oracle","category-sqlserver","tag-cbo","tag-internals","tag-jointure","tag-optimizer","tag-parallelisme","tag-performance"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Oracle et SQL Server: L&#039;optimizer - Capdata TECH BLOG<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-loptimizer\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Oracle et SQL Server: L&#039;optimizer - Capdata TECH BLOG\" \/>\n<meta property=\"og:description\" content=\"Lorsqu&#8217;une requ\u00eate est soumise au moteur de base de donn\u00e9es, celui-ci doit g\u00e9n\u00e9rer un plan d&#8217;ex\u00e9cution avant d&#8217;ex\u00e9cuter la requ\u00eate. L&#8217;organe en charge de la cr\u00e9ation du plan d&#8217;ex\u00e9cution est l&#8217;Optimizer. Son fonctionnement est globalement similaire pour Oracle et SQL&hellip; Continuer la lecture &rarr;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-loptimizer\/\" \/>\n<meta property=\"og:site_name\" content=\"Capdata TECH BLOG\" \/>\n<meta property=\"article:published_time\" content=\"2013-04-03T14:59:42+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-09-13T13:09:18+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2013\/04\/CBO.png\" \/>\n\t<meta property=\"og:image:width\" content=\"663\" \/>\n\t<meta property=\"og:image:height\" content=\"315\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Benjamin VESAN\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Benjamin VESAN\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-loptimizer\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-loptimizer\/\"},\"author\":{\"name\":\"Benjamin VESAN\",\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/person\/ae56d1d3d5680d95ccc2c927e44bdc3e\"},\"headline\":\"Oracle et SQL Server: L&#8217;optimizer\",\"datePublished\":\"2013-04-03T14:59:42+00:00\",\"dateModified\":\"2019-09-13T13:09:18+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-loptimizer\/\"},\"wordCount\":2387,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/blog.capdata.fr\/#organization\"},\"keywords\":[\"CBO\",\"internals\",\"jointure\",\"Optimizer\",\"parallelisme\",\"performance\"],\"articleSection\":[\"Oracle\",\"SQL Server\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-loptimizer\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-loptimizer\/\",\"url\":\"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-loptimizer\/\",\"name\":\"Oracle et SQL Server: L'optimizer - Capdata TECH BLOG\",\"isPartOf\":{\"@id\":\"https:\/\/blog.capdata.fr\/#website\"},\"datePublished\":\"2013-04-03T14:59:42+00:00\",\"dateModified\":\"2019-09-13T13:09:18+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-loptimizer\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-loptimizer\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-loptimizer\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/blog.capdata.fr\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Oracle et SQL Server: L&#8217;optimizer\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.capdata.fr\/#website\",\"url\":\"https:\/\/blog.capdata.fr\/\",\"name\":\"Capdata TECH BLOG\",\"description\":\"Le blog technique sur les bases de donn\u00e9es de CAP DATA Consulting\",\"publisher\":{\"@id\":\"https:\/\/blog.capdata.fr\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.capdata.fr\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/blog.capdata.fr\/#organization\",\"name\":\"Capdata TECH BLOG\",\"url\":\"https:\/\/blog.capdata.fr\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp\",\"contentUrl\":\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp\",\"width\":800,\"height\":254,\"caption\":\"Capdata TECH BLOG\"},\"image\":{\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.linkedin.com\/company\/cap-data-consulting\/mycompany\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/person\/ae56d1d3d5680d95ccc2c927e44bdc3e\",\"name\":\"Benjamin VESAN\",\"url\":\"https:\/\/blog.capdata.fr\/index.php\/author\/bvesan\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Oracle et SQL Server: L'optimizer - Capdata TECH BLOG","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-loptimizer\/","og_locale":"fr_FR","og_type":"article","og_title":"Oracle et SQL Server: L'optimizer - Capdata TECH BLOG","og_description":"Lorsqu&#8217;une requ\u00eate est soumise au moteur de base de donn\u00e9es, celui-ci doit g\u00e9n\u00e9rer un plan d&#8217;ex\u00e9cution avant d&#8217;ex\u00e9cuter la requ\u00eate. L&#8217;organe en charge de la cr\u00e9ation du plan d&#8217;ex\u00e9cution est l&#8217;Optimizer. Son fonctionnement est globalement similaire pour Oracle et SQL&hellip; Continuer la lecture &rarr;","og_url":"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-loptimizer\/","og_site_name":"Capdata TECH BLOG","article_published_time":"2013-04-03T14:59:42+00:00","article_modified_time":"2019-09-13T13:09:18+00:00","og_image":[{"width":663,"height":315,"url":"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2013\/04\/CBO.png","type":"image\/png"}],"author":"Benjamin VESAN","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"Benjamin VESAN","Dur\u00e9e de lecture estim\u00e9e":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-loptimizer\/#article","isPartOf":{"@id":"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-loptimizer\/"},"author":{"name":"Benjamin VESAN","@id":"https:\/\/blog.capdata.fr\/#\/schema\/person\/ae56d1d3d5680d95ccc2c927e44bdc3e"},"headline":"Oracle et SQL Server: L&#8217;optimizer","datePublished":"2013-04-03T14:59:42+00:00","dateModified":"2019-09-13T13:09:18+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-loptimizer\/"},"wordCount":2387,"commentCount":0,"publisher":{"@id":"https:\/\/blog.capdata.fr\/#organization"},"keywords":["CBO","internals","jointure","Optimizer","parallelisme","performance"],"articleSection":["Oracle","SQL Server"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-loptimizer\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-loptimizer\/","url":"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-loptimizer\/","name":"Oracle et SQL Server: L'optimizer - Capdata TECH BLOG","isPartOf":{"@id":"https:\/\/blog.capdata.fr\/#website"},"datePublished":"2013-04-03T14:59:42+00:00","dateModified":"2019-09-13T13:09:18+00:00","breadcrumb":{"@id":"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-loptimizer\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-loptimizer\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-loptimizer\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/blog.capdata.fr\/"},{"@type":"ListItem","position":2,"name":"Oracle et SQL Server: L&#8217;optimizer"}]},{"@type":"WebSite","@id":"https:\/\/blog.capdata.fr\/#website","url":"https:\/\/blog.capdata.fr\/","name":"Capdata TECH BLOG","description":"Le blog technique sur les bases de donn\u00e9es de CAP DATA Consulting","publisher":{"@id":"https:\/\/blog.capdata.fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.capdata.fr\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/blog.capdata.fr\/#organization","name":"Capdata TECH BLOG","url":"https:\/\/blog.capdata.fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/","url":"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp","contentUrl":"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp","width":800,"height":254,"caption":"Capdata TECH BLOG"},"image":{"@id":"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.linkedin.com\/company\/cap-data-consulting\/mycompany\/"]},{"@type":"Person","@id":"https:\/\/blog.capdata.fr\/#\/schema\/person\/ae56d1d3d5680d95ccc2c927e44bdc3e","name":"Benjamin VESAN","url":"https:\/\/blog.capdata.fr\/index.php\/author\/bvesan\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts\/3940","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/users\/14"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/comments?post=3940"}],"version-history":[{"count":89,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts\/3940\/revisions"}],"predecessor-version":[{"id":7867,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts\/3940\/revisions\/7867"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/media\/7866"}],"wp:attachment":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/media?parent=3940"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/categories?post=3940"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/tags?post=3940"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}