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

Postgresql join_collapse_limit dan waktu untuk perencanaan kueri

PostgreSQL versi 9.4 yang baru (belum dirilis pada saat penulisan ini) akan menambah waktu perencanaan ke dalam EXPLAIN dan EXPLAIN ANALYZE , sehingga Anda dapat menggunakannya.

Untuk versi yang lebih lama, asumsi Anda benar, cara yang lebih baik untuk menentukan waktu perencanaan adalah dengan menjalankan EXPLAIN sederhana (tidak ada ANALYZE ) dan memeriksa waktu yang diperlukan, di psql Anda dapat melakukannya dengan mengaktifkan \timing (Saya biasanya melakukannya di ~/.psqlrc ).

Tim peretas PostgreSQL telah membahas tentang meningkatkannya ke nilai yang lebih besar . Tapi sepertinya mereka tidak bisa menjamin bahwa itu akan baik untuk semua kasus.

Masalahnya adalah perencanaan untuk menemukan urutan bergabung terbaik untuk N tabel membutuhkan O(N!) pendekatan (faktorial). Jadi, angka kenaikannya sangat tinggi, Anda bisa melihatnya dengan sederhana dengan query berikut:

$ SELECT i, (i)! AS num_comparisons FROM generate_series(8, 20) i;
 i  |   num_comparisons   
----+---------------------
  8 |               40320
  9 |              362880
 10 |             3628800
 11 |            39916800
 12 |           479001600
 13 |          6227020800
 14 |         87178291200
 15 |       1307674368000
 16 |      20922789888000
 17 |     355687428096000
 18 |    6402373705728000
 19 |  121645100408832000
 20 | 2432902008176640000
(13 rows)

Seperti yang Anda lihat, pada default 8 kami melakukan paling banyak sekitar 40 ribu perbandingan, 10 yang Anda usulkan membuatnya menjadi 3M, yang masih tidak terlalu banyak untuk komputer modern, tetapi nilai berikutnya mulai menjadi terlalu besar, itu hanya meningkat terlalu cepat, 20 hanya gila (21! bahkan tidak cocok dengan bilangan bulat 64 bit).

Tentu saja, terkadang Anda dapat mengaturnya ke nilai yang lebih besar seperti 16, yang (secara teori) dapat menghasilkan sekitar 20 triliun perbandingan, dan masih memiliki waktu perencanaan yang sangat baik, itu karena PostgreSQL memotong beberapa jalur saat merencanakan dan tidak perlu untuk selalu periksa semua pesanan, tetapi dengan asumsi bahwa itu akan selalu terjadi dan menjadikan nilai tinggi sebagai default, tidak terlihat seperti pendekatan yang baik untuk saya. Mungkin ada beberapa kueri tak terduga di masa mendatang yang membuatnya memeriksa semua pesanan dan kemudian Anda hanya memiliki satu kueri yang membuat server Anda down.

Dalam pengalaman saya, saya menganggap 10 sebagai nilai default pada setiap instalasi di server yang baik, beberapa di antaranya bahkan saya gunakan 12. Saya sarankan Anda untuk mengaturnya ke 10, jika Anda suka, dan pada beberapa waktu, coba setel lebih tinggi ( Saya tidak akan melampaui 12) dan terus memantau (dengan cermat) untuk melihat bagaimana perilakunya.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dalam membela sar (dan cara mengkonfigurasinya)

  2. Postgres:Berbeda tetapi hanya untuk satu kolom

  3. Indeks yang mencakup beberapa tabel di PostgreSQL

  4. menggunakan salinan di postgresql?

  5. Lompat celah SQL pada kondisi tertentu &penggunaan lead() yang tepat