🚀 Internals PostgreSQL: یک فرو رفتن عمیق در Heap Only Tuples و Index-Only Scans 🚀

مقدمه 🎉
به یک کاوش هیجان انگیز در قسمت داخلی PostgreSQL خوش آمدید، به طور خاص بر دو ویژگی جذاب تمرکز دارد: Heap Only Tuples (HOT) و Index-Only Scans. این ویژگیها ارتباط نزدیکی با اسکن فهرست، یک عملیات اساسی در PostgreSQL دارند. بنابراین، وقتی به جزئیات پیچیده این ویژگیها، پیادهسازی و تأثیر آنها بر عملکرد پایگاه داده میپردازیم، دست و پنجه نرم کنید. 🚀
PostgreSQL، به عنوان یکی از پیشرفته ترین سیستم های مدیریت پایگاه داده منبع باز، به دلیل استحکام، انعطاف پذیری و انطباق با استاندارد مشهور است. این مجموعه گسترده ای از ویژگی ها را ارائه می دهد که توسعه دهندگان را قادر می سازد تا برنامه های کاربردی مقیاس پذیر و کارآمد بسازند. در میان این ویژگیها، روشی که PostgreSQL فهرستسازی و اسکن را مدیریت میکند، برجسته است که به میزان قابل توجهی به عملکرد و کارایی آن کمک میکند.
در این پست وبلاگ، دو مورد از این ویژگیها را بررسی خواهیم کرد: Heap Only Tuples (HOT) و Index-Only Scans. ما بررسی خواهیم کرد که آنها چیستند، چگونه کار می کنند و چرا اهمیت دارند. در پایان این پست، شما درک کاملی از این ویژگی ها و نحوه استفاده از آنها برای بهینه سازی پایگاه داده PostgreSQL خود خواهید داشت. بنابراین، بدون هیچ مقدمه ای، بیایید شروع کنیم!
Heap Only Tuples (HOT): یک نمای کلی 🕳️
Heap Only Tuples یا HOT یک ویژگی است که در PostgreSQL 8.3 پیاده سازی شده است. برای بهینه سازی استفاده از صفحات در فهرست و جدول زمانی که یک ردیف به روز شده در همان صفحه جدول ذخیره می شود که ردیف قدیمی را ذخیره می کند، طراحی شده است. این ویژگی همچنین نیاز به پردازش VACUUM را کاهش می دهد، که می تواند منابع فشرده باشد.
قبل از اینکه به نحوه عملکرد HOT بپردازیم، ابتدا مشکل حل آن را درک کنیم. در PostgreSQL، هنگامی که یک ردیف به روز می شود، نسخه جدیدی از ردیف ایجاد و در جدول ذخیره می شود. اگر ردیف به روز شده دارای شاخص باشد، یک ورودی فهرست جدید نیز ایجاد می شود. این فرآیند می تواند مقدار قابل توجهی از فضای ذخیره سازی را مصرف کند و همچنین منجر به افزایش عملیات I/O شود که بر عملکرد پایگاه داده تأثیر می گذارد.
این جایی است که HOT وارد میشود. HOT با حذف نیاز به ایجاد یک ورودی فهرست جدید هنگام بهروزرسانی یک ردیف، این فرآیند را بهینه میکند، مشروط بر اینکه ردیف بهروزرسانیشده در همان صفحه جدول با ردیف قدیمی ذخیره شود. این نه تنها باعث صرفه جویی در فضای ذخیره سازی می شود، بلکه عملیات I/O را نیز کاهش می دهد و در نتیجه عملکرد پایگاه داده را افزایش می دهد.
HOT چگونه کار می کند 🔧
هنگامی که یک ردیف با HOT به روز می شود، اگر ردیف به روز شده در همان صفحه جدول ذخیره می شود که ردیف قدیمی را ذخیره می کند، PostgreSQL تاپل ایندکس مربوطه را وارد نمی کند. در عوض، بیت HEAP_HOT_UPDATED و بیت HEAP_ONLY_TUPLE را به ترتیب در فیلدهای t_informask2 تاپل قدیمی و تاپل جدید تنظیم می کند.
این فرآیند به عنوان “به روز رسانی داغ” شناخته می شود. بیت HEAP_HOT_UPDATED برای تاپل قدیمی تنظیم شده است، که نشان می دهد این تاپل با به روز رسانی HOT به روز شده است. بیت HEAP_ONLY_TUPLE برای تاپل جدید تنظیم شده است، که نشان می دهد این تاپل نتیجه یک به روز رسانی HOT است و ورودی شاخصی ندارد.
با انجام این کار، PostgreSQL می تواند تاپل های به روز شده را بدون نیاز به ایجاد ورودی های فهرست جدید پیگیری کند. این به طور قابل توجهی مصرف هر دو فهرست و جداول صفحات را کاهش می دهد و تعداد تاپل هایی را که پردازش VACUUM باید پردازش کند کاهش می دهد. در نتیجه، HOT با کاهش تعداد درجهای تاپلهای شاخص با بهروزرسانی و لزوم پردازش VACUUM، عملکرد را بهبود میبخشد.
تاثیر HOT بر عملکرد 🚀
با کاهش نیاز به ایجاد ورودی های فهرست جدید و کاهش نیاز به پردازش VACUUM، HOT به طور قابل توجهی عملکرد پایگاه های داده PostgreSQL را افزایش می دهد.
فرآیند VACUUM در PostgreSQL مسئول بازیابی فضای ذخیرهسازی اشغال شده توسط تاپلهای “مرده” است، که نسخههای قدیمی ردیفهای بهروز شده هستند که دیگر مورد نیاز نیستند. این فرآیند می تواند منابع فشرده ای باشد، به ویژه برای پایگاه های داده با به روز رسانی های مکرر. با کاهش تعداد تاپل هایی که فرآیند VACUUM باید پردازش کند، HOT می تواند بار روی فرآیند VACUUM را به میزان قابل توجهی کاهش دهد و در نتیجه عملکرد کلی پایگاه داده را افزایش دهد.
علاوه بر این، با کاهش نیاز به ایجاد ورودی های فهرست جدید، HOT می تواند مقدار قابل توجهی از فضای ذخیره سازی را نیز ذخیره کند. این می تواند به ویژه برای پایگاه های داده با جداول بزرگ و نمایه های متعدد مفید باشد.
اسکن های فقط فهرست: یک مرور کلی 🎮
Index-Only Scans یکی دیگر از ویژگی های قدرتمند PostgreSQL است که عملکرد پایگاه داده را بهینه می کند. این ویژگی در PostgreSQL 9.2 برای کاهش هزینه I/O (ورودی/خروجی) معرفی شد.
در اسکن نمایه سنتی، PostgreSQL از ایندکس برای یافتن مکان سطرها در جدول استفاده می کند و سپس سطرها را از جدول واکشی می کند. این فرآیند شامل دو عملیات I/O است: یکی برای خواندن شاخص و دیگری برای خواندن جدول.
Index-Only Scans این فرآیند را با حذف نیاز به دسترسی به جدول زمانی که تمام ورودی های هدف یک عبارت SELECT در کلید فهرست گنجانده شده اند، بهینه می کند. در چنین مواردی، PostgreSQL میتواند دادههای مورد نیاز را مستقیماً از فهرست دریافت کند و در نتیجه هزینه ورودی/خروجی را کاهش دهد.
نحوه کار اسکن های فقط شاخص 🔧
هنگامی که یک دستور SELECT اجرا می شود، PostgreSQL ابتدا بررسی می کند که آیا تمام ورودی های هدف در کلید فهرست گنجانده شده اند یا خیر. در صورت وجود، PostgreSQL از ایندکس برای واکشی داده های مورد نیاز بدون دسترسی به صفحات جدول مربوطه استفاده می کند.
با این حال، یک گرفتاری وجود دارد. PostgreSQL باید نمایان بودن تاپل ها را بررسی کند تا مطمئن شود که می توانند به طور ایمن توسط عبارت SELECT برگردانده شوند. قابل مشاهده بودن یک تاپل با تراکنشی که تاپل و تراکنش فعلی را ایجاد یا تغییر داده است تعیین می شود. اگر تاپل قابل مشاهده باشد، به این معنی است که با دستور SELECT می توان آن را با خیال راحت بازگرداند.
در یک اسکن نمایه سنتی، PostgreSQL با دسترسی به جدول، دید تاپل ها را بررسی می کند. با این حال، در یک Index-Only Scan، PostgreSQL نمی تواند به جدول دسترسی داشته باشد. بنابراین، چگونه دید تاپل ها را بررسی می کند؟
پاسخ در نقشه دید نهفته است، یک ساختار داده ای که PostgreSQL برای ردیابی قابلیت مشاهده تاپل ها در یک جدول استفاده می کند. اگر همه تاپل های ذخیره شده در یک صفحه قابل مشاهده باشند، PostgreSQL از کلید تاپل ایندکس استفاده می کند و به صفحه جدولی که از تاپل ایندکس به آن اشاره شده است دسترسی نمی یابد تا نمایان بودن آن را بررسی کند. این فرآیند به طور قابل توجهی هزینه I/O را کاهش می دهد و در نتیجه عملکرد پایگاه داده را افزایش می دهد.
تاثیر اسکنهای فقط شاخص بر عملکرد 🚀
با کاهش هزینه ورودی/خروجی، Index-Only Scans می تواند به طور قابل توجهی عملکرد پایگاه داده PostgreSQL را افزایش دهد. این می تواند به ویژه برای پایگاه های داده با جداول بزرگ و نمایه های متعدد مفید باشد، جایی که هزینه I/O می تواند یک گلوگاه عملکرد بزرگ باشد.
علاوه بر این، با حذف نیاز به دسترسی به جدول، Index-Only Scans نیز می تواند مقدار قابل توجهی از فضای ذخیره سازی را ذخیره کند. این می تواند به ویژه برای پایگاه های داده با منابع ذخیره سازی محدود مفید باشد.
نتیجه گیری 🏁
Heap Only Tuples (HOT) و Index-Only Scan های PostgreSQL ویژگی های قدرتمندی هستند که عملکرد پایگاه داده را به طور قابل توجهی افزایش می دهند. HOT استفاده از صفحات را در فهرست و جدول زمانی که یک ردیف به روز شده در همان صفحه جدول ذخیره می شود که ردیف قدیمی را ذخیره می کند، بهینه می کند و نیاز به پردازش VACUUM را کاهش می دهد. از سوی دیگر، اسکنهای Index-Only با استفاده از کلید فهرست به طور مستقیم بدون دسترسی به صفحات جدول مربوطه، زمانی که تمام ورودیهای هدف یک عبارت SELECT در کلید فهرست گنجانده شدهاند، هزینه ورودی/خروجی را کاهش میدهند.
با درک این ویژگی ها، مدیران پایگاه داده و توسعه دهندگان سیستم می توانند پایگاه داده PostgreSQL خود را برای عملکرد و کارایی بهتر بهینه کنند. این ویژگی ها قدرت و انعطاف پذیری PostgreSQL را برجسته می کند و نشان می دهد که چرا یکی از محبوب ترین سیستم های مدیریت پایگاه داده منبع باز در جهان است.
به یاد داشته باشید، کلید تسلط بر PostgreSQL، درک درونیات آن است. بنابراین، به کاوش ادامه دهید، به یادگیری ادامه دهید و به بهینه سازی ادامه دهید. کد نویسی مبارک! 💻🚀
سوالات قابل تامل🤔
- چگونه پیاده سازی Heap Only Tuples (HOT) در PostgreSQL نیاز به پردازش VACUUM را کاهش می دهد؟
- در چه سناریوهایی اسکنهای Index-Only برای کاهش هزینه ورودی/خروجی سودمندتر هستند؟
- چگونه این ویژگی ها به عملکرد و کارایی کلی پایگاه داده PostgreSQL کمک می کنند؟
- معایب یا محدودیت های بالقوه استفاده از اسکن های HOT و Index-Only چیست؟
- چگونه اسکن های HOT و Index-Only با ویژگی های مشابه در سایر سیستم های مدیریت پایگاه داده مقایسه می شوند؟
ادامه مطلب 📚
برای اطلاعات بیشتر می توانید به لینک های زیر مراجعه کنید:
- کلاستر پایگاه داده، پایگاه داده ها و جداول
- ساختار منطقی خوشه پایگاه داده
- ساختار فیزیکی خوشه پایگاه داده
- چیدمان داخلی فایل Heap Table
- روش های نوشتن و خواندن تاپل ها به یاد داشته باشید، هر چه بیشتر بدانید، بیشتر رشد می کنید! 🌱📚
افکار نهایی 💭
درک اجزای داخلی PostgreSQL، مانند Heap Only Tuples (HOT) و Index-Only Scans، می تواند در بهینه سازی پایگاه داده خود مزیت قابل توجهی به شما بدهد. این ویژگیها، در عین پیچیده بودن، راههای قدرتمندی برای افزایش کارایی و کارایی پایگاه داده PostgreSQL شما ارائه میدهند. با صرف زمان برای درک این ویژگیها، میتوانید پتانسیل کامل PostgreSQL را باز کنید و برنامههایی بسازید که مقیاسپذیر، کارآمد و قوی هستند. بنابراین، به کاوش ادامه دهید، به یادگیری ادامه دهید، و مرزهای آنچه را که با PostgreSQL امکان پذیر است پیش ببرید. کد نویسی مبارک! 💻🚀