Membuat indeks dalam arah asc dan desc

8

Selama beberapa minggu terakhir saya mengamuk terhadap basis data Firebird yang lama. Basis data ini jelek karena segala macam alasan, tetapi satu hal yang saya perhatikan adalah bahwa setiap bidang dari setiap tabel memiliki dua indeks; masing-masing dengan satu segmen, satu dalam ascurutan dan satu dalam descurutan.

Selain dari memiliki indeks untuk setiap bidang dalam setiap tabel, itu membuat saya berpikir - apakah ada keuntungan untuk indeks segmen tunggal untuk memiliki dua indeks dengan segmen indeks yang sama, tetapi satu dalam descdan satu masuk asc? Apakah ada yang bisa diperoleh, atau apakah DBMS modern akan menggunakan ascindeks dan mulai dari akhir dan bekerja mundur jika diperlukan?

Mark Henderson
sumber

Jawaban:

5

Meskipun indeks Firebird dalam teori dua arah, mesin tidak benar-benar menggunakan dua arah karena arah sebaliknya tidak dapat dipercaya karena urutan penulisan halaman: ketika halaman indeks dipisah, tautan antar halaman ditulis ulang, jika tautan ini terhubung dengan sebaliknya, pembacaannya mungkin membaca tautan yang masih menunjuk ke halaman indeks lama alih-alih halaman yang baru ditambahkan, menyebabkannya melompati entri indeks. Ini dijelaskan dalam Firebird untuk Pakar Basis Data: Episode 3 - Konsistensi Pada Disk .

Jadi karena dua arah indeks tidak dijamin, Firebird hanya membaca indeks dalam arah yang dinyatakannya (baik naik atau turun). Sekarang mengapa database Anda memiliki semua indeks ini, saya akan berasumsi bahwa orang yang mendesain database tidak tahu apa yang dia lakukan, atau dia berasumsi bahwa menambahkan indeks ini akan membuat pengurutan pada kolom mana pun lebih cepat.

Mark Rotteveel
sumber
4

Ya, ada hit kinerja yang nyata (FB 2.5) pada tabel besar ketika tidak menggunakan indeks turun untuk contoh:

select first 1 * 
from mytable 
where pk_id >= 200000 
order by pk_id desc

Kueri ini digunakan untuk menemukan catatan sebelumnya, berdasarkan nilai bidang kunci utama "pk_id" (Integer).

Roy Damman
sumber
postgres pasti memiliki masalah ini
PirateApp