PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

PostgreSQL:Paralelisme Kueri dalam Tindakan

di sini kita. Hampir dua dekade memasuki abad ke-21 dan kebutuhan akan daya komputasi yang lebih besar masih menjadi masalah. Perusahaan teknologi menggedor trotoar untuk mengatasi masalah besar ini secara langsung. Insinyur perangkat keras telah menemukan solusi dengan mengubah cara mereka mendesain dan memproduksi unit pemrosesan pusat (CPU) komputer. Mereka sekarang berisi banyak inti, yang memungkinkan terjadinya konkurensi. Pada gilirannya, pengembang perangkat lunak telah menyesuaikan cara mereka menulis program untuk beradaptasi dengan perubahan perangkat keras ini.

Komunitas PostgreSQL telah memanfaatkan CPU multi-core ini sepenuhnya untuk meningkatkan kinerja kueri. Dengan hanya memperbarui ke versi 9.6 atau lebih tinggi, Anda dapat memanfaatkan fitur yang disebut paralelisme kueri untuk melakukan berbagai operasi. Ini memecah tugas menjadi bagian-bagian yang lebih kecil dan menyebarkan setiap tugas ke beberapa inti CPU. Setiap inti dapat memproses tugas pada waktu yang sama. Karena keterbatasan perangkat keras, ini adalah satu-satunya cara untuk meningkatkan kinerja komputer saat kita melangkah ke masa depan.

Sebelum menggunakan fitur paralelisme dalam database PostgreSQL, penting untuk mengetahui cara membuat kueri paralel. Anda akan dapat men-debug dan menyelesaikan masalah apa pun yang muncul.

Bagaimana Paralelisme Kueri Bekerja?

Untuk memiliki pemahaman yang lebih baik tentang bagaimana paralelisme dijalankan, ada baiknya untuk memulai di tingkat klien. Untuk mengakses PostgreSQL, klien harus mengirim permintaan koneksi ke server database yang disebut postmaster. Postmaster akan menyelesaikan otentikasi dan kemudian membuat proses server baru untuk setiap koneksi. Itu juga bertanggung jawab untuk membuat area memori bersama yang berisi kumpulan buffer. Kumpulan buffer mengawasi transfer data antara memori bersama dan penyimpanan. Oleh karena itu, saat koneksi dibuat, kumpulan buffer akan mentransfer data dan memungkinkan paralelisme kueri dapat berlangsung.

Tidak semua kueri harus paralel. Ada kasus di mana hanya sejumlah kecil data yang dibutuhkan, dan dapat dengan cepat diproses oleh hanya satu inti. Fitur ini hanya digunakan ketika kueri membutuhkan banyak waktu untuk diselesaikan. Pengoptimal database menentukan apakah paralelisme harus dijalankan. Jika diperlukan, database akan menggunakan bagian memori tambahan yang disebut memori bersama dinamis (DSM). Hal ini memungkinkan proses pemimpin dan proses pekerja sadar paralel untuk membagi kueri di antara beberapa inti dan mengumpulkan data terkait.

Gambar 1 memberi Anda contoh bagaimana paralelisme terjadi di dalam database. Proses pemimpin menjalankan kueri awal, sementara proses pekerja individu memulai salinan dari proses yang sama. Node agregat parsial, atau inti CPU, bertanggung jawab untuk mengimplementasikan pemindaian sekuensial paralel dari tabel database.

Dalam hal ini, setiap node pemindaian sekuensial memproses 20% data dalam blok 8kb. Node yang sama ini dapat mengoordinasikan aktivitasnya dengan menggunakan teknik yang disebut paralel sadar. Setiap node memiliki pengetahuan penuh tentang data apa yang telah diproses, dan data apa yang perlu dipindai dalam tabel untuk menyelesaikan kueri. Setelah tupel dikumpulkan secara penuh, tupel dikirim ke node pengumpulan untuk dikompilasi dan diselesaikan.

Operasi Paralel

