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

Diindeks ORDER BY dengan LIMIT 1

Dengan asumsi kita berhadapan dengan meja besar , sebuah indeks parsial mungkin membantu:

CREATE INDEX tbl_created_recently_idx ON tbl (created_at DESC)
WHERE created_at > '2013-09-15 0:0'::timestamp;

Seperti yang sudah Anda ketahui:turun atau naik hampir tidak penting di sini. Postgres dapat memindai mundur dengan kecepatan yang hampir sama (pengecualian berlaku dengan indeks multi-kolom).

Permintaan untuk menggunakan indeks ini:

SELECT * FROM tbl
WHERE  created_at > '2013-09-15 0:0'::timestamp -- matches index
ORDER  BY created_at DESC
LIMIT  1;

Intinya di sini adalah untuk membuat indeks jauh lebih kecil , jadi akan lebih mudah untuk menyimpan dan memeliharanya.

  1. Anda harus memilih stempel waktu yang dijamin lebih kecil dari yang terbaru.
  2. Anda harus membuat ulang indeks dari waktu ke waktu untuk memotong data lama.
  3. Kondisi harus IMMUTABLE .

Jadi efek satu kali memburuk dari waktu ke waktu. Masalah khusus adalah kondisi kode keras:

WHERE created_at > '2013-09-15 0:0'::timestamp

Otomatiskan

Anda dapat memperbarui indeks dan kueri Anda secara manual dari waktu ke waktu. Atau Anda mengotomatiskannya dengan bantuan fungsi seperti ini:

CREATE OR REPLACE FUNCTION f_min_ts()
  RETURNS timestamp LANGUAGE sql IMMUTABLE AS
$$SELECT '2013-09-15 0:0'::timestamp$$

Indeks:

CREATE INDEX tbl_created_recently_idx ON tbl (created_at DESC);
WHERE created_at > f_min_ts();

Pertanyaan:

SELECT * FROM tbl
WHERE  created_at > f_min_ts()
ORDER  BY created_at DESC
LIMIT  1;

Otomatiskan rekreasi dengan tugas cron atau beberapa peristiwa berbasis pemicu. Pertanyaan Anda bisa tetap sama sekarang. Namun Anda perlu membuat ulang semua indeks menggunakan fungsi ini dengan cara apa pun setelah mengubahnya. Cukup letakkan dan buat masing-masing.

Pertama ..

... uji apakah Anda benar-benar berhasil dengan ini.

Coba apakah indeks DROP index ... ; CREATE index ... melakukan pekerjaan. Maka indeks Anda mungkin membengkak. Pengaturan vakum otomatis Anda mungkin tidak aktif.

Atau coba VACUUM FULL ANALYZE untuk mendapatkan seluruh tabel plus indeks Anda dalam kondisi bersih dan periksa lagi.

Opsi lain sertakan penyetelan kinerja umum dan indeks penutup, tergantung pada apa yang sebenarnya Anda ambil dari tabel.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pertanyaan PostgreSQL Favorit Saya dan Mengapa Itu Penting

  2. Bagaimana Sinh() Bekerja di PostgreSQL

  3. Interval pencocokan PostgreSQL antara waktu mulai dan waktu berakhir dengan stempel waktu

  4. Catatan berbasis kursor di PostgreSQL

  5. Ikat param array ke kueri asli