{"id":79028,"date":"2020-04-23T19:43:19","date_gmt":"2020-04-23T17:43:19","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/pishem-v-postgresql-na-subsvetovoj-1-host-1-day-1tb"},"modified":"2020-04-23T19:43:19","modified_gmt":"2020-04-23T17:43:19","slug":"pishem-v-postgresql-na-subsvetovoj-1-host-1-day-1tb","status":"publish","type":"post","link":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/pishem-v-postgresql-na-subsvetovoj-1-host-1-day-1tb","title":{"rendered":"Escribiendo en PostgreSQL a luz de la velocidad: 1 host, 1 d\u00eda, 1TB","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Recientemente habl\u00e9 sobre c\u00f3mo aumentar el rendimiento de las consultas SQL \"de lectura\" <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/tensor\/blog\/492694\/\">de la base de datos PostgreSQL. Hoy hablar\u00e9 sobre c\u00f3mo<\/a><\/noindex> hacer la grabaci\u00f3n <b>en la base de datos sin usar ning\u00fan tipo de \"ajustes\" en la configuraci\u00f3n, simplemente organizando correctamente los flujos de datos.<\/b> Este art\u00edculo trata sobre c\u00f3mo y por qu\u00e9 se debe organizar el<\/p>\n<p><img decoding=\"async\" alt=\"Escribiendo en PostgreSQL a luz de la velocidad: 1 host, 1 d\u00eda, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/cbebbe0ed0e9a6590a4e8dd144f82f40.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>#1. \u0421\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/h2>\n<p>\naplicativo particionado \"en teor\u00eda\" <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/483170\/\">ya fue publicado, aqu\u00ed hablar\u00e9 sobre la pr\u00e1ctica de aplicar algunos enfoques dentro de nuestro<\/a><\/noindex> servicio de monitoreo de cientos de servidores PostgreSQL. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/487380\/\">\"Los d\u00edas pasados\u2026\"<\/a><\/noindex>.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h4>\u00abCosas de d\u00edas pasados\u2026\u00bb<\/h4>\n<p>\ntablas de 1.5TB, <b>nos dimos cuenta de que vivir as\u00ed era posible, pero muy inc\u00f3modo.<\/b>Los tiempos eran casi legendarios, diferentes versiones de PostgreSQL 9.x eran relevantes, por lo que toda la partici\u00f3n tuvo que hacerse \"manualmente\" \u2014 a trav\u00e9s de<\/p>\n<p>herencia de tablas y disparadores <b>de enrutamiento din\u00e1mico.<\/b> EXECUTE <code>El resultado fue una soluci\u00f3n bastante universal que se pod\u00eda trasladar a todas las tablas:<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"Escribiendo en PostgreSQL a luz de la velocidad: 1 host, 1 d\u00eda, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/a480e75ccec73080aa2d0be1435d2a2e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSe declar\u00f3 una tabla vac\u00eda \"padre\" en la que se describ\u00edan todos los<\/p>\n<ul>\n<li>\u00edndices y disparadores necesarios. <b>Los registros desde la perspectiva del cliente se realizaban en la tabla \"ra\u00edz\", y dentro, mediante<\/b>.<\/li>\n<li>el disparador de enrutamiento <b>BEFORE INSERT,<\/b> <code>el registro se insertaba \"f\u00edsicamente\" en la secci\u00f3n correcta. Si esta no exist\u00eda a\u00fan, capturamos la excepci\u00f3n y...<\/code> la entrada se insertaba \u00abf\u00edsicamente\u00bb en la secci\u00f3n necesaria. Si a\u00fan no exist\u00eda dicha secci\u00f3n, captur\u00e1bamos la excepci\u00f3n y\u2026<\/li>\n<li>CREATE TABLE ... (LIKE ... INCLUDING ...) <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/492464\/\"><code>se creaba una<\/code><\/a><\/noindex> secci\u00f3n con una restricci\u00f3n a la fecha deseada, <b>para que al extraer datos, la lectura se realizara solo en ella.<\/b>PG10: primer intento<\/li>\n<\/ul>\n<p><\/p>\n<h4>Pero la partici\u00f3n a trav\u00e9s de herencia hist\u00f3ricamente no estaba bien adaptada para trabajar con flujos activos de escritura o un gran n\u00famero de secciones descendientes. Por ejemplo, se puede recordar que el algoritmo para elegir la secci\u00f3n correcta ten\u00eda<\/h4>\n<p>\nuna complejidad cuadr\u00e1tica, <b>lo que con 100+ secciones funciona, como pueden imaginar...<\/b>En PG10, esta situaci\u00f3n se optimiz\u00f3 significativamente, implementando el soporte para<\/p>\n<p>particionamiento nativo. <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/10\/ddl-partitioning\">seccionamiento nativo<\/a><\/noindex>. Por lo tanto, lo intentamos de inmediato despu\u00e9s de la migraci\u00f3n del almacenamiento, pero\u2026<\/p>\n<p>Como descubrimos tras revisar el manual, la tabla seccionada de forma nativa en esta versi\u00f3n:<\/p>\n<ul>\n<li>no admite la descripci\u00f3n de \u00edndices<\/li>\n<li>no admite triggers<\/li>\n<li>no puede ser en s\u00ed misma un \u00abdescendiente\u00bb<\/li>\n<li>no admite <code>INSERT ... ON CONFLICT<\/code><\/li>\n<li>no puede generar secciones autom\u00e1ticamente<\/li>\n<\/ul>\n<p>\nDespu\u00e9s de recibir un golpe en la frente con los rastrillos, entendimos que ser\u00eda imposible evitar modificaciones en la aplicaci\u00f3n y pospusimos m\u00e1s investigaciones durante seis meses.<\/p>\n<h4>PG10: segunda oportunidad<\/h4>\n<p>\nAs\u00ed que comenzamos a resolver los problemas que surgieron uno por uno:<\/p>\n<ol>\n<li>Dado que los triggers y <code>ON CONFLICT<\/code> resultaron ser necesarios en algunas situaciones, creamos una <b>tabla intermedia<\/b>.<\/li>\n<li><b>Eliminamos el \u00abenrutamiento\u00bb<\/b> en los triggers \u2014 es decir, de <code>El resultado fue una soluci\u00f3n bastante universal que se pod\u00eda trasladar a todas las tablas:<\/code>.<\/li>\n<li>Lo separamos <b>en una tabla plantilla con todos los \u00edndices<\/b>, para que ni siquiera estuvieran presentes en la tabla intermedia.<\/li>\n<\/ol>\n<p>\n<img decoding=\"async\" alt=\"Escribiendo en PostgreSQL a luz de la velocidad: 1 host, 1 d\u00eda, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/db3118798357575568489f6b575373b6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nFinalmente, despu\u00e9s de todo esto, seccionamos la tabla principal de forma nativa. La creaci\u00f3n de una nueva secci\u00f3n a\u00fan qued\u00f3 a cargo de la aplicaci\u00f3n.<\/p>\n<h4>Estamos \u00abdesarrollando\u00bb diccionarios<\/h4>\n<p>\nComo en cualquier sistema anal\u00edtico, tambi\u00e9n ten\u00edamos <b>\u00abhechos\u00bb y \u00abdimensiones\u00bb<\/b> (diccionarios). En nuestro caso, como tal, actuaban, por ejemplo, <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/5XKbFb-l5Do?t=2487\">el cuerpo del \u00abmodelo\u00bb<\/a><\/noindex> de consultas lentas similares o el texto de la propia consulta.<\/p>\n<p>Los \u00abhechos\u00bb hab\u00edan sido seccionados por d\u00edas desde hace tiempo, por lo que elimin\u00e1bamos tranquilamente las secciones obsoletas y no nos molestaban (\u00a1son solo logs!). Pero tuvimos problemas con los diccionarios\u2026<\/p>\n<p>No dir\u00eda que eran excesivamente numerosos, pero aproximadamente <b>por cada 100TB de \u00abhechos\u00bb hab\u00eda un diccionario de 2.5TB.<\/b>Con tal tabla, no puedes eliminar f\u00e1cilmente nada, ni comprimirla en un tiempo razonable, y adem\u00e1s, las escrituras se volv\u00edan gradualmente m\u00e1s lentas.<\/p>\n<p>Parece un diccionario\u2026 cada registro debe estar representado exactamente una vez\u2026 y eso es correcto, \u00a1pero!... Nadie impide que tengamos <b>un diccionario separado para cada d\u00eda<\/b>! S\u00ed, esto trae cierta redundancia, pero permite:<\/p>\n<ul>\n<li><b>escribir\/leer m\u00e1s r\u00e1pido<\/b> gracias al menor tama\u00f1o de la secci\u00f3n<\/li>\n<li><b>consumir menos memoria<\/b> gracias a trabajar con \u00edndices m\u00e1s compactos<\/li>\n<li><b>almacenar menos datos<\/b> gracias a la posibilidad de eliminar r\u00e1pidamente lo obsoleto<\/li>\n<\/ul>\n<p>\nComo resultado de todas estas medidas <b>la carga de la CPU se redujo en ~30%, y en el disco \u2014 en ~50%<\/b>:<\/p>\n<p><img decoding=\"async\" alt=\"Escribiendo en PostgreSQL a luz de la velocidad: 1 host, 1 d\u00eda, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/fd3a219a304dc46173a7eb435502fe02.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nMientras tanto, continuamos escribiendo en la base de datos exactamente lo mismo, solo que con menos carga.<\/p>\n<h2>#2. \u042d\u0432\u043e\u043b\u044e\u0446\u0438\u044f \u0438 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433 \u0411\u0414<\/h2>\n<p>\nAs\u00ed que, nos quedamos en que tenemos <b>una secci\u00f3n para cada d\u00eda<\/b> con datos. En realidad, <code>CHECK (dt = '2018-10-12'::date)<\/code> \u2014 y es la clave de partici\u00f3n y la condici\u00f3n para que un registro caiga en una secci\u00f3n espec\u00edfica.<\/p>\n<p>Dado que todos los informes en nuestro servicio se construyen en funci\u00f3n de una fecha espec\u00edfica, los \u00edndices desde los \u201ctiempos no particionados\u201d tambi\u00e9n eran de tipo <i>(Servidor, <b>Fecha<\/b>, Plantilla del plan)<\/i>, <i>(Servidor, <b>Fecha<\/b>, Nodo del plan)<\/i>, <i>(<b>Fecha<\/b>, Clase de error, Servidor)<\/i>,\u2026<\/p>\n<p>Pero ahora en cada secci\u00f3n viven <u>sus propias instancias<\/u> de cada uno de esos \u00edndices... Y dentro de cada secci\u00f3n <u>la fecha es una constante<\/u>\u2026 Resulta que ahora estamos escribiendo una constante <b>simplemente como uno de los campos en cada \u00edndice, lo que aumenta tanto su tama\u00f1o como el tiempo de b\u00fasqueda, pero no aporta ning\u00fan resultado. Nos hemos dejado las trampas, ups...<\/b> La direcci\u00f3n de optimizaci\u00f3n es obvia: simplemente<\/p>\n<p><img decoding=\"async\" alt=\"Escribiendo en PostgreSQL a luz de la velocidad: 1 host, 1 d\u00eda, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/c7644644b960c568c4adaeec57cfef2d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\neliminar el campo de fecha de todos los \u00edndices <b>en las tablas particionadas. Con nuestros vol\u00famenes, el ahorro es del orden de<\/b> 1TB\/semana <b>Y ahora notemos que este terabyte a\u00fan ha tenido que ser registrado de alguna manera. Es decir, ahora tambi\u00e9n tenemos que<\/b>!<\/p>\n<p>cargar menos el disco <b>! En esta imagen se puede ver bien el efecto obtenido de la limpieza realizada, a la que dedicamos una semana:<\/b>Uno de los grandes problemas de los sistemas sobrecargados es la<\/p>\n<p><img decoding=\"async\" alt=\"Escribiendo en PostgreSQL a luz de la velocidad: 1 host, 1 d\u00eda, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/f45e3b26337074a07751ea28961009bf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>#3. \u00ab\u0420\u0430\u0437\u043c\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u00bb \u043f\u0438\u043a\u043e\u0432\u0443\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443<\/h2>\n<p>\nsincronizaci\u00f3n excesiva <b>de algunas operaciones que no lo requieren. A veces \u201cporque no lo notaron\u201d, otras \u201cporque era m\u00e1s f\u00e1cil\u201d, pero tarde o temprano hay que deshacerse de ella.<\/b> Acercamos la imagen anterior y vemos que el disco est\u00e1<\/p>\n<p>\u201ccargando\u201d con una carga de amplitud doble <b>entre las mediciones adyacentes, lo cual claramente \u201cestad\u00edsticamente\u201d no deber\u00eda ocurrir con tal cantidad de operaciones:<\/b> Lograr esto es bastante sencillo. Ya ten\u00edamos en monitoreo cerca de<\/p>\n<p><img decoding=\"async\" alt=\"Escribiendo en PostgreSQL a luz de la velocidad: 1 host, 1 d\u00eda, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/ac3f19213cba0f111864c6dbf9a73912.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n1000 servidores <b>, cada uno proces\u00e1ndose en un flujo l\u00f3gico separado, y cada flujo descarga la informaci\u00f3n acumulada para enviarla a la base de datos con una periodicidad determinada, aproximadamente as\u00ed:<\/b>setInterval(sendToDB, interval)<\/p>\n<pre><code class=\"javascript\">El problema aqu\u00ed radica exactamente en que<\/code><\/pre>\n<p>\ntodos los flujos comienzan aproximadamente al mismo tiempo <b>, por lo que los momentos de env\u00edo casi siempre coinciden \u201chasta el \u00faltimo punto\u201d. Ups n\u00ba 2...<\/b>Afortunadamente, esto se puede corregir bastante f\u00e1cil,<\/p>\n<p>agregando un \u201cdesfase\u201d <b>aleatorio en el tiempo:<\/b> setInterval(sendToDB, interval * (1 + 0.1 * (Math.random() - 0.5)))<\/p>\n<pre><code class=\"javascript\">El tercer problema tradicional de alta carga es la<\/code><\/pre>\n<p><\/p>\n<h2>#4. \u041a\u044d\u0448\u0438\u0440\u0443\u0435\u043c, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043c\u043e\u0436\u043d\u043e<\/h2>\n<p>\nausencia de cach\u00e9 <b>donde podr\u00eda<\/b> estar. <i>haber<\/i> ser.<\/p>\n<p>Por ejemplo, hemos habilitado el an\u00e1lisis seg\u00fan los nodos del plan (todos estos <code>Seq Scan en usuarios<\/code>), pero pensar de inmediato que son, en su mayor\u00eda, iguales \u2014 se olvidaron.<\/p>\n<p>No, por supuesto, en la base no se escriben datos nuevamente, esto anula el disparador con <code>INSERT ... ON CONFLICT DO NOTHING<\/code>. Pero esos datos, de todos modos, llegan a la base, y hay una lectura adicional <b>para verificar el conflicto<\/b> que hay que hacer. Ups N\u00ba 3\u2026<\/p>\n<p>La diferencia en la cantidad de registros enviados a la base antes\/despu\u00e9s de activar la cach\u00e9 es evidente:<\/p>\n<p><img decoding=\"async\" alt=\"Escribiendo en PostgreSQL a luz de la velocidad: 1 host, 1 d\u00eda, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/37fa7e64a674f03a79f2765a79ec8138.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nY esto es \u2014 una ca\u00edda relacionada en la carga del almacenamiento:<\/p>\n<p><img decoding=\"async\" alt=\"Escribiendo en PostgreSQL a luz de la velocidad: 1 host, 1 d\u00eda, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/b2c563b4b41755211e77768d80f8702f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Total<\/h2>\n<p>\n\u00abTerabyte-por-d\u00eda\u00bb suena aterrador. Si haces todo correctamente, en realidad esto es solo <b>2^40 bytes \/ 86400 segundos = ~12.5MB\/s<\/b>, que incluso los discos duros IDE de escritorio pod\u00edan soportar. \ud83d\ude42<\/p>\n<p>Y si hablamos en serio, incluso con un \u00abdesbalance\u00bb de carga diez veces mayor durante un d\u00eda, puedes estar tranquilo en las capacidades de los SSD modernos.<\/p>\n<p><img decoding=\"async\" alt=\"Escribiendo en PostgreSQL a luz de la velocidad: 1 host, 1 d\u00eda, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/6f3f8d4636ba50f3d5401bf4e456757f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/497008\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041d\u0435\u0434\u0430\u0432\u043d\u043e \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b, \u043a\u0430\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u0438\u043f\u043e\u0432\u044b\u0445 \u0440\u0435\u0446\u0435\u043f\u0442\u043e\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u00ab\u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435\u00bb \u0438\u0437 PostgreSQL-\u0431\u0430\u0437\u044b. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0436\u0435 \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0411\u0414 \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u00ab\u043a\u0440\u0443\u0442\u0438\u043b\u043e\u043a\u00bb \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0435 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0432 \u043f\u043e\u0442\u043e\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. #1. \u0421\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0421\u0442\u0430\u0442\u044c\u044f \u043f\u0440\u043e \u0442\u043e, \u043a\u0430\u043a \u0438 \u0437\u0430\u0447\u0435\u043c \u0441\u0442\u043e\u0438\u0442 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u0435 \u0441\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u00ab\u0432 \u0442\u0435\u043e\u0440\u0438\u0438\u00bb [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":79029,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-79028","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=\"\u041d\u0435\u0434\u0430\u0432\u043d\u043e \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b, \u043a\u0430\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u0438\u043f\u043e\u0432\u044b\u0445 \u0440\u0435\u0446\u0435\u043f\u0442\u043e\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u00ab\u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435\u00bb \u0438\u0437.\" \/>\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\/es\/blog\/administrirovanie\/pishem-v-postgresql-na-subsvetovoj-1-host-1-day-1tb\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041f\u0438\u0448\u0435\u043c \u0432 PostgreSQL \u043d\u0430 \u0441\u0443\u0431\u0441\u0432\u0435\u0442\u043e\u0432\u043e\u0439: 1 host, 1 day, 1TB | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041d\u0435\u0434\u0430\u0432\u043d\u043e \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b, \u043a\u0430\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u0438\u043f\u043e\u0432\u044b\u0445 \u0440\u0435\u0446\u0435\u043f\u0442\u043e\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u00ab\u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435\u00bb \u0438\u0437.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/pishem-v-postgresql-na-subsvetovoj-1-host-1-day-1tb\" \/>\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=\"2020-04-23T17:43:19+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-04-23T17:43:19+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\udd47Escribiendo en PostgreSQL a velocidad subluminal: 1 host, 1 d\u00eda, 1TB | ProHoster","description":"Recientemente cont\u00e9 c\u00f3mo, utilizando recetas t\u00edpicas, aumentar el rendimiento de las consultas SQL \u00abde lectura\u00bb desde.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/pishem-v-postgresql-na-subsvetovoj-1-host-1-day-1tb","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041f\u0438\u0448\u0435\u043c \u0432 PostgreSQL \u043d\u0430 \u0441\u0443\u0431\u0441\u0432\u0435\u0442\u043e\u0432\u043e\u0439: 1 host, 1 day, 1TB | ProHoster","og:description":"\u041d\u0435\u0434\u0430\u0432\u043d\u043e \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b, \u043a\u0430\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u0438\u043f\u043e\u0432\u044b\u0445 \u0440\u0435\u0446\u0435\u043f\u0442\u043e\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u00ab\u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435\u00bb \u0438\u0437.","og:url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/pishem-v-postgresql-na-subsvetovoj-1-host-1-day-1tb","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":"2020-04-23T17:43:19+00:00","article:modified_time":"2020-04-23T17:43:19+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"79028","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":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 16:46:34","updated":"2022-10-01 20:30:41","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/79028","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=79028"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/79028\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/79029"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=79028"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=79028"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=79028"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}