{"id":2014,"date":"2017-10-05T20:48:28","date_gmt":"2017-10-05T17:48:28","guid":{"rendered":"http:\/\/www.profelis.com.tr\/tr\/blog\/?p=2014"},"modified":"2023-02-01T10:58:00","modified_gmt":"2023-02-01T07:58:00","slug":"postgresql-10-surumundeki-yenilikler","status":"publish","type":"post","link":"https:\/\/profelis.com.tr\/en\/2017\/10\/05\/postgresql-10-surumundeki-yenilikler\/","title":{"rendered":"PostgreSQL 10 S\u00fcr\u00fcm\u00fcndeki Yenilikler"},"content":{"rendered":"<h2>ostgreSQL 10 S\u00fcr\u00fcm\u00fcndeki Yenilikler<\/h2>\n<p><a href=\"https:\/\/www.postgresql.org\/community\/contributors\/\" target=\"_blank\" rel=\"noopener noreferrer\">PostgreSQL Geli\u015ftirici Grubu<\/a> <strong>PostgreSQL 10<\/strong> s\u00fcr\u00fcm\u00fcn\u00fc ve yeni eklenen \u00f6zellikleri duyurdu.\u00a0Bu s\u00fcr\u00fcmde ayr\u0131ca, yeni s\u00fcr\u00fcm stratejisinde x.y format\u0131na ge\u00e7ilmesine de karar verildi.\u00a0 Bu da bir sonraki min\u00f6r s\u00fcr\u00fcm\u00fcn 10.1 ve bir sonraki maj\u00f6r s\u00fcr\u00fcm\u00fcn 11 olmas\u0131 ve s\u00fcr\u00fcmlerin daha h\u0131zl\u0131 ilerlemesi anlam\u0131na da geliyor. Daha \u00f6nce min\u00f6r s\u00fcr\u00fcmler 9.3.4 gibi \u00e7\u0131k\u0131yor, maj\u00f6r s\u00fcr\u00fcmler de 9.4 \u015feklinde duyuruluyordu.<\/p>\n<h2>Mant\u0131ksal Replikasyon (Logical Replication) &#8211; Veri Da\u011f\u0131t\u0131m\u0131nda publish\/subscribe Altyap\u0131s\u0131<\/h2>\n<p>Mant\u0131ksal replikasyon ile PostgreSQL replikasyon yeteneklerine veritaban\u0131 baz\u0131nda ve hatta tablo seviyesinde bilgilendirme g\u00f6nderme yetisini eklemi\u015f oldu.\u00a0Kullan\u0131c\u0131lar art\u0131k istedikleri veritaban\u0131 k\u00fcmesine istedikleri seviyede veri replikasyonu yapabilecek ve bu sayede maj\u00f6r s\u00fcr\u00fcm g\u00fcncellemeleri yaparken sistemleri durdurmak zorunda kalmayacaklar, gereksiz downtime olu\u015fmayacak.<\/p>\n<h2>Beyana Dayal\u0131 Tablo B\u00f6l\u00fcmlendirme (Declarative Table Partitioning)<\/h2>\n<p>Tablo b\u00f6l\u00fcmlendirme uzun y\u0131llard\u0131r mevcuttu PostgreSQL&#8217;de. Ancak bu b\u00f6l\u00fcmlendirmelerde kullan\u0131c\u0131n\u0131n bir tak\u0131m tetikleyiciler (trigger) kullanmas\u0131, ve kurallara ba\u011f\u0131ml\u0131 olmas\u0131 s\u00f6z konusuydu. PostgreSQL 10 ile gelen tablo b\u00f6l\u00fcmlendirme yap\u0131s\u0131 ise kullan\u0131c\u0131lar\u0131n kolayca aral\u0131k (range) ve liste bazl\u0131 b\u00f6l\u00fcmlendirilmi\u015f tablolar olu\u015fturmas\u0131na izin veriyor.\u00a0Bu da daha olgun bir b\u00f6l\u00fcmlendirme s\u00f6z dizimi sa\u011fl\u0131yor, B\u00f6l\u00fcmlendirme ile ilgili ileri \u00f6zellikler i\u00e7in bu hen\u00fcz daha bir ba\u015flang\u0131\u00e7.<\/p>\n<h2>Geli\u015fmi\u015f Paralel Sorgular<\/h2>\n<p>PostgreSQL 10, sorgular\u0131n daha fazla b\u00f6l\u00fcm\u00fcn\u00fc paralel \u00e7al\u0131\u015ft\u0131rabilme yetene\u011fine kavu\u015ftu. geli\u015ftirmelerin bir b\u00f6l\u00fcm\u00fc veri tarama esnas\u0131nda paralel \u00e7al\u0131\u015fabilme, ve paralel veri tarama (scan) sonras\u0131 par\u00e7alar\u0131 birle\u015ftirirken optimize edilmi\u015f bir yap\u0131y\u0131 kaps\u0131yor. \u00d6rne\u011fin paralel sorgular ile bir tablodan yap\u0131lan ve s\u0131ralama i\u00e7eren sorgu paralel s\u00fcre\u00e7lerle \u00e7al\u0131\u015ft\u0131r\u0131l\u0131yor, d\u00f6nen veri par\u00e7alar\u0131 s\u0131ralamay\u0131 bozmadan bir araya getirilerek daha h\u0131zl\u0131 veri tarama sonu\u00e7 getirme sa\u011flan\u0131yor.<\/p>\n<pre><code>accounts=# \\timing\n Timing is on.\n accounts=# SELECT bid, count(*) FROM account_history WHERE delta &gt; 1000 group by bid;\n ...\n Time: 324.903 ms<\/code><\/pre>\n<p>Ayn\u0131 sorguyu 4 paralel sorgu ile \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131zda 4.5 kat daha h\u0131zl\u0131 sonu\u00e7 k\u00fcmesi getirebiliyoruz:<\/p>\n<pre><code>accounts=# set max_parallel_workers_per_gather=4;\n SET\n Time: 0.822 ms\n accounts=# SELECT bid, count(*) FROM account_history\n WHERE delta &gt; 1000 GROUP BY bid;\n...\nTime: 72.864 ms<\/code><\/pre>\n<p><em>\u00d6rnek Robert Haas\u00a0<a class=\"external text\" href=\"http:\/\/rhaas.blogspot.com.ar\/2017\/03\/parallel-query-v2.html\" rel=\"nofollow noopener\" target=\"_blank\">Parallel Query v2<\/a><\/em><em>\u00a0den al\u0131nm\u0131\u015ft\u0131r.<\/em><\/p>\n<h2>Senkron Replikasyonda \u00c7o\u011funluk Onay\u0131yla \u0130\u015flem (Quorum Commit)<\/h2>\n<p>PostgreSQL 10, senkron replikasyonda \u00e7o\u011funluk karar\u0131 ile onaylanm\u0131\u015f <strong>commit<\/strong> \u00f6zelli\u011fi getiriyor. Bu da birincil veritaban\u0131n\u0131n veri g\u00f6nderdi\u011fi replikalara yazma i\u015fleminin tamamland\u0131\u011f\u0131na karar vermesi i\u00e7in belirlenen say\u0131da replikadan onay almas\u0131n\u0131n yeterli olaca\u011f\u0131n\u0131 ve i\u015flemleri h\u0131zland\u0131raca\u011f\u0131n\u0131 anlat\u0131yor. Bu say\u0131ya veritaban\u0131 y\u00f6neticisi karar verecek,<\/p>\n<p>PostgreSQL 9.6 s\u00fcr\u00fcm\u00fcnde senkron replikasyonda uzak replikan\u0131n veriyi almas\u0131ndan \u00f6te, bunun diske yaz\u0131ld\u0131\u011f\u0131n\u0131n garantisini de verebilece\u011fi yeni bir yap\u0131 gelmi\u015fti.<\/p>\n<pre><code>synchronous_commit = 'remote_apply';\nsynchronous_standby_names = FIRST 2(node1,node2);<\/code><\/pre>\n<p>Performansa negatif etki etse dahi, veri kayb\u0131na kar\u015f\u0131 daha diren\u00e7li bir yap\u0131 oldu\u011fu i\u00e7in biz de baz\u0131 m\u00fc\u015fterilerimizde bu \u00f6zelli\u011fi kullan\u0131yorduk. \u015eimdi ise birden fazla replika varsa bu replikalardan x tanesi onay verirse, yani diske yazd\u0131ysa g\u00fcvenli olarak replikasyon i\u015fleminin tamamland\u0131\u011f\u0131na karar ver, geri kalanlar\u0131 bekleme sen devam et diyebiliyoruz. Bu da birincil \u00fczerindeki cevap bekleme s\u00fcresini k\u0131saltt\u0131\u011f\u0131 i\u00e7in performans\u0131 artt\u0131r\u0131yor.<\/p>\n<pre><code>synchronous_commit = 'remote_apply';\nsynchronous_standby_names = ANY 2(node1,node2,node3);<\/code><\/pre>\n<p><strong>FIRST<\/strong> parametresi daha \u00f6nceki maj\u00f6r s\u00fcr\u00fcmde &#8220;remote apply&#8221; i\u00e7in kulland\u0131\u011f\u0131m\u0131z parametreydi, \u015fimdi ek olarak ANY parametresi ile s\u0131ralama olmaks\u0131z\u0131n herhangi ikisine yazd\u0131\u011f\u0131nda g\u00fcvenli kabul et replikasyon i\u015flemini diyebiliyoruz.<\/p>\n<h2>JSON ve JSONB Alanlar i\u00e7in\u00a0Full Text Search Deste\u011fi<\/h2>\n<p>Daha \u00f6nce JSON deste\u011fi konusundaki yaz\u0131m\u0131z\u0131 &#8211;\u00a0<a href=\"http:\/\/www.profelis.com.tr\/tr\/blog\/yazi\/1982\/postgresql-json-veri-tipi-islemleri\/\">PostgreSQL \u2013 JSON Veri Tipi \u0130\u015flemleri<\/a> &#8211; okumad\u0131ysan\u0131z, PostgreSQL&#8217;in \u00e7ok g\u00fc\u00e7l\u00fc bir JSON veri tipi deste\u011fi oldu\u011funu bilmiyor olabilirsiniz. PostgreSQL Yap\u0131sal (Structural) Veritaban\u0131 i\u00e7erisinde \u00e7ok g\u00fc\u00e7l\u00fc bir \u015eemas\u0131z (NOSQL) veri deste\u011fi sunuyor. \u015eimdi ise bu JSON veri tipi olarak tan\u0131mlad\u0131\u011f\u0131n\u0131z alanlarda Full Text Search deste\u011fi var. Bu da arama sorgular\u0131n\u0131n \u00e7ok daha h\u0131zl\u0131 yap\u0131labilece\u011fi anlam\u0131na geliyor.<\/p>\n<h2>file_fdw Harici Uygulamay\u0131 \u00c7al\u0131\u015ft\u0131rabiliyor<\/h2>\n<p>FDW, yani Foreign Data Wrapper, benim tabirimle PostgreSQL&#8217;in Yabanc\u0131 Veri Paketleyicileri farkl\u0131 veritaban\u0131 veya dosya sistemlere ba\u011flanarak veri almay\u0131, sorgulamay\u0131 m\u00fcmk\u00fcn hale getiren ara\u00e7lard\u0131r. Bu konuda daha detayl\u0131 bilgi almak i\u00e7in:\u00a0<a href=\"http:\/\/www.profelis.com.tr\/tr\/blog\/yazi\/1893\/postgresqlin-yabanci-veri-paketleyicileri-foreign-data-wrappers\/\">PostgreSQL\u2019in Yabanc\u0131 Veri Paketleyicileri \u2013 Foreign Data Wrappers<\/a> yaz\u0131m\u0131za bakabilirsiniz.<\/p>\n<pre><code>CREATE FOREIGN TABLE\n   test(a int, b text)\n   SERVER csv\n   OPTIONS (program 'gunzip -c \/tmp\/data.czv.gz');<\/code><\/pre>\n<p>File FDW, sunucunun dosya sistemindeki bir dosya i\u00e7eri\u011finden, uygulaman\u0131n \u00e7\u0131kt\u0131s\u0131ndan veya <em><strong>art\u0131k<\/strong><\/em> bu dosyan\u0131n farkl\u0131 bir uygulama ile \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131ndan ortaya \u00e7\u0131kan \u00e7\u0131kt\u0131n\u0131n okunmas\u0131 ve veri olarak i\u00e7eri al\u0131nmas\u0131, tablo gibi sorgulanabilmesini sa\u011flayan fevkalade bir ara\u00e7.<\/p>\n<blockquote><p>The\u00a0<code class=\"filename\">file_fdw<\/code>\u00a0module provides the foreign-data wrapper\u00a0<code class=\"function\">file_fdw<\/code>, which can be used to access data files in the server&#8217;s file system, or to execute programs on the server and read their output. The data file or program output must be in a format that can be read by\u00a0<code class=\"command\">COPY FROM<\/code>; see\u00a0<a class=\"xref\" title=\"COPY\" href=\"https:\/\/www.postgresql.org\/docs\/current\/static\/sql-copy.html\" target=\"_blank\" rel=\"noopener\"><span class=\"refentrytitle\">COPY<\/span><\/a>\u00a0for details. Access to data files is currently read-only. Source:\u00a0<a href=\"https:\/\/www.postgresql.org\/docs\/current\/static\/file-fdw.html\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/www.postgresql.org\/docs\/current\/static\/file-fdw.html<\/a><\/p><\/blockquote>\n<h2>SCRAM-SHA-256 Yetkilendirme<\/h2>\n<p>Salted Challenge Response Authentication Mechanism (SCRAM) olarak RFC5802 ile tan\u0131mlanm\u0131\u015f olan yetkilendirme mekanizmas\u0131, art\u0131k rahatl\u0131kla MD5 yerine kullan\u0131labilir. MD5&#8217;e g\u00f6re \u00e7ok daha g\u00fcvenli bir parola iletimi y\u00f6ntemi sunan SCRAM kullan\u0131m\u0131 i\u00e7in istemci taraf\u0131nda SCRAM deste\u011finin olmas\u0131 gerekti\u011fini hat\u0131rlatal\u0131m.<\/p>\n<h2>Yeni \u0130zleme \u00d6zellikleri<\/h2>\n<p>pg_stat_activity&#8217;den daha \u00f6nce bahsetmi\u015ftik.\u00a0PostgreSQL sistem g\u00f6r\u00fcn\u00fcmlerinden birisi olan\u00a0<strong>pg_stat_activity<\/strong>\u00a0\u00e7al\u0131\u015fmakta olan t\u00fcm PostgreSQL arka plan i\u015flemlerinin bir listesini tutar. Bu i\u015flemlere hangi sorgular\u0131n \u00e7al\u0131\u015fmakta oldu\u011fu, ba\u011fl\u0131 olan kullan\u0131c\u0131lar ve ne zaman ba\u011fland\u0131klar\u0131, \u00e7al\u0131\u015fmakta olan i\u015flem (transaction) ve sorgular\u0131n ba\u015flang\u0131\u00e7 zaman\u0131 gibi bilgiler dahildir.<\/p>\n<p>PostgreSQL 10 da gelen yeni \u00f6zelliklerden kaynakl\u0131 olarak pg_stat_activity g\u00f6r\u00fcn\u00fcm\u00fc art\u0131k \u015fu bilgileri de i\u00e7eriyor:<\/p>\n<ul>\n<li>auxiliary processes<\/li>\n<li>worker processes<\/li>\n<li>WAL senders<\/li>\n<\/ul>\n<p>Daha detayl\u0131 PostgreSQL izleme \u00f6zellikleri i\u00e7in\u00a0<a href=\"http:\/\/www.profelis.com.tr\/tr\/blog\/yazi\/1961\/postgresql-101-aktivite-izleme\/\" target=\"_blank\" rel=\"noopener noreferrer\">PostgreSQL 101: Aktivite \u0130zleme<\/a> yaz\u0131m\u0131za bakabilirsiniz.<\/p>","protected":false},"excerpt":{"rendered":"<p>PostgreSQL\u2019in yeni maj\u00f6r s\u00fcr\u00fcm\u00fc 10 yay\u0131nland\u0131. PostgreSQL 10 ile beraber gelen bir\u00e7ok yenilik aras\u0131nda fiziksel replikasyona alternatif olabilecek ve maj\u00f6r g\u00fcncellemelerde dahi kesintisiz ge\u00e7i\u015f vaadeden esnek mant\u0131ksal replikasyon \u00f6ne \u00e7\u0131k\u0131yor. Ayr\u0131ca, tablo inheritance yerine partition deste\u011finin geldi\u011fi, paralel sorgu yetene\u011finin iyile\u015ftirildi\u011fini, senkron replikasyonlar i\u00e7in \u201cquorum commit\u201d \u00f6zelli\u011fi ile \u00e7ok say\u0131da veritaban\u0131na verinin yaz\u0131ld\u0131\u011f\u0131n\u0131n garanti edilmesi \u00f6zelli\u011finin de geldi\u011fini belirtelim.<\/p>","protected":false},"author":3,"featured_media":2081,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[75,45],"tags":[48,60],"class_list":["post-2014","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-postgresql","category-yazi","tag-enterprisedb","tag-postgresql"],"_links":{"self":[{"href":"https:\/\/profelis.com.tr\/en\/wp-json\/wp\/v2\/posts\/2014","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/profelis.com.tr\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/profelis.com.tr\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/profelis.com.tr\/en\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/profelis.com.tr\/en\/wp-json\/wp\/v2\/comments?post=2014"}],"version-history":[{"count":0,"href":"https:\/\/profelis.com.tr\/en\/wp-json\/wp\/v2\/posts\/2014\/revisions"}],"wp:attachment":[{"href":"https:\/\/profelis.com.tr\/en\/wp-json\/wp\/v2\/media?parent=2014"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/profelis.com.tr\/en\/wp-json\/wp\/v2\/categories?post=2014"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/profelis.com.tr\/en\/wp-json\/wp\/v2\/tags?post=2014"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}