{"id":36704,"date":"2019-10-31T22:13:15","date_gmt":"2019-10-31T19:13:15","guid":{"rendered":"https:\/\/prohoster.info\/blog\/optimizatsiya-zaprosov-bazy-dannyh-na-primere-b2b-servisa-dlya-stroitelej\/"},"modified":"2019-10-31T22:13:15","modified_gmt":"2019-10-31T19:13:15","slug":"optimizatsiya-zaprosov-bazy-dannyh-na-primere-b2b-servisa-dlya-stroitelej","status":"publish","type":"post","link":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/optimizatsiya-zaprosov-bazy-dannyh-na-primere-b2b-servisa-dlya-stroitelej","title":{"rendered":"Optimisation des requ\u00eates de base de donn\u00e9es sur l'exemple d'un service B2B pour les constructeurs","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Comment multiplier par 10 le nombre de requ\u00eates \u00e0 une base de donn\u00e9es sans changer pour un serveur plus performant tout en maintenant le bon fonctionnement du syst\u00e8me ? Je vais vous raconter comment nous avons lutt\u00e9 contre la baisse de performance de notre base de donn\u00e9es, comment nous avons optimis\u00e9 les requ\u00eates SQL pour servir le plus grand nombre d'utilisateurs possible sans augmenter les co\u00fbts des ressources de calcul.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nJe d\u00e9veloppe un service de gestion des processus d'affaires pour les entreprises de construction. Environ 3 000 entreprises travaillent avec nous. Plus de 10 000 personnes utilisent notre syst\u00e8me chaque jour pendant 4 \u00e0 10 heures. Il r\u00e9sout divers probl\u00e8mes de planification, d'alerte, de notification, de validation\u2026 Nous utilisons PostgreSQL 9.6. Nous avons environ 300 tables dans notre base de donn\u00e9es et jusqu'\u00e0 200 millions de requ\u00eates y parviennent chaque jour (10 000 diff\u00e9rentes). En moyenne, nous traitons 3 000 \u00e0 4 000 requ\u00eates par seconde, et dans les moments les plus actifs, plus de 10 000 requ\u00eates par seconde. La plupart des requ\u00eates sont des OLAP. Les ajouts, modifications et suppressions sont beaucoup moins fr\u00e9quents, ce qui signifie que la charge OLTP est relativement faible. J'ai pr\u00e9sent\u00e9 tous ces chiffres pour que vous puissiez \u00e9valuer l'ampleur de notre projet et comprendre \u00e0 quel point notre exp\u00e9rience peut vous \u00eatre utile.<\/p>\n<h3>Premi\u00e8re image. Lyrique<\/h3>\n<p>\nLorsque nous avons commenc\u00e9 le d\u00e9veloppement, nous ne pensions pas vraiment \u00e0 la charge qui p\u00e8serait sur la base de donn\u00e9es et ce que nous ferions si le serveur cessait de fonctionner. Lors de la conception de la base de donn\u00e9es, nous avons suivi des recommandations g\u00e9n\u00e9rales et avons essay\u00e9 de ne pas nous tirer une balle dans le pied, mais au-del\u00e0 des conseils g\u00e9n\u00e9raux tels que \u00ab ne pas utiliser le mod\u00e8le <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Entity%E2%80%93attribute%E2%80%93value_model\">Entity Attribute Values<\/a><\/noindex> nous n'avons pas approfondi. Nous avons con\u00e7u en nous basant sur les principes de normalisation, \u00e9vitant la redondance des donn\u00e9es, sans nous soucier d'acc\u00e9l\u00e9rer certaines requ\u00eates. D\u00e8s que les premiers utilisateurs sont arriv\u00e9s, nous avons \u00e9t\u00e9 confront\u00e9s \u00e0 des probl\u00e8mes de performance. Comme d'habitude, nous \u00e9tions totalement mal pr\u00e9par\u00e9s. Les premiers probl\u00e8mes \u00e9taient simples. En r\u00e8gle g\u00e9n\u00e9rale, il suffisait d'ajouter un nouvel index. Mais il est arriv\u00e9 un moment o\u00f9 ces solutions simples ont cess\u00e9 de fonctionner. R\u00e9alisant que nous manquions d'exp\u00e9rience et que nous avions de plus en plus de mal \u00e0 comprendre la cause des probl\u00e8mes, nous avons engag\u00e9 des sp\u00e9cialistes qui nous ont aid\u00e9s \u00e0 configurer correctement le serveur, \u00e0 connecter le monitoring et \u00e0 nous montrer o\u00f9 regarder pour obtenir <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/9.6\/pgstatstatements.html\">statistiques<\/a><\/noindex>.<\/p>\n<h3>Deuxi\u00e8me image. Statistique<\/h3>\n<p>\nNous avons environ 10 000 requ\u00eates diff\u00e9rentes qui s'ex\u00e9cutent sur notre base de donn\u00e9es chaque jour. Parmi ces 10 000, il y a des monstres qui s'ex\u00e9cutent 2 \u00e0 3 millions de fois avec un temps d'ex\u00e9cution moyen de 0,1 \u00e0 0,3 ms, ainsi que des requ\u00eates avec un temps d'ex\u00e9cution moyen de 30 secondes, invoqu\u00e9es 100 fois par jour.<\/p>\n<p>Il n'\u00e9tait pas possible d'optimiser les 10 000 requ\u00eates, alors nous avons d\u00e9cid\u00e9 de d\u00e9terminer o\u00f9 concentrer nos efforts pour am\u00e9liorer correctement les performances de la base de donn\u00e9es. Apr\u00e8s plusieurs it\u00e9rations, nous avons commenc\u00e9 \u00e0 classer les requ\u00eates par types.<\/p>\n<h4>REQU\u00caTES TOP<\/h4>\n<p>\nCe sont les requ\u00eates les plus lourdes qui prennent le plus de temps (temps total). Ce sont des requ\u00eates qui sont soit tr\u00e8s souvent appel\u00e9es, soit des requ\u00eates qui prennent beaucoup de temps \u00e0 s'ex\u00e9cuter (les requ\u00eates longues et fr\u00e9quentes avaient d\u00e9j\u00e0 \u00e9t\u00e9 optimis\u00e9es lors des premi\u00e8res it\u00e9rations pour gagner en vitesse). Au final, le serveur passe le plus de temps \u00e0 les ex\u00e9cuter. Il est \u00e9galement important de s\u00e9parer les requ\u00eates top par le temps d'ex\u00e9cution total et par le temps IO. Les m\u00e9thodes d'optimisation de ces requ\u00eates sont l\u00e9g\u00e8rement diff\u00e9rentes.<\/p>\n<p>La pratique courante de toutes les entreprises est de travailler sur les REQU\u00caTES TOP. Elles sont peu nombreuses, et l'optimisation d'une seule requ\u00eate peut lib\u00e9rer 5 \u00e0 10 % des ressources. Cependant, \u00e0 mesure que le projet \u00ab grandit \u00bb, l'optimisation des REQU\u00caTES TOP devient une t\u00e2che de plus en plus complexe. Tous les moyens simples ont d\u00e9j\u00e0 \u00e9t\u00e9 \u00e9prouv\u00e9s, et la requ\u00eate la plus \u00ab lourde \u00bb n'accapare \u00ab que \u00bb 3 \u00e0 5 % des ressources. Si les REQU\u00caTES TOP occupent moins de 30 \u00e0 40 % du temps total, vous avez probablement d\u00e9j\u00e0 travaill\u00e9 pour qu'elles fonctionnent rapidement et il est temps de passer \u00e0 l'optimisation des requ\u00eates du groupe suivant.<br \/>\nIl reste \u00e0 r\u00e9pondre \u00e0 la question de combien de requ\u00eates sup\u00e9rieures inclure dans ce groupe. Je prends g\u00e9n\u00e9ralement pas moins de 10, mais pas plus de 20. J'essaie de m'assurer que le temps d'ex\u00e9cution de la premi\u00e8re et de la derni\u00e8re requ\u00eate dans le groupe TOP ne diff\u00e8re pas de plus de 10 fois. C'est-\u00e0-dire que si le temps d'ex\u00e9cution des requ\u00eates chute brusquement de la premi\u00e8re \u00e0 la dixi\u00e8me place, je prends le TOP-10, si la chute est plus progressive, j'augmente la taille du groupe \u00e0 15 ou 20.<br \/>\n<img decoding=\"async\" alt=\"Optimisation des requ\u00eates de base de donn\u00e9es sur l&#039;exemple d&#039;un service B2B pour les constructeurs\" src=\"\/wp-content\/uploads\/2019\/08\/2a9d9e6053d1aebb71aa213757bd2393.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h4>Requ\u00eates interm\u00e9diaires (medium)<\/h4>\n<p>\nCe sont toutes les requ\u00eates qui viennent juste apr\u00e8s les REQU\u00caTES TOP, \u00e0 l'exception des 5 \u00e0 10 % derni\u00e8res. L'optimisation de ces requ\u00eates rec\u00e8le souvent la possibilit\u00e9 d'augmenter consid\u00e9rablement les performances du serveur. Ces requ\u00eates peuvent repr\u00e9senter jusqu'\u00e0 80 %. Mais m\u00eame si leur part d\u00e9passe 50 %, il est temps de les examiner de plus pr\u00e8s.<\/p>\n<h4>Queue (tail)<\/h4>\n<p>\nComme mentionn\u00e9, ces requ\u00eates arrivent \u00e0 la fin et prennent 5 \u00e0 10 % de notre temps. On peut les oublier, sauf si vous utilisez des outils d'analyse de requ\u00eates automatiques, alors leur optimisation peut aussi co\u00fbter peu.<\/p>\n<p>Comment \u00e9valuer chaque groupe ?<\/p>\n<p>J'utilise une requ\u00eate SQL qui permet de faire cette \u00e9valuation pour PostgreSQL (je suis s\u00fbr qu'il est possible d'\u00e9crire une requ\u00eate similaire pour de nombreux autres SGBD).<\/p>\n<p><b class=\"spoiler_title\">Requ\u00eate SQL pour \u00e9valuer la taille des groupes TOP-MEDIUM-TAIL<\/b><\/p>\n<pre><code class=\"sql\">SELECT sum(time_top) AS sum_top, sum(time_medium) AS sum_medium, sum(time_tail) AS sum_tail\nFROM\n(\n  SELECT CASE WHEN rn  20 AND rn  800 THEN tt_percent ELSE 0 END AS time_tail\n  FROM (\n    SELECT total_time \/ (SELECT sum(total_time) FROM pg_stat_statements) * 100 AS tt_percent, query,\n    ROW_NUMBER () OVER (ORDER BY total_time DESC) AS rn\n    FROM pg_stat_statements\n    ORDER BY total_time DESC\n  ) AS t\n)\nAS ts\n<\/code><\/pre>\n<p>Le r\u00e9sultat de la requ\u00eate comporte trois colonnes, chacune contenant le pourcentage de temps consacr\u00e9 au traitement des requ\u00eates de ce groupe. \u00c0 l'int\u00e9rieur de la requ\u00eate, il y a deux nombres (dans mon cas, 20 et 800) qui s\u00e9parent les requ\u00eates d'un groupe \u00e0 l'autre.<\/p>\n<p>Voici comment se rapportaient les parts des requ\u00eates au d\u00e9but de l'optimisation et maintenant.<\/p>\n<p><img decoding=\"async\" alt=\"Optimisation des requ\u00eates de base de donn\u00e9es sur l&#039;exemple d&#039;un service B2B pour les constructeurs\" src=\"\/wp-content\/uploads\/2019\/08\/9c70ad9aba8b835c94729c9dda656eab.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLe diagramme montre que la part des requ\u00eates TOP a fortement diminu\u00e9, tandis que celle des \"moyennes\" a augment\u00e9.<br \/>\nAu d\u00e9part, les erreurs \u00e9videntes figuraient dans les requ\u00eates TOP. Avec le temps, les maladies de jeunesse ont disparu, la part des requ\u00eates TOP a diminu\u00e9 et il a fallu fournir de plus en plus d'efforts pour acc\u00e9l\u00e9rer les requ\u00eates lourdes. <\/p>\n<p><b class=\"spoiler_title\">Pour obtenir le texte des requ\u00eates, nous utilisons cette requ\u00eate.<\/b><\/p>\n<pre><code class=\"sql\">SELECT * FROM (\n  SELECT ROW_NUMBER () OVER (ORDER BY total_time DESC) AS rn, total_time \/ (SELECT sum(total_time) FROM pg_stat_statements) * 100 AS tt_percent, query\n  FROM pg_stat_statements\n  ORDER BY total_time DESC\n) AS T\nWHERE\nrn  20 AND rn  800  -- TAIL\n<\/code><\/pre>\n<p>Voici une liste des techniques les plus souvent utilis\u00e9es qui nous ont aid\u00e9s \u00e0 acc\u00e9l\u00e9rer les requ\u00eates TOP :<\/p>\n<ul>\n<li>Redesign du syst\u00e8me, par exemple, la refonte de la logique des notifications sur un message broker au lieu de requ\u00eates p\u00e9riodiques \u00e0 la base de donn\u00e9es.<\/li>\n<li>Ajout ou modification d'index.<\/li>\n<li>R\u00e9\u00e9criture des requ\u00eates ORM en SQL pur.<\/li>\n<li>R\u00e9\u00e9criture de la logique de chargement paresseux des donn\u00e9es.<\/li>\n<li>Mise en cache par d\u00e9normalisation des donn\u00e9es. Par exemple, nous avons une relation entre les tables Livraison -&gt; Facture -&gt; Requ\u00eate -&gt; Demande. Cela signifie que chaque livraison est li\u00e9e \u00e0 une demande via d'autres tables. Pour ne pas lier toutes les tables dans chaque requ\u00eate, nous avons dupliqu\u00e9 le lien vers la demande dans la table Livraison.<\/li>\n<li>Mise en cache des tables statiques avec des r\u00e9f\u00e9rentiels et des tables rarement modifi\u00e9es en m\u00e9moire du programme.<\/li>\n<\/ul>\n<p>\nParfois, les modifications entra\u00eenaient un redesign important, mais offraient une r\u00e9duction de 5 \u00e0 10% de la charge syst\u00e8me et \u00e9taient justifi\u00e9es. Au fil du temps, les r\u00e9sultats devenaient de moins en moins significatifs, tandis qu'un redesign plus s\u00e9rieux \u00e9tait de plus en plus n\u00e9cessaire.<\/p>\n<p>Nous avons alors pr\u00eat\u00e9 attention \u00e0 un deuxi\u00e8me groupe de requ\u00eates, le groupe interm\u00e9diaire. Ce groupe comportait beaucoup plus de requ\u00eates et semblait n\u00e9cessiter beaucoup de temps pour l'analyse. Cependant, la plupart des requ\u00eates se sont av\u00e9r\u00e9es tr\u00e8s simples \u00e0 optimiser, et de nombreux probl\u00e8mes se r\u00e9p\u00e9taient des dizaines de fois sous diff\u00e9rentes variations. Voici quelques exemples d'optimisations typiques que nous avons appliqu\u00e9es \u00e0 des dizaines de requ\u00eates similaires, chacune de ces groupes optimis\u00e9s all\u00e9geant la base de donn\u00e9es de 3 \u00e0 5%.<\/p>\n<ul>\n<li> Au lieu de v\u00e9rifier la pr\u00e9sence d'enregistrements avec COUNT et de faire un scan complet de la table, nous avons commenc\u00e9 \u00e0 utiliser EXISTS.\n <\/li>\n<li>Nous nous sommes d\u00e9barrass\u00e9s de DISTINCT (il n\u2019y a pas de recette universelle, mais parfois on peut facilement s\u2019en passer en acc\u00e9l\u00e9rant la requ\u00eate de 10 \u00e0 100 fois).\n<p>Par exemple, au lieu de la requ\u00eate pour extraire tous les chauffeurs d'une grande table de livraisons (DELIVERY), <\/p>\n<pre><code class=\"sql\">SELECT DISTINCT P.ID, P.FIRST_NAME, P.LAST_NAME\nFROM DELIVERY D JOIN PERSON P ON D.DRIVER_ID = P.ID\n<\/code><\/pre>\n<p>\nnous avons effectu\u00e9 une requ\u00eate sur une table PERSON relativement petite.<\/p>\n<pre><code class=\"sql\">SELECT P.ID, P.FIRST_NAME, P.LAST_NAME\nFROM PERSON\nWHERE EXISTS(SELECT D.ID FROM DELIVERY WHERE D.DRIVER_ID = P.ID)\n<\/code><\/pre>\n<p>\nIl semblerait que nous ayons utilis\u00e9 une sous-requ\u00eate corr\u00e9l\u00e9e, mais elle offre une acceleration de plus de 10 fois.\n <\/li>\n<li>Dans de nombreux cas, nous avons m\u00eame renonc\u00e9 \u00e0 COUNT et <br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/www.citusdata.com\/blog\/2016\/10\/12\/count-performance\/#dup_counts_estimated_filtered\">remplac\u00e9 par le calcul d'une valeur approximative.<\/a><\/noindex>\n <\/li>\n<li>au lieu de\n<pre><code class=\"sql\">UPPER(s) LIKE JOHN% \n<\/code><\/pre>\n<p>\nnous utilisons <\/p>\n<pre><code class=\"sql\">s ILIKE \u201cJohn%\u201d\n<\/code><\/pre>\n<p>\n <\/li>\n<\/ul>\n<p>\nChaque requ\u00eate sp\u00e9cifique a parfois pu \u00eatre acc\u00e9l\u00e9r\u00e9e de 3 \u00e0 1000 fois. Malgr\u00e9 ces performances impressionnantes, au d\u00e9but, nous pensions qu'il n'y avait pas de sens \u00e0 optimiser une requ\u00eate qui s'ex\u00e9cutait en 10 ms, qui figurait dans le 300e rang des requ\u00eates les plus lourdes et qui, en termes de charge totale sur la base de donn\u00e9es, ne repr\u00e9sentait qu'un infime pourcentage. Mais en appliquant la m\u00eame recette \u00e0 un groupe de requ\u00eates similaires, nous regagnions plusieurs pourcentages. Pour ne pas perdre de temps \u00e0 examiner manuellement des centaines de requ\u00eates, nous avons \u00e9crit quelques scripts simples qui, gr\u00e2ce \u00e0 des expressions r\u00e9guli\u00e8res, identifiaient des requ\u00eates similaires. Au final, la recherche automatique de groupes de requ\u00eates nous a permis d'am\u00e9liorer encore notre performance avec des efforts modestes.<\/p>\n<p>Nous travaillons depuis trois ans sur le m\u00eame mat\u00e9riel. La charge moyenne quotidienne est d'environ 30 %, atteignant jusqu'\u00e0 70 % lors des pics. Le nombre de requ\u00eates ainsi que le nombre d'utilisateurs ont augment\u00e9 d'environ dix fois. Tout cela gr\u00e2ce \u00e0 un suivi constant de ces groupes de requ\u00eates TOP-MEDIUM. D\u00e8s qu'une nouvelle requ\u00eate appara\u00eet dans le groupe TOP, nous l'analysions imm\u00e9diatement et essayons d'acc\u00e9l\u00e9rer. Nous examinons le groupe MEDIUM une fois par semaine \u00e0 l'aide de scripts d'analyse des requ\u00eates. Si de nouvelles requ\u00eates apparaissent que nous savons d\u00e9j\u00e0 comment optimiser, nous les modifions rapidement. Parfois, nous trouvons de nouvelles m\u00e9thodes d'optimisation applicables instantan\u00e9ment \u00e0 plusieurs requ\u00eates. <\/p>\n<p>Selon nos pr\u00e9visions, le serveur actuel pourra supporter une augmentation du nombre d'utilisateurs encore de 3 \u00e0 5 fois. Cependant, nous avons un autre atout dans notre manche : nous n'avons toujours pas transf\u00e9r\u00e9 les requ\u00eates SELECT sur le miroir, comme cela est recommand\u00e9. Mais nous ne le faisons pas consciemment, car nous souhaitons d'abord exploiter pleinement les possibilit\u00e9s de \"l'optimisation intelligente\" avant de recourir \u00e0 \"l'artillerie lourde\".<br \/>\nUn regard critique sur le travail accompli peut sugg\u00e9rer l'utilisation du dimensionnement vertical. Acheter un serveur plus puissant au lieu de faire perdre du temps aux sp\u00e9cialistes. Un serveur peut ne pas co\u00fbter si cher, surtout que nos limites de dimensionnement vertical ne sont pas encore atteintes. Cependant, le nombre de requ\u00eates n'a augment\u00e9 que de dix fois. Au cours des derni\u00e8res ann\u00e9es, la fonctionnalit\u00e9 du syst\u00e8me s'est \u00e9largie et nous avons maintenant plus de vari\u00e9t\u00e9s de requ\u00eates. La fonctionnalit\u00e9 existante, gr\u00e2ce \u00e0 la mise en cache, est ex\u00e9cut\u00e9e avec moins de requ\u00eates et, de plus, des requ\u00eates plus efficaces. Cela signifie que nous pouvons multiplier par cinq de mani\u00e8re optimiste pour obtenir le v\u00e9ritable coefficient d'acc\u00e9l\u00e9ration. Ainsi, selon des calculs tr\u00e8s conservateurs, on peut dire que l'acc\u00e9l\u00e9ration a \u00e9t\u00e9 de 50 fois et plus. Dimensionner verticalement le serveur 50 fois co\u00fbterait plus cher. Surtout en tenant compte que l'optimisation r\u00e9alis\u00e9e une fois fonctionne en permanence, tandis que la facture pour le serveur lou\u00e9 arrive chaque mois.<br \/>\n<br \/>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/461071\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041a\u0430\u043a \u0432\u044b\u0440\u0430\u0441\u0442\u0438 \u0432 10 \u0440\u0430\u0437 \u043f\u043e\u0434 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a \u0411\u0414 \u043d\u0435 \u043f\u0435\u0440\u0435\u0435\u0437\u0436\u0430\u044f \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u044b? \u042f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u043c\u044b \u0431\u043e\u0440\u043e\u043b\u0438\u0441\u044c \u0441 \u043f\u0430\u0434\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u0448\u0435\u0439 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u0430\u043a \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0438 SQL \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u043d\u0435 \u043f\u043e\u0432\u044b\u0448\u0430\u0442\u044c \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043d\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b. \u042f \u0434\u0435\u043b\u0430\u044e \u0441\u0435\u0440\u0432\u0438\u0441 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u0438\u0437\u043d\u0435\u0441 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u043c\u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":27493,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-36704","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=\"\u041a\u0430\u043a \u0432\u044b\u0440\u0430\u0441\u0442\u0438 \u0432 10 \u0440\u0430\u0437 \u043f\u043e\u0434 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a \u0411\u0414 \u043d\u0435 \u043f\u0435\u0440\u0435\u0435\u0437\u0436\u0430\u044f \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u044b?\" \/>\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\/optimizatsiya-zaprosov-bazy-dannyh-na-primere-b2b-servisa-dlya-stroitelej\" \/>\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\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 B2B \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0434\u043b\u044f \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u0435\u0439 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041a\u0430\u043a \u0432\u044b\u0440\u0430\u0441\u0442\u0438 \u0432 10 \u0440\u0430\u0437 \u043f\u043e\u0434 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a \u0411\u0414 \u043d\u0435 \u043f\u0435\u0440\u0435\u0435\u0437\u0436\u0430\u044f \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u044b?\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/optimizatsiya-zaprosov-bazy-dannyh-na-primere-b2b-servisa-dlya-stroitelej\" \/>\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:13:15+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:13:15+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\udd47Optimisation des requ\u00eates de base de donn\u00e9es sur l'exemple d'un service B2B pour les constructeurs | ProHoster","description":"Comment cro\u00eetre dix fois en termes de requ\u00eates vers la base de donn\u00e9es sans d\u00e9m\u00e9nager sur un serveur plus puissant tout en conservant le bon fonctionnement du syst\u00e8me ?","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/optimizatsiya-zaprosov-bazy-dannyh-na-primere-b2b-servisa-dlya-stroitelej","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\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 B2B \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0434\u043b\u044f \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u0435\u0439 | ProHoster","og:description":"\u041a\u0430\u043a \u0432\u044b\u0440\u0430\u0441\u0442\u0438 \u0432 10 \u0440\u0430\u0437 \u043f\u043e\u0434 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a \u0411\u0414 \u043d\u0435 \u043f\u0435\u0440\u0435\u0435\u0437\u0436\u0430\u044f \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u044b?","og:url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/optimizatsiya-zaprosov-bazy-dannyh-na-primere-b2b-servisa-dlya-stroitelej","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:13:15+00:00","article:modified_time":"2019-10-31T19:13:15+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"36704","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 04:30:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:40:22","updated":"2026-01-22 04:30: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\/36704","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=36704"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/36704\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/27493"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=36704"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=36704"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=36704"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}