بعد التنفيذ الناجح للتجربة الثالثة في آب/أغسطس 2024، أصدر مجموعة تطوير PostgreSQL النسخة العامة في 26 سبتمبر. ومؤخرًا، كنت أدون عن بعض من الميزات الأساسية للتنسيق المنطقي والتي سترونها في PostgreSQL 17. في هذا المدون، سأصف بعض الميزات الجديدة للأداء التي ستجدونها في Postgres 17 وأيضًا ميزة أساسية للتنسيق المنطقي لم أتحدث عنها في مدونتي السابقة لهذه السلسلة.
نما قام PostgreSQL بالنمو الكبير عبر السنوات، ومع كل إصدار رئيسي يصبح أكثر قوةً وموثوقيةً وتفاعليةً للبases التي تستخدم في التطبيقات العامة وغير العامة. تساهم مجموعة الPostgreSQL العالمية والحيوية في نجاح PostgreSQL بتوثيق دوائنا ومراجعة التغييرات قبل إضافتها إلى مصادر المشروع. وهو أيضًا من المحمسين رؤية أسماء التكنولوجيا الكبيرة مثل Microsoft و Google و Apple وغيرها تساهم في Postgres عن طريق تطوير المهارات الداخلية والمساهمة في المجتمع المفتوح المصدر.
التحسينات في التنسيق المنطقي الجديدة تشير إلى إضافة دعم الPostgreSQL الموزع إلى الوظائف الأساسية. يشير الPostgreSQL الموزع إلى تطوير PostgreSQL في تنظيم موزع، مما يسمح لنا بالمتسعة الأفضل والمراقبة الجاهزة والأداء المباشر عبر عدة نوادي.
والآن دون أي تأهب، دعونا نتحدث عن بعض ميزات أداء PostgreSQL 17.
تحسين أداء التساؤلات بواسطة المادة الموازية للتنسيق المنطقي.
المعادلات الجانبية المشتركة (CTEs) في PostgreSQL هي مجموعات نتائج مؤقتة يمكن استخدامها في أعمال برمجية SELECT
, INSERT
, UPDATE
, أو DELETE
. إنها تحسن قابلية القراءة وتنظم الأسئلة المعقدة ويمكن أن تكون تتداعية، مما يجعلها خيالية للبيانات الهرمية. تشكيل برمجية الCTE الأساسي هو ما يلي:
WITH cte_names AS
(– QUERY here )
Select * from cte_names;
قم بتضمين كلمة WITH
في عملية البحث لخلق الCTE؛ يتبع البحث الأب لمجموعة النتائج المحددة (التي تحدد المجموعة النتائج) بعد العبارة AS
بعد اسم الCTE. بعد تعريف الCTE يمكنك أن تشير إلى الCTE بالإسم لتتعرف على مجموعة النتائج للCTE وتقوم بالعمليات التالية على المجموعة النتائج في نفس البحث.
PostgreSQL 17 تستمر في تحسين الأداء وقدرات الCTEs بشكل شامل، بما في ذلك تحسينات في خطة البحث وتنفيذها. إن الأصدقاء القدامية لPostgres تعامل مع CTEs كإغلاقات تحسين التخطيط، مما يعني أن الخطة التحكمي لم يتمكن من توزيع المعايير إلىها. مع PostgreSQL 12 بعد، يمكنك تعريف خطط تنفيذ أكثر فعالية. يجب دائمًا تحليل أعمالك واخذ خطط التنفيذ في الاعتبار عندما يكون الأداء المهم.
تقنية أفضل أداء: إذا كنت سترجع إلى نفس المجموعة الناتجة مرات عديدة، قم بإنشاء المجموعة المستنزفة (CTE) بواسطة الكلمة الخاصة MATERIALIZED
. حينما تقم بإنشاء CTE مستنزفة، يقوم Postgres بحساب وتخزين نتيجة ال consulta الوالدة. ثم، لا يتوجب على ال consultas التالية عمل محاسن معقدة مرات عديدة إذا استخدمت المجموعة المستنزفة مرات عديدة.
تحصيل إحصاءات الأعمدة من اشتراكات CTE، يحسن Postgres 17 المجموعات المستنزفة
المجموعة المستنزفة تعمل بشكل قائم بالتحسين، ما يعني أن ال consulta الخارجية لن تؤثر على خطة ال sub-query بما تبرر خطته. ال consulta الخارجية تمتلك بصورة مباشرة رؤية عن الأعداد والأعمدة المتوقعة لنتيجة المجموعة المستنزفة، لذلك يمكن التبرير بتنسيق إحصاءات الأعمدة من ال sub-query للخطة التحقيقية لل consulta الخارجية. ال consulta الخارجية يمكن أن تستخدم أي معلومات متاحة، مما يسمح لمعلومات إحصاءات الأعمدة بتبريرها إلى ال consulta الخارجية لكن لا تبريرها إلىخطة المجموعة المستنزفة.
هذا الخطأ أبلغ المجموعةيحوي حالة اختبار بسيطة يمكن أن توضح التحسين وآثاره على خطة البحث الناتجة من هذا التحسين.
مثال: مقارنة سلوك Postgres 16 مع Postgres 17
أولاً، نقم بإنشاء مساحة عمل Postgres 16 ونجري ANALYZE
ضدها؛ عشر أجهزة ومؤشرات:
postgres=# create table t1(a int);
CREATE TABLE
postgres=# create table t2(b int);
CREATE TABLE
postgres=# create index my_index on t1 using btree (a);
CREATE INDEX
postgres=# insert into t1 select generate_series(1, 100000) from generate_series(1, 3);
INSERT 0 300000
postgres=# insert into t2 select generate_series(1, 100) from generate_series(1, 10);
INSERT 0 1000
postgres=# analyze t1;
ANALYZE
postgres=# analyze t2;
ANALYZE
Then, we create our materialized CTE:
postgres=# explain analyze with my_cte as materialized (select b from t2) select *
from t1 where t1.a in (select b from my_cte);
The query plan from our Postgres 16 code sample contains:
QUERY PLAN
----------------------------------------------------------------------
Nested Loop (cost=37.92..856.50 rows=2966 width=4) (actual time=0.574..0.722 rows=300 loops=1)
CTE my_cte
-> Seq Scan on t2 (cost=0.00..15.00 rows=1000 width=4) (actual time=0.038..0.161 rows=1000 loops=1)
-> HashAggregate (cost=22.50..24.50 rows=200 width=4) (actual time=0.449..0.461 rows=100 loops=1)
Group Key: my_cte.b
Batches: 1 Memory Usage: 40kB
-> CTE Scan on my_cte (cost=0.00..20.00 rows=1000 width=4) (actual time=0.046..0.322 rows=1000 loops=1)
-> Index Only Scan using my_index on t1 (cost=0.42..4.06 rows=3 width=4) (actual time=0.002..0.002 rows=3 loops=1
00)
Index Cond: (a = my_cte.b)
Heap Fetches: 0
Planning Time: 1.242 ms
Execution Time: 1.051 ms
(12 rows)
وكما ترون فيخطة الاستعلام، إحصاءات الأعمدة لـ 200 سطر من العملية الفرعية خاطئة، وهذا يؤثر على الخطة العامة.
-> HashAggregate (cost=22.50..24.50 rows=200 width=4) (actual time=0.449..0.461 rows=100 loops=1)
Group Key: my_cte.b
بعد ذلك، قمنا باختبار نفس الإعدادة والاستعلام ضد PostgreSQL 17:
postgres=# explain analyze with my_cte as materialized (select b from t2) select *
from t1 where t1.a in (select b from my_cte);
QUERY PLAN
-------------------------------------------------------------------------------------------------
---------------------------------
Merge Join (cost=42.25..54.29 rows=302 width=4) (actual time=0.627..0.712 rows=300 loops=1)
Merge Cond: (t1.a = my_cte.b)
CTE my_cte
-> Seq Scan on t2 (cost=0.00..15.00 rows=1000 width=4) (actual time=0.031..0.134 rows=1000
loops=1)
-> Index Only Scan using my_index on t1 (cost=0.42..7800.42 rows=300000 width=4) (actual tim
e=0.027..0.049 rows=301 loops=1)
Heap Fetches: 0
-> Sort (cost=26.82..27.07 rows=100 width=4) (actual time=0.598..0.604 rows=100 loops=1)
Sort Key: my_cte.b
Sort Method: quicksort Memory: 25kB
-> HashAggregate (cost=22.50..23.50 rows=100 width=4) (actual time=0.484..0.494 rows=1
00 loops=1)
Group Key: my_cte.b
Batches: 1 Memory Usage: 24kB
-> CTE Scan on my_cte (cost=0.00..20.00 rows=1000 width=4) (actual time=0.033..0
.324 rows=1000 loops=1)
Planning Time: 1.066 ms
Execution Time: 0.946 ms
(15 rows)
وكما ترون في خطة الاستعلام ل Postgres 17، تتم تبليغ إحصاءات الأعمدة من العملية الفرعية إلى مخطط الخطة العام للاستعلام الخارجي. هذا يساعد PostgreSQL في اختيار خطة أفضل التي تحسن وقت تنفيذ الاستعلام.
هذا هو استعمال بسيط للخطة، ولكن مع أعمال الخوارزميات الكبيرة والمعقدة، قد ينتج هذا التغيير فرص أفضل في الأداء الكبيرة.
تبليغ باتخاذات المسار من مجموعة تحديدية للخطة الخارجية
ومن الأحدث التحسينات في وظيفة مجموعات تحديدية في Postgres 17 هو تبليغ باتخاذات المسار من العملية الفرعية إلى الخطة الخارجية. في PostgreSQL، تشكل باتخاذات المسار جزءًا من عملية تخطيط البحث المستخدم للترتيب والترتيب الأعمدة في البحث الذي يتطلب نتائج مرتبطة بالترتيب، مثل البحث الذي يحتوي على عملية ORDER BY
، أو عندما يتوجب الترتيب لأعمال أخرى مثل مزامنة تراكمية.
وقبل Postgres 17، لم يتم مشاركة ترتيب توليد المجموعة التحديدية المواديزة مع الخطة الخارجية، 即使الترتيب كان ضمن التأكيد من عملية قراءة الفهرس أو عملية الترتيب. عدم وجود ترتيب ضمن التأكيد يسمح لمخطّط PostgreSQL باختيار خطة أقل
مع PostgreSQL 17، إذا تم تجميع مجموعة تفاعلية (CTE) وتم تنظيمها بطريقة معينة، يمكن للخبير التخزيني استخدام تلك المعلومات في العملية الخارجية، مما يحسن الأداء بتجنب ترتيب تكراري أو بتمكين بعض الطرق الأكثر فاعلية للترابط. وكما ذكرنا في تعليقات التوجيه التالية من Tom Lane:
“يوجد بالفعل بناء لرفع مجموعات المسار الى العملية الخارجية للاستعمال بالنسبة للمجموعات التفاعلية العادية
RTE_SUBQUERY
، ولكنه لم يتم استخدامه للCTEs، مما يمكن أن يكون بسبب قلق من إبقاء حاجز للتحسين بين الCTE والعملية الخارجية.”
هذه التعديلة البسيطة في مصدر بوستgreSQL ستنتج عن تحسينات في الأداء للأستعمالات التي تتضمن مجموعات تفاعلية معقدة، خاصة التي يمكن تحسين ترتيب أو أندماج الترابط وفقاً للترتيب الفطري لناتج الCTE.
هذا مثال يستخدم البيانات في PostgreSQL regression:
postgres=# CREATE TABLE tenk1 (
postgres(# unique1 int4,
postgres(# unique2 int4,
postgres(# two int4,
postgres(# four int4,
postgres(# ten int4,
postgres(# twenty int4,
postgres(# hundred int4,
postgres(# thousand int4,
postgres(# twothousand int4,
postgres(# fivethous int4,
postgres(# tenthous int4,
postgres(# odd int4,
postgres(# even int4,
postgres(# stringu1 name,
postgres(# stringu2 name,
postgres(# string4 name
postgres(# );
CREATE TABLE
postgres=# CREATE INDEX tenk1_unique1 ON tenk1 USING btree(unique1 int4_ops);
CREATE INDEX
postgres=# \copy tenk1 FROM '~/projects/postgres/src/test/regress/data/tenk.data';
COPY 10000
postgres=# VACUUM ANALYZE tenk1;
VACUUM
يحتوي خطة الاستعمال من مصدر Postgres 16 التالي:
postgres=# explain analyze with x as materialized (select unique1 from tenk1 b order by unique1)
select count(*) from tenk1 a
where unique1 in (select * from x);
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------
---
Aggregate (cost=764.29..764.30 rows=1 width=8) (actual time=21.592..21.593 rows=1 loops=1)
CTE x
-> Index Only Scan using tenk1_unique1 on tenk1 b (cost=0.29..306.29 rows=10000 width=4) (actual time=0.046..1.415 rows=10000 loops=
1)
Heap Fetches: 0
-> Nested Loop (cost=225.28..445.50 rows=5000 width=0) (actual time=7.545..20.911 rows=10000 loops=1)
-> HashAggregate (cost=225.00..227.00 rows=200 width=4) (actual time=7.535..9.051 rows=10000 loops=1)
Group Key: x.unique1
Batches: 1 Memory Usage: 929kB
-> CTE Scan on x (cost=0.00..200.00 rows=10000 width=4) (actual time=0.070..3.933 rows=10000 loops=1)
-> Index Only Scan using tenk1_unique1 on tenk1 a (cost=0.29..1.08 rows=1 width=4) (actual time=0.001..0.001 rows=1 loops=10000)
Index Cond: (unique1 = x.unique1)
Heap Fetches: 0
Planning Time: 0.806 ms
Execution Time: 21.890 ms
(14 rows)
يحتوي خطة الاستعمال من مصدر Postgres 17 التالي:
postgres=# explain analyze with x as materialized (select unique1 from tenk1 b order by unique1)
select count(*) from tenk1 a
where unique1 in (select * from x);
QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------- Aggregate (cost=987.55..987.56 rows=1 width=8) (actual time=8.777..8.778 rows=1 loops=1)
CTE x
-> Index Only Scan using tenk1_unique1 on tenk1 b (cost=0.29..306.29 rows=10000 width=4) (actual time=0.010..1.095 rows=100
00 loops=1)
Heap Fetches: 0
-> Merge Semi Join (cost=0.31..656.26 rows=10000 width=0) (actual time=0.037..8.024 rows=10000 loops=1)
Merge Cond: (a.unique1 = x.unique1)
-> Index Only Scan using tenk1_unique1 on tenk1 a (cost=0.29..306.29 rows=10000 width=4) (actual time=0.013..1.262 rows
=10000 loops=1)
Heap Fetches: 0
-> CTE Scan on x (cost=0.00..200.00 rows=10000 width=4) (actual time=0.016..3.678 rows=10000 loops=1)
Planning Time: 0.800 ms
Execution Time: 8.899 ms
(11 rows)
فلنأخذ مثالًا صغيرًا؛ يمكنك أن ترى أن النمو الأدنى سيكون مهمًا في الأسئلة الكبيرة. تذكر أن هذا التحسين فعال فقط إذا كانت فرضية المحتوى المرتبطة تحت عامل الترتيب ORDER BY
.
البحث في المؤشر الب-ترويجي للمجموعات المندرجة
في PostgreSQL، ScalarArrayOpExpr
هو نوع من العقد الذي يتعامل مع الأسئلة التي تشمل عمليات مثل IN
أو ANY
مع مجموعات أو قوائم قيم. إنه مفيد بشكل خاص للأسئلة التي تقارن كولمna ضد مجموعة من القيم، مثل: SELECT * FROM table WHERE column = ANY(ARRAY[1, 2, 3]);
.
ScalarArrayOpExpr
يسمح ل PostgreSQL بتحسين الأسئلة التي تشمل مقارنات متعددة التي تستخدم IN
أو ANY
. قام PostgreSQL 17 بتحقيق تحسينات جديدة لتجعل هذه العمليات أسرع.
في PostgreSQL 17، تم إحداث تحسينات كبيرة في البحث في المؤشرات الب-ترويجية، وهي تحسين الأداء، خاصة للأسئلة ذات قوائم IN
كبيرة أو شروط ANY
. هذه التحسينات تخفض عدد البحوث التي يقوم بها النظام في المؤشرات، وبذلك يخفض التنافس بين الCPU والصفات التي تساعد في تنفيذ البحث الأسرع.
تحسين واحد من الجوانب الرئيسية هو في التعامل مع تعابير عمليات المجموعة المعلمة (SAOP)، مما يسمح بترaversal أكثر كفاءة لفهرسة شجرة B، خاصة للاستعلامات متعددة الأبعاد. على سبيل المثال، عندما يكون لديك عدة أعمدة فهرس (لكل منها قائمة IN
خاصة بها)، يمكن لـ PostgreSQL 17 الآن معالجة هذه العمليات بكفاءة أكبر في فهرس واحد، بدلاً من المسح المتعدد كما في الإصدارات السابقة. يمكن أن يؤدي ذلك إلى زيادة في الأداء تصل إلى 20-30% في حمولات العمل المحدودة بوحدة المعالجة المركزية حيث كانت عمليات الوصول إلى الصفحة مشكلة في السابق.
بالإضافة إلى ذلك، يقدم PostgreSQL 17 إدارة أفضل للأقفال الداخلية، مما يعزز الأداء بشكل أكبر لحمولات العمل عالية التزامن، خاصة عند مسح عدة أبعاد داخل فهرس شجرة B.
يمكننا توضيح ذلك بمثال بسيط. سنستخدم نفس الجدول tenk1
والبيانات التي استخدمناها في المثال السابق من مجموعة اختبار Postgres.
مثالنا، أول تشغيل على Postgres 16:
CREATE TABLE tenk1 (
postgres(# unique1 int4,
postgres(# unique2 int4,
postgres(# two int4,
postgres(# four int4,
postgres(# ten int4,
postgres(# twenty int4,
postgres(# hundred int4,
postgres(# thousand int4,
postgres(# twothousand int4,
postgres(# fivethous int4,
postgres(# tenthous int4,
postgres(# odd int4,
postgres(# even int4,
postgres(# stringu1 name,
postgres(# stringu2 name,
postgres(# string4 name
postgres(# );
CREATE TABLE
postgres=# CREATE INDEX tenk1_unique1 ON tenk1 USING btree(unique1 int4_ops);
CREATE INDEX
postgres=# \copy tenk1 FROM '~/projects/postgres/src/test/regress/data/tenk.data';
COPY 10000
postgres=# EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM tenk1 WHERE unique1 IN (1, 2, 3);
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------
Bitmap Heap Scan on tenk1 (cost=14.20..330.12 rows=176 width=244) (actual time=0.138..0.153 rows=3 loops=1)
Recheck Cond: (unique1 = ANY ('{1,2,3}'::integer[]))
Heap Blocks: exact=3
Buffers: shared hit=9
-> Bitmap Index Scan on tenk1_unique1 (cost=0.00..14.16 rows=176 width=0) (actual time=0.102..0.102 rows=3 loops=1)
Index Cond: (unique1 = ANY ('{1,2,3}'::integer[]))
Buffers: shared hit=6
Planning:
Buffers: shared hit=2
Planning Time: 0.900 ms
Execution Time: 0.242 ms
(11 rows)
postgres=# SELECT idx_scan, idx_tup_fetch FROM pg_stat_user_tables WHERE relname = 'tenk1';
idx_scan | idx_tup_fetch
----------+---------------
3 | 3
(1 row)
في الاستعلام السابق، يمكنك رؤية أن الوصول المؤقت المشترك للاستعلام IN
كان 9 وأنه استغرق 3 مسحات فهرس للحصول على النتائج من مسح الفهرس. في PostgreSQL، يشير مصطلح الوصول المؤقت المشترك إلى نوع محدد من الوصولات المؤقتة المتعلقة بإدارة المخزن المؤقت. يحدث الوصول المؤقت المشترك عندما يصل PostgreSQL إلى كتلة بيانات أو صفحة من مجموعة المخازن المؤقتة المشتركة بدلاً من القرص، مما يعزز أداء الاستعلام.
نفس المثال، هذه المرة تم تشغيله على Postgres 17:
EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM tenk1 WHERE unique1 IN (1, 2, 3);
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------
Bitmap Heap Scan on tenk1 (cost=12.88..24.08 rows=3 width=244) (actual time=0.043..0.054 rows=3 loops=1)
Recheck Cond: (unique1 = ANY ('{1,2,3}'::integer[]))
Heap Blocks: exact=3
Buffers: shared hit=5
-> Bitmap Index Scan on tenk1_unique1 (cost=0.00..12.88 rows=3 width=0) (actual time=0.026..0.026 rows=3 loops=1)
Index Cond: (unique1 = ANY ('{1,2,3}'::integer[]))
Buffers: shared hit=2
Planning:
Buffers: shared hit=59
Planning Time: 0.479 ms
Execution Time: 0.116 ms
(11 rows)
postgres=# SELECT idx_scan, idx_tup_fetch FROM pg_stat_user_tables WHERE relname = 'tenk1';
idx_scan | idx_tup_fetch
----------+---------------
1 | 3
(1 row)
كما ترون ، مع Postgres 17 ينخفض معدل الاصطدام بالمشاعر المشتركة إلى 5 ، والأهم من ذلك أنه يقوم فقط بمسح بطريقة واحدة للمؤشر (بمقارنة ب3 مساقير في حالة Postgres 16). مع هذا التحسين في Postgres 17 يتحسن بشكل كبير أداء العمليات التي تتعلق بالمجموعات المنحنية المجموعية، ويستطيع Postgres أن يختار من بين خطط السؤال المOptimized أفضل.
الحفاظ على الشروط التعليمية للتنسيق المنطقي والاشتراكات أثناء الترقية
الحفاظ على الشروط التعليمية للتنسيق المنطقي وتحويل 依يدكونات الاشتراكات خلال عملية الترقية الرئيسية هو خاصية أخرى في التنسيق المنطقي المضافة إلى PostgreSQL 17. يتوجب عليك أن تلاحظ أن هذه الخاصية ستكون مفيدة فقط في الترقية من PostgreSQL 17 إلى 版本 التالية، هذه الدعم لا يتم بالإضافة للترقية قبل Postgres 17. الشروط التعليمية والمنشآت التعليمية تنشأ عند بناء بيئة التنسيق المنطقي. مع ذلك ، هذه المعلومات تخص العقل لتسجيل حالة التنسيق ، حالة التطبيق وحالة تخزين التوريد لكي لا يتم ترقيتها كجزء من عملية الترقية. حين يتم ترقية العقل المنشور يتوجب على المستخدم بناء هذه الأشياء يدويًا.
يتم تحسين عملية pg_upgrade في PostgreSQL 17 لتشير وإعادة بناء هذه الأشياء الداخلية؛ هذه القدرة تمكن التنسيق المنطقي من الاستعادة تلقائية أثناء ترقية عقل لديه تنسيق المنطقي. من قبل عندما يق
يجب أن تتبع هذه الخطوات أثناء ترقية مجموعة المنشر:
- تأكد من أن جميع الاشتراكات بالمنشر معيقة مؤقتًا بمجموعة
ALTER SUBSCRIPTION….DISABLE
، ويتم تفعيلها بعد إنتهاء عملية الترقية. - ضبط
wal_level
جمجمة الجديدة إلىlogical
. - يتوجب تعيين
max_replication_slots
في الجمجمة الجديدة إلى قيمة أكبر من أو يساوي الجامعات على الجمجمة القديمة. - يتوجب تثبيت ما يستخدم بالأجواء في الجمجمة الجديدة.
- كل التغييرات من الجمجمة القديمة قد تم تنسيقها إلى الجمجمة الهدفية قبل الترقية.
- يتوجب أن تكون جميع الأجواء في الجمجمة القديمة قابلة للاستعمال؛ يمكنك تأكد ذلك بالتفقير في المنظور pg_replication_slots. يجب أن يكون
- لا يوجد أي أجواء في الجمجمة الجديدة تحمل قيمة
false
في الخانةTemporary
من المنظورpg_replication_slots
. لا يجب وجود أي أجواء دائمة للتنسيق المنطقي في الجمجمة الجديدة.
سينتج عملية pg_upgrade
ترقية الأجواء المنطقية خطأ إذا لم تتوفر أي من الأحتياجات السابقة.
الخلاصة
مع PostgreSQL 17 ، تستمر المجموعة في التركيز على جعل PostgreSQL أكثر أداءً ، وقابلية توسعة ، وأمنا وجاهزة للاستخدام في الشركات. يحسن Postgres 17 تجربة المطورين بإضافة ميزات جديدة للتوافق وجعل ميزاتهم سابقة أكثر قوة ومرنة.
وخارج الإصدار 17 ، ستستمر PostgreSQL في النمو والتحسين وأداءها أفضل لتستيع التطبيقات التجارية التي تحتاج لقاعدات قابلة للتوسعة. تحسينت القابلية للتوسعة (كاملة وفرعيا) على مر السنين ، ولكن هناك بالتأكيد فرص لتحسين قدراتها الفرعية بإضافة قابلية التشارد الى PostgreSQL.
سنشهد تحسينات أكثر في التسلسل المنطقي مع مزيد من الميزات في مجال تسلسل العمليات الداخلية أو التسلسل للأشياء المفقودة (مثل المتواليات) وتحسين الإدارة للنوادي. يدرك المجموعة أيضًا حاجة لجعل PostgreSQL أكثر توافقًا ، ولهذا تحسينات MERGE
الأمر في Postgres 17 ، وخطط لميزات أكثر توافقًا خارج Postgres 17.
Source:
https://dzone.com/articles/postgresql-17-a-major-step-forward-in-performance