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

Pilih kueri dengan batas offset terlalu lambat

Lambat karena perlu menemukan offset atas baris dan pindai 100 berikutnya. Tidak ada jumlah pengoptimalan yang akan mengubahnya saat Anda berurusan dengan offset besar.

Ini karena kueri Anda secara harfiah instruksikan mesin DB untuk mengunjungi banyak baris dengan menggunakan offset 3900000 -- itu 3,9 juta baris. Pilihan untuk mempercepat ini tidak banyak.

RAM super cepat, SSD, dll. akan membantu. Tapi Anda hanya akan mendapatkan keuntungan dengan faktor konstan dalam melakukannya, artinya itu hanya menendang kaleng di jalan sampai Anda mencapai offset yang cukup besar.

Memastikan tabel sesuai dengan memori, dengan lebih banyak cadangan juga akan membantu dengan faktor konstan yang lebih besar -- kecuali yang pertama kali. Namun hal ini tidak mungkin dilakukan dengan tabel atau indeks yang cukup besar.

Memastikan Anda melakukan pemindaian hanya indeks akan bekerja sampai batas tertentu. (Lihat jawaban velis; ia memiliki banyak manfaat.) Masalahnya di sini adalah, untuk semua tujuan praktis, Anda dapat menganggap indeks sebagai tabel yang menyimpan lokasi disk dan bidang yang diindeks. (Ini lebih dioptimalkan dari itu, tetapi ini adalah perkiraan pertama yang masuk akal.) Dengan baris yang cukup, Anda masih akan mengalami masalah dengan offset yang cukup besar.

Mencoba untuk menyimpan dan mempertahankan posisi yang tepat dari baris pasti akan menjadi pendekatan yang mahal juga.(Ini disarankan oleh misalnya benjist.) Meskipun secara teknis layak, ia mengalami keterbatasan yang serupa dengan yang berasal dari penggunaan MPTT dengan struktur pohon:Anda akan memperoleh hasil pembacaan yang signifikan, tetapi akan berakhir dengan waktu penulisan yang berlebihan saat sebuah simpul dimasukkan, diperbarui, atau dihapus sedemikian rupa sehingga sebagian besar data perlu diperbarui bersama.

Semoga lebih jelas, tidak ada peluru ajaib yang nyata ketika Anda berurusan dengan offset sebesar ini. Seringkali lebih baik untuk melihat pendekatan alternatif.

Jika Anda membuat paginasi berdasarkan ID (atau bidang tanggal, atau kumpulan bidang lain yang dapat diindeks), trik potensial (digunakan oleh blogspot, misalnya) adalah membuat kueri Anda mulai pada titik sewenang-wenang dalam indeks.

Dengan kata lain, alih-alih:

example.com?page_number=[huge]

Lakukan sesuatu seperti:

example.com?page_following=[huge]

Dengan begitu, Anda tetap melacak di mana Anda berada dalam indeks, dan kueri menjadi sangat cepat karena dapat langsung menuju ke titik awal yang benar tanpa membajak trilyun baris:

select * from foo where ID > [huge] order by ID limit 100

Secara alami, Anda kehilangan kemampuan untuk melompat ke mis. halaman 3000. Tapi pikirkanlah ini dengan jujur:kapan terakhir kali Anda melompat ke nomor halaman besar di sebuah situs alih-alih langsung mencari arsip bulanannya atau menggunakan kotak pencariannya?

Jika Anda membuat paginasi tetapi ingin menjaga halaman tetap diimbangi dengan cara apa pun, pendekatan lain adalah melarang penggunaan nomor halaman yang lebih besar. Ini tidak konyol:itulah yang dilakukan Google dengan hasil pencarian. Saat menjalankan kueri penelusuran, Google memberi Anda perkiraan jumlah hasil (Anda bisa mendapatkan jumlah yang wajar menggunakan explain ), dan kemudian akan memungkinkan Anda untuk menelusuri beberapa ribu hasil teratas -- tidak lebih. Antara lain, mereka melakukannya karena alasan kinerja -- tepatnya yang Anda hadapi.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. clojure.java.jdbc kueri malas

  2. GROUP BY dalam klausa UPDATE FROM

  3. Perilaku aneh di Postgresql

  4. bagaimana cara menjalankan skrip .sql di heroku?

  5. Tidak dapat terhubung ke Postgresql pada port 5432