Berbagai jenis kueri dapat digunakan untuk mengambil data dari database untuk menghasilkan kumpulan hasil. Berikut adalah operasi khusus yang memberi Anda kemampuan untuk memanfaatkan penggunaan beberapa inti secara efektif.

Pemindaian Berurutan

Ini adalah operasi membaca data dalam tabel dari awal sampai akhir untuk mengumpulkan data. Ini mendistribusikan beban kerja secara merata di antara beberapa inti untuk meningkatkan kecepatan pemrosesan kueri. Itu menyadari setiap aktivitas inti, membuatnya lebih mudah untuk menentukan apakah seluruh kueri telah selesai. Node pengumpulan kemudian menerima data yang diekstraksi berdasarkan kueri.

Agregasi

Operasi standar, yang mengambil sejumlah besar data dan memadatkannya menjadi sejumlah kecil baris. Ini terjadi selama pemrosesan paralel dengan hanya mengekstraksi dari tabel atau indeks, informasi yang sesuai berdasarkan kueri. Melakukan rata-rata data spesifik adalah contoh agregasi yang sangat baik.

Hash Gabung

Teknik yang digunakan untuk menggabungkan data antara dua tabel. Ini adalah algoritma join tercepat, yang biasanya dilakukan dengan tabel kecil dan tabel besar. Anda terlebih dahulu membuat tabel hash dan memuat semua data dari satu tabel ke sana. Kemudian Anda dapat memindai semua data dari hash dan tabel kedua, menggunakan pemindaian sekuensial paralel. Setiap tupel yang diekstrak dari pemindaian dibandingkan dengan tabel hash untuk melihat apakah ada kecocokan. Jika kecocokan diidentifikasi, data digabungkan. Dengan dirilisnya PostgreSQL 11, menggunakan paralelisme untuk menyelesaikan hash join membutuhkan sekitar sepertiga dari waktu pemrosesan sebelumnya.

Gabung Bergabung

Jika pengoptimal menentukan bahwa gabungan hash akan melebihi kapasitas memori, pengoptimal akan melakukan penggabungan gabungan. Prosesnya melibatkan pemindaian melalui dua daftar yang diurutkan pada saat yang sama dan menggabungkan elemen yang sama. Jika item tidak sama, data tidak akan digabungkan.

Gabung Loop Bersarang

Operasi ini digunakan ketika Anda harus menggabungkan dua tabel yang berisi bahasa pemrograman yang berbeda, seperti Quick Basic, Python, dll. Setiap tabel dipindai dan diproses dengan menggunakan beberapa inti. Jika data cocok, itu dikirim ke node berkumpul untuk digabungkan. Indeks juga dipindai, itulah sebabnya proses ini berisi banyak loop untuk mengambil data. Rata-rata, hanya sepertiga waktu yang dibutuhkan untuk menyelesaikan penggabungan dengan menggunakan proses paralel.

Pemindaian Indeks B-tree

Operasi ini memindai melalui pohon data yang diurutkan untuk menemukan informasi spesifik. Proses ini memakan waktu lebih lama daripada pemindaian sekuensial biasa karena banyak menunggu saat mencari catatan. Namun, pekerjaan memindai data yang sesuai dibagi antara beberapa prosesor.

Pemindaian Heap Bitmap

Anda dapat menggabungkan beberapa indeks dengan menggunakan operasi ini. Pertama-tama Anda ingin membuat jumlah bitmap yang setara, karena Anda memiliki indeks. Misalnya, jika Anda memiliki tiga indeks, Anda harus membuat tiga bitmap terlebih dahulu. Setiap bitmap akan mengambil dan mengompilasi tupel berdasarkan kueri.

Unduh Whitepaper Hari Ini Pengelolaan &Otomatisasi PostgreSQL dengan ClusterControlPelajari tentang apa yang perlu Anda ketahui untuk menerapkan, memantau, mengelola, dan menskalakan PostgreSQLUnduh Whitepaper

