PostgreSQL 19 نزدیکه؛ از FOR PORTION OF تا REPACK
خلاصهٔ کاملتر
PostgreSQL 19 Beta 3 توی ۱۳ اوت ۲۰۲۶ منتشر شده و ریلیزنوتها هم از ۱۸ ژوئیه پر شدن، هرچند هنوز برچسب «قابل تغییر» دارن. تاریخ نسخهٔ نهایی اعلام نشده ولی نویسنده با توجه به روال همیشگی پروژه که سپتامبر یا اکتبره میگه GA همین چند هفتهٔ آینده میرسه. تأکید میکنه این پست دامپ چنجلاگ نیست، انتخاب خودشه از چیزایی که قبل از ارتقا ارزش دونستن دارن، و همهٔ کوئریهای نمونه رو روی یه نسخهٔ واقعی Beta 3 اجرا کرده.
به گفتهٔ نویسنده این نسخه بیشتر از یه ریلیز معمولی تغییر ناسازگار داره و هیچکدوم عجیب نیستن، ولی هر کدوم میتونن بیسروصدا رفتار رو عوض کنن. JIT پیشفرض خاموش شده چون مدل هزینهاش توی optimizer قابلاعتماد نبوده، پس اگه به کوئریهای تحلیلی سنگین تکیه داری باید دستی jit = on بذاری. standard_conforming_strings حالا همیشه روشنه و خاموششدنی نیست، RADIUS کامل حذف شده، ورود با MD5 هر بار هشدار میده و default_toast_compression از pglz رفته روی lz4.
دوتاشون مستقیم جلوی pg_upgrade رو میگیرن. opclass پیشفرض ایندکس GiST روی inet و cidr از چیزی که اکستنشن btree_gist میداد عوض شده به opclassهای جدید خود هسته، چون قدیمیها خراب بودن و میتونستن ردیفهایی رو که باید برمیگشتن کنار بذارن، پس اول باید ریایندکس کنی. اسم دیتابیس و رول و tablespace هم دیگه نباید CR/LF داشته باشه. پیشفرض max_locks_per_transaction هم از ۶۴ به ۱۲۸ رفته که فضای اضافه نیست: نحوهٔ تخصیص قفل عوض شده، پس عدد دستیت رو باید دو برابر کنی.
از سمت SQL، جذابترین اضافه FOR PORTION OF ـه. تا الان برای عوض کردن وسط یه بازهٔ زمانی باید دستی تاریخ پایان ردیف رو آپدیت میکردی و یه ردیف جدید برای بقیهٔ بازه درج میکردی. حالا یه دستور آپدیت با این کلاز خودش تقسیم رو انجام میده: ردیف اصلی جمع میشه روی تکهٔ دستنخورده و یه ردیف جدید برای بازهٔ تغییرکرده ساخته میشه، بدون اینکه exclusion constraint بشکنه. روی حذف هم کار میکنه و فقط همون برش از بازه رو برمیداره.
ON CONFLICT هم بالاخره شاخهٔ سومش رو گرفت. DO NOTHING و DO UPDATE هیچوقت ردیف موجود رو بهت پس نمیدادن و مجبور بودی یه SELECT جدا بزنی. DO SELECT همون ردیف متداخل رو مستقیم برمیگردونه، اختیاراً با قفل FOR UPDATE و شرط WHERE خودش. اینجا RETURNING اجباریه، چون DO SELECT خودش لیست خروجی نداره و پروجکشن توی همون جای همیشگی INSERT میشینه. این همون تکهٔ گمشدهٔ الگوی «درج کن و ردیف رو بهم بده» ـه.
insert into demo_driver_seen(driverid, surname)
values (1, 'Hamilton')
on conflict (driverid) do select
returning driverid, surname, first_seen_at;نکات کلیدی:
- jit پیشفرض خاموشه و برای کوئریهای تحلیلی سنگین باید دستی روشن بشه
- احراز هویت RADIUS حذف شده و MD5 هر بار هشدار میده؛ مسیر توصیهشده scram-sha-256 ـه
- pg_upgrade تا وقتی ایندکسهای btree_gist روی inet/cidr ریایندکس نشن کلاستر رو بالا نمیبره
- توابع پنجرهای مثل lag() حالا IGNORE NULLS میگیرن و آخرین مقدار واقعی رو پیدا میکنن
- دستور جدید REPACK جای VACUUM FULL و CLUSTER رو میگیره و گزینهٔ CONCURRENTLY داره که قفل access exclusive نمیگیره




