Indeks berkerumun di SQL Server vs indeks tabel terorganisir di Oracle

8

Saya membuat transisi sebagai pengembang basis data dari SQL Server ke Oracle dan sudah menemukan beberapa sumber daya yang fantastis di sini ( Bagaimana membuat transisi dari SQL Server DBA ke Oracle? Dan Sebagai DBA, bagaimana cara saya beralih dari Oracle ke SQL Server? ? ) tetapi saya kesulitan menemukan informasi yang baik tentang penggunaan tabel indeks terorganisir di Oracle.

Dalam kehidupan saya sebelumnya, kami menggunakan ekstensif indeks berkerumun di SQL Server di OLTP-ish datamart kami dengan sangat sukses. Apakah tabel indeks terorganisir sebagai alat yang berguna di Oracle?

JHFB
sumber
1
Penelitian saya tampaknya menunjukkan bahwa mereka tidak digunakan secara luas, apakah - seperti yang dikatakan @ Gayus di sini: dba.stackexchange.com/questions/1847/… ? Apakah orang-orang Oracle hanya kehilangan?
JHFB
IOT sangat jarang digunakan di Oracle. Pikir saya hanya pernah menggunakan 2 dalam 12 tahun saya sebagai Oracle DBA
Philᵀᴹ

Jawaban:

7

Jika Anda beralih dari SQL Server ke Oracle, saya akan menyarankan untuk mencoba menumpuk tabel pada awalnya karena mereka adalah bentuk standar menyimpan data di Oracle. Untuk sebagian besar beban kerja, tumpukan tabel dengan indeks reguler di Oracle adalah bentuk penyimpanan yang paling seimbang mengenai DML dan kinerja kueri.

Jika kemudian Anda menemukan bahwa Anda memiliki masalah kinerja atau hambatan, Anda harus melihat ke metode penyimpanan canggih khusus seperti IOT, partisi, cluster, indeks kunci terbalik, dll.

Mengenai IOT secara khusus, saya akan menyarankan agar penggunaannya tidak digeneralisasi karena ada banyak "gotcha" yang mungkin tidak ingin Anda masuki sebagai pemula:

  • IOT tidak memiliki rowid asli (karena tidak ada tabel per se).
  • akibatnya, indeks sekunder pada IOT tidak memiliki pointer sebenarnya ke baris tetapi hanya tebakan yang dapat menyebabkan pemindaian indeks yang tidak efisien.
  • Beberapa fitur dinonaktifkan pada IOT seperti kolom virtual , kompresi tabel , partisi komposit.
  • Anda harus memutuskan saat membuat tempat untuk menyimpan kolom non-indeks (inline atau dalam segmen overflow), berpotensi menyebabkan kinerja yang merusak untuk beberapa permintaan.
Vincent Malgrat
sumber
6

IOT di Oracle tidak persis sama dengan indeks berkerumun di SS karena statistik Oracle mencakup hamburan fisik baris, sedangkan SS tidak memasukkan lokasi fisik dalam statistiknya. Lihat debat antara Lewis dan Fritchey tentang Statistik di Oracle dan Sql Server untuk informasi lebih lanjut. ( http://www.red-gate.com/products/oracle-development/deployment-suite-for-oracle/education/webinars/webinar-statistics-oracle-sql-server-jonathan-lewis ) Itulah sebabnya mengapa dikelompokkan indeks dalam SS lebih baik daripada tumpukan. Indeks berkerumun menambahkan data lokasi fisik ke statistik. IOT bagus ketika Anda tahu bahwa indeks menyediakan colokasi baris data yang akan dicari, misalnya indeks pada order_date dan pelanggan untuk tabel pesanan akan menghasilkan IOT yang baik.

Jim
sumber
Terima kasih, Jim. Jadi kedengarannya seperti indeks berkerumun di SS mengatasi kurangnya informasi fisik dalam statistik; Jadi Oracle secara teoritis harus berjalan lebih cepat tanpa indeks seperti itu? Juga untuk memperjelas, saya ingin menggunakan IOT untuk menjamin lokasi fisik dekat baris data untuk kolom tertentu?
JHFB
1
@JHFB - ya, IOT menjamin bahwa data yang menyusun indeks kunci utama untuk tabel akan dipesan secara fisik sesuai dengan kolom dalam indeks. Jadi ini dapat digunakan untuk memastikan bahwa baris dalam tabel anak untuk orang tua tertentu secara fisik terletak berdekatan satu sama lain.
Chris Saxon
3

Vincent membuat beberapa poin hebat dari peringatan IOT, tetapi Anda bisa mendapatkan beberapa manfaat signifikan dari mereka.

Secara pribadi saya pikir mereka secara signifikan kurang digunakan di Oracle dan harus dipertimbangkan lebih luas - bukan hanya sebagai solusi untuk masalah kinerja. Karena Anda harus membuat ulang tabel untuk mengkonversi antara IOT dan heap, ini adalah perubahan yang tidak mungkin terjadi pada database yang selalu digunakan, banyak digunakan kecuali masalah kinerja yang parah.

Martin Widlake memiliki serangkaian posting hebat tentang IOT. Ada beberapa manfaat signifikan yang bisa Anda dapatkan dengan menggunakannya:

  • Mengurangi IO fisik dan logis secara signifikan
  • Penggunaan cache buffer yang lebih efisien, yang dapat menguntungkan kinerja sistem secara luas
  • Ruang tersimpan karena Anda hanya mempertahankan indeks, bukan tabel juga (kecuali Anda memiliki segmen melimpah)

Namun, untuk mendapatkan manfaat ini, Anda memerlukan tabel di mana Anda (hampir) selalu menyertakan kolom utama kunci utama dalam kueri dan Anda kemungkinan akan mengambil beberapa baris sekaligus. Beberapa contoh umum dari tabel tersebut adalah:

  • Master-multiple detail seperti yang sering ditemukan dalam pesanan - item pesanan, faktur - garis faktur dll.
  • Tabel resolusi banyak-ke-banyak yang biasanya ditanya "satu arah". misalnya dalam sebuah customer_addressestabel, jauh lebih umum untuk menemukan semua alamat untuk pelanggan, daripada semua pelanggan untuk alamat.

Kelemahannya adalah memasukkan data lebih lambat, jadi Anda harus mempertimbangkan biaya dan manfaatnya. Pada akhirnya, Anda harus mengetahui data Anda dan memahami bagaimana data itu digunakan yang seharusnya memandu keputusan.

Chris Saxon
sumber