Paralelisme Partisi

Ada bentuk paralelisme lain yang dapat terjadi dalam database PostgreSQL. Namun, itu tidak berasal dari memindai tabel dan memecah tugas. Anda dapat mempartisi atau membagi data dengan nilai tertentu. Misalnya, Anda dapat mengambil pembeli nilai, dan memiliki satu inti tunggal yang memproses data hanya dalam nilai tersebut. Dengan begitu, Anda tahu persis apa yang sedang diproses setiap inti pada waktu tertentu.

Partisi Hash

Operasi ini digunakan dengan menyebarkan baris tabel ke dalam sub-tabel. Sekali lagi, pembagian umumnya ditentukan oleh nilai atau daftar nilai yang berbeda dari sebuah tabel. Ini adalah metode yang sangat baik untuk digunakan Jika Anda tidak memiliki teknik manajemen penyimpanan yang efisien di semua perangkat Anda. Anda ingin menggunakan partisi untuk mendistribusikan data secara acak untuk mencegah kemacetan I/O.

Gabung berdasarkan Partisi

Teknik yang digunakan untuk memecah tabel berdasarkan partisi dan menggabungkannya dengan mencocokkan partisi yang sama. Misalnya, Anda mungkin memiliki tabel pembeli yang besar dari seluruh Amerika Serikat. Pertama-tama Anda dapat membagi tabel berdasarkan kota yang berbeda dan kemudian bergabung dengan beberapa kota bersama berdasarkan wilayah di setiap negara bagian. Partisi-bijaksana bergabung menyederhanakan data Anda dan memungkinkan manipulasi tabel berlangsung.

Paralel Tidak Aman

PostgreSQL 11 secara otomatis mengeksekusi paralelisme kueri jika pengoptimal menentukan bahwa ini adalah cara tercepat untuk menyelesaikan kueri. Semakin tinggi versi PostgreSQL yang Anda gunakan, semakin banyak kemampuan paralel yang dimiliki database Anda. Sayangnya, tidak semua query harus dieksekusi secara paralel, meskipun memiliki kemampuan. Jenis kueri yang Anda lakukan mungkin memiliki batasan khusus dan hanya membutuhkan satu inti yang menyelesaikan semua pemrosesan. Ini akan memperlambat kinerja sistem Anda, tetapi akan menjamin bahwa data yang diterima utuh.

Untuk memastikan bahwa kueri Anda tidak pernah berisiko, pengembang telah membuat fungsi yang disebut paralel tidak aman. Anda dapat secara manual mengganti pengoptimal database dan meminta kueri agar tidak pernah paralel. Proses paralelisme tidak akan dilakukan.

Paralelisme dalam database PostgreSQL adalah fitur yang semakin baik dengan setiap versi database. Meskipun masa depan teknologi tidak pasti, sepertinya penggunaan fitur ini akan tetap ada.

Untuk informasi lebih lanjut, Anda dapat melihat yang berikut ini...

  • https://www.postgresql.org/docs/10/parallel-query.html
  • https://www.postgresql.org/docs/10/how-parallel-query-works.html
  • https://www.bbc.com/news/business-42797846
  • https://www.technologyreview.com/s/421186/why-cpus-arent-getting-any-faster/
  • https://www.percona.com/blog/2019/02/21/parallel-queries-in-postgresql/
  • https://malisper.me/postgres-merge-joins/
  • https://www.enterprisedb.com/blog/partition-wise-joins-“divide-and-conquer-joins-between-partitioned-table

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Migrasi PostgreSQL ke Cloud - Membandingkan Solusi dari Amazon, Google &Microsoft

  2. PostgreSQL:Berikan semua izin kepada pengguna di database PostgreSQL

  3. Bagaimana saya bisa memasukkan komentar kolom di PostgreSQL melalui Python?

  4. Verifikasi koneksi database dengan pg-promise saat memulai aplikasi

  5. Bagaimana cara memigrasi database PostgreSQL ke SQLServer?