Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Oracle:apakah urutan kolom penting dalam indeks?

  1. Jika a dan b keduanya memiliki 1000 nilai berbeda dan mereka selalu ditanyai bersama maka urutan kolom dalam indeks tidak terlalu penting. Tetapi jika a hanya memiliki 10 nilai berbeda atau Anda memiliki kueri yang hanya menggunakan salah satu kolom, maka itu penting; dalam skenario ini indeks tidak dapat digunakan jika urutan kolom tidak sesuai dengan kueri.
  2. Kolom dengan nilai yang paling berbeda harus didahulukan dan kolom dengan nilai yang paling berbeda di urutan terakhir. Ini tidak hanya memaksimalkan utilitas indeks, tetapi juga meningkatkan potensi keuntungan dari kompresi indeks.
  3. Tipe data dan panjang kolom berdampak pada pengembalian yang bisa kita dapatkan dari kompresi indeks tetapi tidak pada urutan kolom terbaik dalam indeks.
  4. Urutkan kolom dengan kolom yang paling tidak selektif terlebih dahulu dan kolom yang paling selektif terakhir. Dalam kasus tie lead dengan kolom yang lebih mungkin untuk digunakan sendiri.

Satu-satunya pengecualian potensial untuk 2. dan 3. adalah dengan kolom DATE. Karena kolom Oracle DATE menyertakan elemen waktu, kolom tersebut mungkin memiliki 86400 nilai berbeda per hari . Namun sebagian besar kueri pada kolom data biasanya hanya tertarik pada elemen hari, jadi Anda mungkin ingin mempertimbangkan hanya jumlah hari yang berbeda dalam penghitungan Anda. Meskipun saya menduga itu tidak akan mempengaruhi selektivitas relatif dalam beberapa kasus.

edit (sebagai tanggapan atas komentar Nick Pierpoint)

Dua alasan utama untuk memimpin dengan kolom paling tidak selektif adalah

  1. Kompresi indeks
  2. Indeks Lewati bacaan

Keduanya bekerja dengan ajaib karena mengetahui bahwa nilai di slot saat ini sama dengan nilai di slot sebelumnya. Akibatnya kita dapat memaksimalkan pengembalian dari teknik ini dengan meminimalkan berapa kali nilai berubah. Dalam contoh berikut, A memiliki empat nilai berbeda dan B memiliki enam. Ditto mewakili nilai kompresibel atau blok indeks yang dapat dilewati.

Least selective column leads ...

A          B
---------  -
AARDVARK   1
"          2
"          3
"          4
"          5
"          6
DIFFVAL    1
"          2
"          3
"          4
"          5
"          6
OTHERVAL   1
"          2
"          3
"          4
"          5
"          6
WHATEVER   1
"          2
"          3
"          4
"          5
"          6

Prospek kolom paling selektif ...

B  A
-  --------
1  AARDVARK
"  DIFFVAL
"  OTHERVAL
"  WHATEVER
2  AARDVARK
"  DIFFVAL
"  OTHERVAL
"  WHATEVER
3  AARDVARK
"  DIFFVAL
"  OTHERVAL
"  WHATEVER
4  AARDVARK
"  DIFFVAL
"  OTHERVAL
"  WHATEVER
5  AARDVARK
"  DIFFVAL
"  OTHERVAL
"  WHATEVER
6  AARDVARK
"  DIFFVAL
"  OTHERVAL
"  WHATEVER

Bahkan dalam contoh trival ini, (A, B) memiliki 20 slot yang dapat dilewati dibandingkan dengan 18 dari (B, A) . Disparitas yang lebih lebar akan menghasilkan ROI yang lebih besar pada kompresi indeks atau utilitas yang lebih baik dari pembacaan Index Skip.

Seperti halnya dengan kebanyakan heuristik penyetelan, kita perlu membandingkan menggunakan nilai aktual dan volume realistis. Ini jelas merupakan skenario di mana kemiringan data dapat memiliki dampak dramatis terhadap efektivitas pendekatan yang berbeda.

"Saya pikir jika Anda memiliki indeks pertama yang sangat selektif, maka - dari perspektif kinerja - sebaiknya Anda memprioritaskannya."

Jika kita memiliki kolom yang sangat selektif maka kita harus membuat indeksnya sendiri. Manfaat tambahan menghindari operasi FILTER pada beberapa baris tidak mungkin sebanding dengan biaya pemeliharaan indeks komposit.

Indeks multi-kolom paling berguna ketika kita memiliki:

  • dua atau lebih kolom selektivitas lumayan,
  • yang sering digunakan dalam kueri yang sama.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Rutin yang Ditentukan Pengguna dengan DBMS_STATS, Bagian II

  2. ORACLE SQL:Dapatkan semua bilangan bulat di antara dua angka

  3. string literal terlalu panjang - cara menetapkan data xml panjang ke tipe data gumpalan di Oracle 11g r2

  4. tidak ada ocijdbc9 di java.library.path

  5. Cara Mengembalikan Daftar Wilayah yang Didukung di Oracle