Apakah ada manfaat dalam pemesanan kolom tertentu saat menentukan indeks

13

Misalnya, jika saya memiliki dua indeks:

CREATE INDEX IDX_1 ON MY_TABLE_1
 (ITEM, DATE, LOCATION)
 COMPUTE STATISTICS;

CREATE INDEX IDX_2 ON MY_TABLE_1
 (DATE, LOCATION, ITEM)
 COMPUTE STATISTICS;

Apakah ini akan menjadi IDX_2berlebihan? Jika tidak, bagaimana cara menentukan urutan pernyataan kolom?

Haruskah saya menyesuaikan indeks dengan permintaan reguler?

Lewis Norton
sumber

Jawaban:

12

Ya, manfaatnya datang ketika Anda ingin menanyakan bagian indeks. Jika Anda menempatkan predikat bekas bagian terlebih dahulu indeks dapat digunakan untuk kueri yang melibatkan predikat tersebut tetapi tidak semua kolom dalam indeks.

Selain itu, kecuali jika Anda memiliki persyaratan lain, ini dapat membantu untuk menempatkan predikat paling selektif terlebih dahulu, karena ini dapat memangkas indeks mencari operasi lebih cepat.

Dalam kasus Anda IDX_2belum tentu berlebihan tergantung pada sifat kueri di atas meja. Namun, mungkin tidak perlu menyertakan semua kolom. Jika, misalnya, Anda melakukan banyak pertanyaan pada saat itu locationdan datekemudian IDX_2mungkin berguna untuk membantu menyelesaikan pertanyaan tersebut karena IDX_1tidak dalam urutan yang tepat untuk berguna untuk itu. Anda mungkin, bagaimanapun, menemukan bahwa itemitu berlebihan IDX_2.

Dari 9i, Oracle memperkenalkan operator 'lewati pemindaian' di mana kolom indeks trailing dapat ditanyakan lebih efisien, yang dapat mengurangi kebutuhan akan indeks tambahan semacam ini.

Dalam kasus yang lebih spesifik, jika Anda melakukan kueri itemoleh locationdan datedan tidak memerlukan kolom lain, maka kueri tersebut dapat sepenuhnya diselesaikan melalui indeks tanpa harus membaca apa pun dari tabel. Anda juga dapat membuat indeks penutup yang memiliki kolom non-indeks. Jika semua kolom yang diperlukan dapat diselesaikan dari indeks penutup kueri tidak perlu menyentuh tabel utama sama sekali.

Akhirnya, sebagai jawaban atas pertanyaan terakhir Anda: Jika Anda memiliki seperangkat pertanyaan yang sering digunakan dan menghabiskan banyak sumber daya dan dapat disesuaikan dengan menggunakan indeks, maka itu pasti layak dipertimbangkan. Namun, mempertahankan indeks disertai dengan overhead pada sisipan, jadi Anda harus memperdagangkan kinerja kueri terhadap overhead yang ditempatkan indeks pada insert atau memperbarui operasi.

ConcernedOfTunbridgeWells
sumber
3
@ConcernedOfTunbridgeWells: Pendekatan alternatif adalah dengan menggunakan kompresi kunci indeks, dan memiliki kolom yang kurang selektif (lebih sedikit nilai berbeda). Ini membantu mengarah ke indeks yang lebih kecil, sambil tetap membiarkan skip-scan berfungsi dengan baik.
Adam Musch
2

Hal lain yang perlu dipertimbangkan adalah kolom dengan banyak nilai nol.

Jika kolom ini memiliki kolom yang ditentukan setelah mereka dalam indeks, nilai nol harus diindeks. Kalau tidak, seperti biasa, nilai nol tidak diindeks (tentu saja, ini dengan asumsi Anda menggunakan indeks b-tree).

Jadi, jika Anda memiliki kolom dengan sejumlah besar nilai nol, menempatkannya di akhir indeks dapat menghemat ruang disk yang signifikan.

Michal Tenenberg
sumber