Di mana seseorang harus meletakkan indeks dalam tabel dimensi waktu?


10

Setelah membaca Pertanyaan dan Jawaban dari situs web ini tentang indeks, sebuah pertanyaan muncul di benak saya.

Bagaimana jika, seseorang menggunakan tabel dimensi waktu dengan tingkat granularitas yang lebih rendah sebagai harinya. Di mana seseorang harus meletakkan indeks?

Randy Melder dalam pertanyaan: Apa artinya "indeks" pada RDBMS? berkata:

Pikirkan indeks sebagai "daftar isi" ... yang merupakan daftar petunjuk pointer ke posisi dalam file, alias offset

Dalam hal dimensi waktu, sebagian besar penelitian data dapat dilakukan baik untuk hari tertentu, minggu tertentu, bulan tertentu atau kuartal tertentu jika tabel waktu menyimpan sepanjang hari untuk tahun yang unik .

Pertanyaan saya adalah: Haruskah seseorang menaruh indeks untuk semua bidang itu?

Seharusnya hari itu unik, jadi untuk hari ini saya sangat memahami penggunaan indeks. Tetapi id seminggu akan memiliki 7 kejadian , id sebulan akan memiliki 30/31 kejadian , seperempat id akan memiliki lebih dari 120 kejadian .

  • Haruskah seseorang masih meletakkan indeks untuk bidang-bidang itu?
  • Apakah ini masih berguna?

Saya menanyakan itu kepada Anda karena dalam pertanyaan yang sama, David Spillett berkata:

Menambahkan terlalu banyak indeks tentu saja dapat menjadi optimasi yang buruk, karena ruang tambahan yang digunakan untuk menyimpan indeks (dan beban-IO untuk mempertahankannya jika DB Anda melihat banyak operasi penulisan) mungkin merupakan masalah yang lebih buruk daripada kueri baca yang sedikit kurang optimal , jadi jangan berlebihan.

Jadi, apa pertimbangan terbaik untuk kasus dimensi waktu?

Jawaban:


7

Anda mungkin tidak akan mengalami masalah penulisan masalah, karena saya berasumsi ini akan menjadi sesuatu yang dibuat sekali (atau sekali per tahun), dan kemudian tidak tersentuh.

Tetapi menggunakan indeks kemungkinan akan menjadi penghalang jika Anda mencari berdasarkan minggu ... Masalahnya adalah, jika indeks digunakan, mungkin memindai itu terlebih dahulu, dan kemudian mengambil setiap catatan dari tabel secara individual, yang ketika Anda ' Jika menarik lebih dari sekitar 5-20% dari catatan, biasanya lebih cepat melakukan pemindaian tabel penuh, dan kemudian menjatuhkan catatan yang tidak Anda pedulikan.

Saya tidak tahu ada RDBMS utama yang tidak mengoptimalkan ini ketika data terdistribusi dengan baik. Jika tidak terdistribusi dengan baik (misalnya, salah satu nilai dalam kolom terjadi 95% dari waktu, tetapi ada juga nilai lain yang mungkin), Anda mungkin harus menghitung histogram di atas meja dan tidak menggunakan pengganti untuk nilai saat mencari, sehingga pengoptimal kueri memiliki nilai yang dicari saat membuat rencana eksekusi.

Saya kemungkinan tidak akan mengindeks hari dalam seminggu. Saya akan memeriksa dokumentasi database saya untuk melihat apa tradeoff mereka untuk membaca indeks vs scan tabel penuh untuk melihat apakah saya akan mengindeks hari bulan atau bulan tahun ini. Saya kemungkinan akan mengindeks DOY / hari dalam setahun jika ada (yang sepertinya merupakan indeks unik Anda)


5

Indeks tidak harus unik untuk berguna, jadi jawabannya tergantung . Jika pertanyaan Anda mendapat manfaat dari keberadaan indeks maka mereka mungkin merupakan tambahan yang berharga. Saya tidak tahu bahwa harus ada pedoman khusus terkait kolom waktu. Perlakukan mereka seperti kolom lainnya dan indeks mereka berdasarkan kegunaan untuk permintaan.


Apakah ada orang selain saya yang mendengar suara Paul Randal setiap kali mereka mengatakan atau membaca "itu tergantung" berkaitan dengan basis data? : p
AndrewSQL

3

Aturan umum adalah bahwa semakin selektif indeksnya (selektivitas didefinisikan sebagai jumlah nilai unik dalam kolom dibagi dengan jumlah baris dalam tabel), semakin besar kemungkinan mesin akan menggunakan indeks jika kueri menggunakan kolom di mana klausa.

Jika Anda mempertimbangkan untuk mengindeks kolom, menjalankan kueri memilih pada kolom yang diindeks sebelum dan sesudah dan melihat rencana eksekusi akan memberi tahu Anda jika indeks sedang digunakan, dan jika demikian, seberapa banyak indeks membantu. Idealnya, kueri yang Anda gunakan untuk tes adalah salah satu yang akan digunakan oleh aplikasi Anda.


1

Sejauh ini, aturan praktis saya adalah tidak menempatkan indeks apa pun ke dalam database pengembangan saya sama sekali saat saya sedang mengerjakannya. Ketika basis data produksi semakin besar, saya menggunakan pencatatan basis data dan EXPLAINuntuk mencari tahu apa yang perlu diindeks, dan kemudian hanya membuat indeks yang diperlukan. Ini berfungsi dengan baik selama penggunaan basis data meningkat secara bertahap, dan menjaga jumlah indeks tetap rendah.

Saat menganalisis data dalam database, saya biasanya perlu menambahkan indeks tambahan untuk mempercepat permintaan yang tidak umum dalam produksi. Saya selalu melakukan ini pada salinan basis data produksi, jadi indeks ini tidak pernah ditambahkan ke produksi sendiri.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.