{"id":10031,"date":"2023-05-24T06:52:19","date_gmt":"2023-05-24T05:52:19","guid":{"rendered":"https:\/\/blog.capdata.fr\/?p=10031"},"modified":"2023-05-24T06:52:19","modified_gmt":"2023-05-24T05:52:19","slug":"sql-server-et-acceder-a-des-donnees-tierces-linked-servers-vs-polybase","status":"publish","type":"post","link":"https:\/\/blog.capdata.fr\/index.php\/sql-server-et-acceder-a-des-donnees-tierces-linked-servers-vs-polybase\/","title":{"rendered":"SQL Server et acc\u00e9der \u00e0 des donn\u00e9es tierces : Linked Servers vs. Polybase"},"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%2F10031&#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%2F10031&#038;title=SQL%20Server%20et%20acc%C3%A9der%20%C3%A0%20des%20donn%C3%A9es%20tierces%20%3A%20Linked%20Servers%20vs.%20Polybase\" 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=SQL%20Server%20et%20acc%C3%A9der%20%C3%A0%20des%20donn%C3%A9es%20tierces%20%3A%20Linked%20Servers%20vs.%20Polybase&#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%2F10031\" 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><a href=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/05\/neuronal.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/05\/neuronal.png\" alt=\"\" width=\"1043\" height=\"591\" class=\"aligncenter size-full wp-image-10145\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/05\/neuronal.png 1043w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/05\/neuronal-300x170.png 300w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/05\/neuronal-1024x580.png 1024w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/05\/neuronal-768x435.png 768w\" sizes=\"auto, (max-width: 1043px) 100vw, 1043px\" \/><\/a><br \/>\n<\/p>\n<p>Dans le monde de la gestion de donn\u00e9es, l&#8217;acc\u00e8s \u00e0 des sources de donn\u00e9es externes est souvent une n\u00e9cessit\u00e9 pour de nombreux cas d&#8217;utilisation. Les entreprises ont souvent des donn\u00e9es stock\u00e9es dans diff\u00e9rents syst\u00e8mes et doivent \u00eatre en mesure d&#8217;acc\u00e9der \u00e0 ces donn\u00e9es de mani\u00e8re transparente pour les int\u00e9grer dans leur entrep\u00f4t de donn\u00e9es ou pour effectuer des analyses. Les serveurs li\u00e9s dans SQL Server et PolyBase sont deux outils qui permettent aux utilisateurs d&#8217;acc\u00e9der \u00e0 des donn\u00e9es externes \u00e0 partir de SQL Server. Dans cet article, nous allons explorer les diff\u00e9rences entre ces deux outils et discuter des cas d&#8217;utilisation appropri\u00e9s pour chacun.<\/p>\n<h2>Introduction aux serveurs li\u00e9s<\/h2>\n<p>Les Serveur Li\u00e9s (Linked Servers) sont la solution historique pour acc\u00e9der \u00e0 des donn\u00e9es externes depuis SQL Server. Ils sont fait pour acc\u00e9der \u00e0 des serveurs de bases de donn\u00e9es ou \u00e0 des connecteurs ODBC.<\/p>\n<p>Polybase, lui, a tout d&#8217;abord \u00e9t\u00e9 introduit dans SQL Server 2016 pour acc\u00e9der \u00e0 MongoDb et \u00e0 des syst\u00e8mes HADOOP. Avec SQL Server 2019, Polybase renonce \u00e0 HADOOP mais s&#8217;ouvre \u00e0 de nombreuses options de connectivit\u00e9s :<\/p>\n<ul>\n<li>SQL Server<\/li>\n<li>Oracle<\/li>\n<li>MongoDB<\/li>\n<li>Terradata<\/li>\n<li>ODBC<\/li>\n<li>Fichiers CSV sur stockage Azure<\/li>\n<li>Fichiers plats (CSV et Apache Parquet) sur stockage compatible S3<\/li>\n<\/ul>\n<h2>Utilisation d&#8217;un serveur li\u00e9 :<\/h2>\n<p>Si vous n&#8217;avez jamais utilis\u00e9 de serveur li\u00e9, par exemple vers une instance SQL Server, c&#8217;est relativement simple. Tout d&#8217;abord on d\u00e9clare un &#8220;Serveur Li\u00e9&#8221;. Ici, on a deux serveurs SQL dans un domaine Windows. Le serveur distant est derri\u00e8re l&#8217;IP 10.2.0.4.<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n\r\nEXEC master.dbo.sp_addlinkedserver @server = N'MonServeurDistant', @srvproduct=N'', @provider=N'SQLNCLI', @datasrc=N'10.2.0.4'\r\nGO\r\nEXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'MonServeurDistant',@useself=N'True',@locallogin=NULL,@rmtuser=NULL,@rmtpassword=NULL\r\nGO\r\n\r\n<\/pre>\n<p>Il existe de nombreuses options que l&#8217;on peut param\u00e9trer pour un Linked Server\u00a0 :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-10034\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/04\/linked_server1-300x272.png\" alt=\"\" width=\"448\" height=\"406\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/04\/linked_server1-300x272.png 300w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/04\/linked_server1.png 697w\" sizes=\"auto, (max-width: 448px) 100vw, 448px\" \/><br \/>\nDans notre cas, et avec les options par d\u00e9faut, on peut d\u00e9sormais interroger de la mani\u00e8re suivante :<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n\r\nselect * from MonServeurDistant.master.sys.databases ;\r\n\r\n<\/pre>\n<p>Cela nous renverra le contenu de la table sys.databases de la base master sur notre serveur distant.<\/p>\n<p>L&#8217;int\u00e9gralit\u00e9 de la documentation sur les serveurs li\u00e9s dans SQL Server est disponible ici\u00a0 :<\/p>\n<p><a href=\"https:\/\/learn.microsoft.com\/en-us\/sql\/relational-databases\/linked-servers\/linked-servers-database-engine?view=sql-server-ver16\">https:\/\/learn.microsoft.com\/en-us\/sql\/relational-databases\/linked-servers\/linked-servers-database-engine?view=sql-server-ver16<\/a><\/p>\n<h2>Utilisation de PolyBase :<\/h2>\n<p>A noter que le composant doit \u00eatre d\u00e9ploy\u00e9, au m\u00eame titre que les Full-Text Index.<\/p>\n<p>On doit ensuite activer le composant dans SQL Server sur le serveur qui interrogera des sources distantes :<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n\r\nsp_configure 'polybase enabled' , 1\r\nGO\r\nRECONFIGURE\r\nGO\r\n\r\n<\/pre>\n<p>Une fois que c&#8217;est fait, on doit cr\u00e9er une master key dans la base depuis lequel on interrogera des sources distantes :<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n\r\nCREATE MASTER KEY ENCRYPTION BY PASSWORD ='MonMdp2Mast3rKey!'\r\ngo\r\n\r\n<\/pre>\n<p>On cr\u00e9e ensuite un <em>database scoped user<\/em> :<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n\r\nCREATE DATABASE SCOPED CREDENTIAL Polybase_Credential\r\nWITH IDENTITY = 'Polybase_User', SECRET = 'Polybase_User';\r\ngo\r\n\r\n<\/pre>\n<p>Cet utilisateur devra exister c\u00f4t\u00e9 distant. L&#8217;authentification Windows n&#8217;est pas possible : uniquement SQL.<\/p>\n<p>On peut ensuite d\u00e9clarer notre source de donn\u00e9es externe, o\u00f9 LAB1SQL2 est le serveur distant \u00e0 interroger :<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n\r\nCREATE EXTERNAL DATA SOURCE LAB1SQL2_DS\r\nWITH ( LOCATION = 'sqlserver:\/\/LAB1SQL2:1433',\r\nPUSHDOWN = ON,\r\nCREDENTIAL = Polybase_Credential);\r\n\r\n<\/pre>\n<p>La plus grosse diff\u00e9rence entre les Linked Servers et les tables externes Polybase est la n\u00e9cessit\u00e9, dans le second cas, de d\u00e9clarer chaque table \u00e0 laquelle on voudra acc\u00e9der.<\/p>\n<p>Par exemple, si le serveur distant contient la base AdventureWorks, on pourrait d\u00e9clarer la table externe repr\u00e9sentant la vue Sales.vSalesPerson :<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n\r\nCREATE EXTERNAL TABLE dbo.[External_vSalesPerson]\r\n(\r\nBusinessEntityID int,\r\nTitle nvarchar(16),\r\nFirstName nvarchar(50),\r\nMiddleName nvarchar(50),\r\nLastName nvarchar(50),\r\nSuffix nvarchar(50),\r\nJobTitle nvarchar(50),\r\nPhoneNumber nvarchar(50),\r\nPhoneNumberType nvarchar(50),\r\nEmailAddress nvarchar(50),\r\nEmailPromotion int,\r\nAddressLine1 nvarchar(50),\r\nAddressLine2 nvarchar(50),\r\nCity nvarchar(50),\r\nStateProvinceName nvarchar(50),\r\nPostalCode nvarchar(15),\r\nCountryRegionName nvarchar(50),\r\nTerritoryName nvarchar(50),\r\nTerritoryGroup nvarchar(50),\r\nSalesQuota money,\r\nSalesYTD money,\r\nSalesLastYear money)\r\nWITH (LOCATION='AdventureWorks.Sales.vSalesPerson' , DATA_SOURCE=LAB1SQL2_DS);\r\n\r\n<\/pre>\n<p>On note donc les deux param\u00e8tres importants : LOCATION= le nom l&#8217;objet \u00e0 pr\u00e9senter, et DATA_SOURCE = le nom de l&#8217;External Data Source.<\/p>\n<p>On peut ensuite interroger localement la table externe dbo.External_vSalesPerson.<\/p>\n<p>&nbsp;<\/p>\n<h2>Diff\u00e9rence de comportement et de performances :<\/h2>\n<p>Il existe des limitations \u00e0 l&#8217;interrogation de table ou de vues par les Serveurs Li\u00e9s. Celles-ci ne sont pas toujours tr\u00e8s bien document\u00e9es. Par exemple, si une table\/vue a des donn\u00e9es de type XML ou Geography , cela ne fonctionnera pas.<\/p>\n<p>Mais l\u00e0 o\u00f9 la situation devient vraiment compliqu\u00e9e, c&#8217;est lorsque l&#8217;on veut faire des jointures entre des donn\u00e9es distantes et locales. Historiquement, il y avait les Serveurs Li\u00e9s. Il faut comprendre que les requ\u00eates bas\u00e9es sur des Serveurs Li\u00e9s pr\u00e9sentent un risque important de faibles performances, ou du moins de variations de performances. En effet, l&#8217;obtention des statistiques \u00e0 travers un serveur li\u00e9 est d\u00e9pendant des param\u00e8tres suivants :<\/p>\n<ul>\n<li>Disposer de privil\u00e8ges suffisants sur la base de donn\u00e9es distante : sysadmin, db_owner ou db_ddladmin<\/li>\n<li>L&#8217;int\u00e9gration d&#8217;une fonction dans un pr\u00e9dicat (encore + vrai qu&#8217;en local) : getdate() par exemple est calcul\u00e9 localement (pour cause de serveur possiblement dans des fuseaux horaires diff\u00e9rents), et peut perturber la remont\u00e9e des statistiques<\/li>\n<li>Certaines jointures avec de gros \u00e9carts de cardinalit\u00e9s entre la table de build et de probe<\/li>\n<li>Les cardinalit\u00e9s sont fixes lors de l&#8217;interrogation d&#8217;une vue : si le niveau de compatibilit\u00e9 est de 120 ou sup\u00e9rieur il sera de 100, tandis que 110 et inf\u00e9rieur cela sera de 1000.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>Exemple :<\/p>\n<p>En utilisant la base StackOverflow2010 de 10 Go, copi\u00e9e sur les deux serveurs, on peut tenter des requ\u00eates avec des jointures. De base, on a donc la requ\u00eate suivante :<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n\r\nselect vt.name, count(*)\r\nfrom VoteTypes vt\r\nINNER JOIN Votes V on v.VoteTypeId = Vt.id\r\nINNER JOIN dbo.Posts P on V.PostId = P.Id\r\nGROUP BY vt.Name\r\n\r\n<\/pre>\n<p>On a un co\u00fbt de 54 et une dur\u00e9e d&#8217;ex\u00e9cution d&#8217;une seconde avec le plan ci-dessous :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-10045\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/04\/base-300x72.png\" alt=\"\" width=\"1108\" height=\"266\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/04\/base-300x72.png 300w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/04\/base-1024x246.png 1024w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/04\/base-768x184.png 768w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/04\/base.png 1375w\" sizes=\"auto, (max-width: 1108px) 100vw, 1108px\" \/><\/p>\n<p>Ensuite, en utilisant un Linked Server :<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nselect vt.name, count(*)\r\nfrom VoteTypes vt\r\nINNER JOIN Votes V on v.VoteTypeId = Vt.id\r\nINNER JOIN MonServeurDistant.StackOverflow2010.dbo.Posts P on V.PostId = P.Id\r\nGROUP BY vt.Name\r\n\r\n<\/pre>\n<p>On a un co\u00fbt de 1431 et une dur\u00e9e d&#8217;ex\u00e9cution de 2 minutes 06 avec le plan ci-dessous :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-10048\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/04\/req_linked_server-1-300x43.png\" alt=\"\" width=\"1151\" height=\"165\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/04\/req_linked_server-1-300x43.png 300w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/04\/req_linked_server-1-1024x147.png 1024w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/04\/req_linked_server-1-768x110.png 768w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/04\/req_linked_server-1-1536x221.png 1536w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/04\/req_linked_server-1.png 1676w\" sizes=\"auto, (max-width: 1151px) 100vw, 1151px\" \/><\/p>\n<p>Enfin, avec une table externe reprenant la table Posts :<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n\r\nselect vt.name, count(*)\r\nfrom VoteTypes vt\r\nINNER JOIN Votes V on v.VoteTypeId = Vt.id\r\nINNER JOIN External_Posts P on V.PostId = P.Id\r\nGROUP BY vt.Name\r\n\r\n<\/pre>\n<p>On a un co\u00fbt de 46.8 et une dur\u00e9e d&#8217;ex\u00e9cution de 16 secondes.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-10139\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/05\/external_table1-300x111.jpg\" alt=\"\" width=\"1143\" height=\"423\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/05\/external_table1-300x111.jpg 300w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/05\/external_table1-768x283.jpg 768w\" sizes=\"auto, (max-width: 1143px) 100vw, 1143px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>On a donc sur cet exemple une erreur d&#8217;estimation li\u00e9 \u00e0 un cas de jointure avec de gros \u00e9carts de cardinalit\u00e9s. Ce ne sera pas cependant syst\u00e9matiquement le cas et m\u00eame on peut observer des situations o\u00f9 les Linked Server ont de meilleurs r\u00e9sultats que les tables externes.<\/p>\n<p>&nbsp;<\/p>\n<p>Par contre, dans le cas d&#8217;une vue derri\u00e8re un serveur li\u00e9 : la cardinalit\u00e9 \u00e9tant fix\u00e9e \u00e0 10 000 (en l&#8217;absence de pr\u00e9dicat, 100 avec, et avec un niveau de compatibilit\u00e9 sup\u00e9rieur \u00e0 120), les erreurs seront in\u00e9vitables et seront forc\u00e9ment en faveur des tables externes.<\/p>\n<p>Imaginons maintenant une requ\u00eate, mais attaquant une vue qui repr\u00e9sente la table Comments (o\u00f9 un index sur la colonne Score a \u00e9t\u00e9 ajout\u00e9) :<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n\r\nselect P.Score\r\nfrom Posts P\r\nINNER JOIN vComments C ON P.Id = C.PostId\r\nwhere C.Score = 1\r\n\r\n<\/pre>\n<p>Le plan d&#8217;ex\u00e9cution est assez classique, avec un co\u00fbt de 8.46 et une dur\u00e9e d&#8217;ex\u00e9cution de 2 secondes :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-10080\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/04\/Req_view_base-300x123.png\" alt=\"\" width=\"634\" height=\"260\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/04\/Req_view_base-300x123.png 300w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/04\/Req_view_base.png 750w\" sizes=\"auto, (max-width: 634px) 100vw, 634px\" \/><\/p>\n<p>Si on utilise d\u00e9sormais un Serveur Li\u00e9, le plan d&#8217;ex\u00e9cution change radicalement, avec un co\u00fbt de &#8230; 0.08 ?!! et une dur\u00e9e d&#8217;ex\u00e9cution de &#8230; 1 minute 43 seconde !<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-10082\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/04\/req_view_LS-1-300x125.png\" alt=\"\" width=\"564\" height=\"235\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/04\/req_view_LS-1-300x125.png 300w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/04\/req_view_LS-1.png 586w\" sizes=\"auto, (max-width: 564px) 100vw, 564px\" \/><\/p>\n<p>En effet, dans le cas de l&#8217;utilisation d&#8217;une vue derri\u00e8re un Serveur Li\u00e9, la cardinalit\u00e9 est de 100. SQL Server estimera donc un Nested Loop, alors que le nombre de ligne r\u00e9el est bien sup\u00e9rieur !<\/p>\n<p>&nbsp;<\/p>\n<p>Avec les tables externes Polybase, il faut penser d\u00e9j\u00e0 \u00e0 d\u00e9clarer la table externe derri\u00e8re la vue, et \u00e0 penser aux statistiques \u00e0 cr\u00e9er manuellement :<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n\r\nCREATE EXTERNAL TABLE [dbo].[External_vComments]\r\n(\r\n[Id] [int] NULL,\r\nCreationDate [Datetime] ,\r\nPostId [int] ,\r\nScore [int] NULL,\r\nText nvarchar(1400) ,\r\nUserId [int] NULL\r\n\r\n)\r\nWITH (DATA_SOURCE = [LAB1SQL2_DS],LOCATION = N'StackOverflow2010.dbo.vComments')\r\nGO\r\n\r\nCREATE STATISTICS External_vComments_PostId ON External_vComments(PostId) with FULLSCAN\r\nCREATE STATISTICS External_vComments_Score ON External_vComments(Score) with FULLSCAN\r\n\r\n&amp;nbsp;\r\n\r\n<\/pre>\n<p>Et l\u00e0, en faisant la jointure sur la table externe, on aura un plan d&#8217;ex\u00e9cution encore diff\u00e9rent :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-10083\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/04\/req_view_Polybase-300x169.png\" alt=\"\" width=\"596\" height=\"336\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/04\/req_view_Polybase-300x169.png 300w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/04\/req_view_Polybase-768x433.png 768w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/04\/req_view_Polybase.png 807w\" sizes=\"auto, (max-width: 596px) 100vw, 596px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>On voit que la cardinalit\u00e9 estim\u00e9e derri\u00e8re External_vComments est bien sup\u00e9rieur \u00e0 100 (411 000, conforme \u00e0 la vue\/table r\u00e9elle). On a donc un hash match join au lieu du loop join. Le co\u00fbt de la requ\u00eate estim\u00e9 est de 149, et la dur\u00e9e est de 4 secondes (contre 103 secondes avec un Linked Server).<\/p>\n<p>On a donc sacrifi\u00e9 de la souplesse de conception contre de la performance. En effet, la d\u00e9claration de la table externe et ses statistiques n\u00e9cessite un peu de pr\u00e9paration, mais le gain en performance est tout de m\u00eame significatif.<\/p>\n<p>&nbsp;<\/p>\n<h2>Conclusion<\/h2>\n<p>Attention cependant, il ne faut pas croire que les tables externes sont des solutions ultimes aux sujet de requ\u00eates vers des serveurs externes. Il peut aussi arriver que SQL Server rencontre des probl\u00e8mes d&#8217;estimation de plan et se trompe. Ici, on voit bien que le co\u00fbt de 149 est loin de la r\u00e9alit\u00e9, et une branche d&#8217;une requ\u00eate faisant appel \u00e0 une table externe dans une requ\u00eate complexe, bas\u00e9e sur des tables locale, pourrait donc \u00eatre d\u00e9s\u00e9quilibr\u00e9e.<\/p>\n<p>La r\u00e8gle \u00e0 favoriser malgr\u00e9 tout est de penser que lors de l&#8217;utilisation de vues, les Linked Server vont tr\u00e8s tr\u00e8s probablement poser probl\u00e8me. De l\u00e0, 3 options : remonter les donn\u00e9es sur le serveur local par une m\u00e9canique de votre choix, attaquer les donn\u00e9es directement et non pas la vue, ou bien utiliser une table externe Polybase.<\/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%2F10031&#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%2F10031&#038;title=SQL%20Server%20et%20acc%C3%A9der%20%C3%A0%20des%20donn%C3%A9es%20tierces%20%3A%20Linked%20Servers%20vs.%20Polybase\" 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=SQL%20Server%20et%20acc%C3%A9der%20%C3%A0%20des%20donn%C3%A9es%20tierces%20%3A%20Linked%20Servers%20vs.%20Polybase&#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%2F10031\" 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>Dans le monde de la gestion de donn\u00e9es, l&#8217;acc\u00e8s \u00e0 des sources de donn\u00e9es externes est souvent une n\u00e9cessit\u00e9 pour de nombreux cas d&#8217;utilisation. Les entreprises ont souvent des donn\u00e9es stock\u00e9es dans diff\u00e9rents syst\u00e8mes et doivent \u00eatre en mesure d&#8217;acc\u00e9der&hellip; <a href=\"https:\/\/blog.capdata.fr\/index.php\/sql-server-et-acceder-a-des-donnees-tierces-linked-servers-vs-polybase\/\" class=\"more-link\">Continuer la lecture <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":10145,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[451,456,452,453,423,454,455],"class_list":["post-10031","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-sqlserver","tag-data-virtualization","tag-donnees-distribuees","tag-external-table","tag-linked-server","tag-polybase","tag-serveur-lie","tag-table-externe"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>SQL Server et acc\u00e9der \u00e0 des donn\u00e9es tierces : Linked Servers vs. Polybase - 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\/sql-server-et-acceder-a-des-donnees-tierces-linked-servers-vs-polybase\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"SQL Server et acc\u00e9der \u00e0 des donn\u00e9es tierces : Linked Servers vs. Polybase - Capdata TECH BLOG\" \/>\n<meta property=\"og:description\" content=\"Dans le monde de la gestion de donn\u00e9es, l&#8217;acc\u00e8s \u00e0 des sources de donn\u00e9es externes est souvent une n\u00e9cessit\u00e9 pour de nombreux cas d&#8217;utilisation. Les entreprises ont souvent des donn\u00e9es stock\u00e9es dans diff\u00e9rents syst\u00e8mes et doivent \u00eatre en mesure d&#8217;acc\u00e9der&hellip; Continuer la lecture &rarr;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.capdata.fr\/index.php\/sql-server-et-acceder-a-des-donnees-tierces-linked-servers-vs-polybase\/\" \/>\n<meta property=\"og:site_name\" content=\"Capdata TECH BLOG\" \/>\n<meta property=\"article:published_time\" content=\"2023-05-24T05:52:19+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/05\/neuronal.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1043\" \/>\n\t<meta property=\"og:image:height\" content=\"591\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Capdata team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Capdata team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 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\/sql-server-et-acceder-a-des-donnees-tierces-linked-servers-vs-polybase\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/sql-server-et-acceder-a-des-donnees-tierces-linked-servers-vs-polybase\/\"},\"author\":{\"name\":\"Capdata team\",\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/person\/bfd9395c8ba4fa125792a543377035e9\"},\"headline\":\"SQL Server et acc\u00e9der \u00e0 des donn\u00e9es tierces : Linked Servers vs. Polybase\",\"datePublished\":\"2023-05-24T05:52:19+00:00\",\"dateModified\":\"2023-05-24T05:52:19+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/sql-server-et-acceder-a-des-donnees-tierces-linked-servers-vs-polybase\/\"},\"wordCount\":1713,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/blog.capdata.fr\/#organization\"},\"keywords\":[\"data virtualization\",\"donn\u00e9es distribu\u00e9es\",\"external table\",\"linked server\",\"polybase\",\"serveur li\u00e9\",\"table externe\"],\"articleSection\":[\"SQL Server\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/blog.capdata.fr\/index.php\/sql-server-et-acceder-a-des-donnees-tierces-linked-servers-vs-polybase\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/sql-server-et-acceder-a-des-donnees-tierces-linked-servers-vs-polybase\/\",\"url\":\"https:\/\/blog.capdata.fr\/index.php\/sql-server-et-acceder-a-des-donnees-tierces-linked-servers-vs-polybase\/\",\"name\":\"SQL Server et acc\u00e9der \u00e0 des donn\u00e9es tierces : Linked Servers vs. Polybase - Capdata TECH BLOG\",\"isPartOf\":{\"@id\":\"https:\/\/blog.capdata.fr\/#website\"},\"datePublished\":\"2023-05-24T05:52:19+00:00\",\"dateModified\":\"2023-05-24T05:52:19+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/sql-server-et-acceder-a-des-donnees-tierces-linked-servers-vs-polybase\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.capdata.fr\/index.php\/sql-server-et-acceder-a-des-donnees-tierces-linked-servers-vs-polybase\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/sql-server-et-acceder-a-des-donnees-tierces-linked-servers-vs-polybase\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/blog.capdata.fr\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"SQL Server et acc\u00e9der \u00e0 des donn\u00e9es tierces : Linked Servers vs. Polybase\"}]},{\"@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\/bfd9395c8ba4fa125792a543377035e9\",\"name\":\"Capdata team\",\"sameAs\":[\"https:\/\/www.capdata.fr\"],\"url\":\"https:\/\/blog.capdata.fr\/index.php\/author\/admin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"SQL Server et acc\u00e9der \u00e0 des donn\u00e9es tierces : Linked Servers vs. Polybase - 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\/sql-server-et-acceder-a-des-donnees-tierces-linked-servers-vs-polybase\/","og_locale":"fr_FR","og_type":"article","og_title":"SQL Server et acc\u00e9der \u00e0 des donn\u00e9es tierces : Linked Servers vs. Polybase - Capdata TECH BLOG","og_description":"Dans le monde de la gestion de donn\u00e9es, l&#8217;acc\u00e8s \u00e0 des sources de donn\u00e9es externes est souvent une n\u00e9cessit\u00e9 pour de nombreux cas d&#8217;utilisation. Les entreprises ont souvent des donn\u00e9es stock\u00e9es dans diff\u00e9rents syst\u00e8mes et doivent \u00eatre en mesure d&#8217;acc\u00e9der&hellip; Continuer la lecture &rarr;","og_url":"https:\/\/blog.capdata.fr\/index.php\/sql-server-et-acceder-a-des-donnees-tierces-linked-servers-vs-polybase\/","og_site_name":"Capdata TECH BLOG","article_published_time":"2023-05-24T05:52:19+00:00","og_image":[{"width":1043,"height":591,"url":"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/05\/neuronal.png","type":"image\/png"}],"author":"Capdata team","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"Capdata team","Dur\u00e9e de lecture estim\u00e9e":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.capdata.fr\/index.php\/sql-server-et-acceder-a-des-donnees-tierces-linked-servers-vs-polybase\/#article","isPartOf":{"@id":"https:\/\/blog.capdata.fr\/index.php\/sql-server-et-acceder-a-des-donnees-tierces-linked-servers-vs-polybase\/"},"author":{"name":"Capdata team","@id":"https:\/\/blog.capdata.fr\/#\/schema\/person\/bfd9395c8ba4fa125792a543377035e9"},"headline":"SQL Server et acc\u00e9der \u00e0 des donn\u00e9es tierces : Linked Servers vs. Polybase","datePublished":"2023-05-24T05:52:19+00:00","dateModified":"2023-05-24T05:52:19+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.capdata.fr\/index.php\/sql-server-et-acceder-a-des-donnees-tierces-linked-servers-vs-polybase\/"},"wordCount":1713,"commentCount":0,"publisher":{"@id":"https:\/\/blog.capdata.fr\/#organization"},"keywords":["data virtualization","donn\u00e9es distribu\u00e9es","external table","linked server","polybase","serveur li\u00e9","table externe"],"articleSection":["SQL Server"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blog.capdata.fr\/index.php\/sql-server-et-acceder-a-des-donnees-tierces-linked-servers-vs-polybase\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blog.capdata.fr\/index.php\/sql-server-et-acceder-a-des-donnees-tierces-linked-servers-vs-polybase\/","url":"https:\/\/blog.capdata.fr\/index.php\/sql-server-et-acceder-a-des-donnees-tierces-linked-servers-vs-polybase\/","name":"SQL Server et acc\u00e9der \u00e0 des donn\u00e9es tierces : Linked Servers vs. Polybase - Capdata TECH BLOG","isPartOf":{"@id":"https:\/\/blog.capdata.fr\/#website"},"datePublished":"2023-05-24T05:52:19+00:00","dateModified":"2023-05-24T05:52:19+00:00","breadcrumb":{"@id":"https:\/\/blog.capdata.fr\/index.php\/sql-server-et-acceder-a-des-donnees-tierces-linked-servers-vs-polybase\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.capdata.fr\/index.php\/sql-server-et-acceder-a-des-donnees-tierces-linked-servers-vs-polybase\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/blog.capdata.fr\/index.php\/sql-server-et-acceder-a-des-donnees-tierces-linked-servers-vs-polybase\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/blog.capdata.fr\/"},{"@type":"ListItem","position":2,"name":"SQL Server et acc\u00e9der \u00e0 des donn\u00e9es tierces : Linked Servers vs. Polybase"}]},{"@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\/bfd9395c8ba4fa125792a543377035e9","name":"Capdata team","sameAs":["https:\/\/www.capdata.fr"],"url":"https:\/\/blog.capdata.fr\/index.php\/author\/admin\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts\/10031","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\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/comments?post=10031"}],"version-history":[{"count":21,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts\/10031\/revisions"}],"predecessor-version":[{"id":10148,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts\/10031\/revisions\/10148"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/media\/10145"}],"wp:attachment":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/media?parent=10031"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/categories?post=10031"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/tags?post=10031"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}