Dinormalisasi untuk meningkatkan kinerja? Kedengarannya meyakinkan, tetapi tidak menahan air.
Chris Date, yang bekerja sama dengan Dr Ted Codd adalah pendukung asli model data relasional, kehabisan kesabaran dengan argumen informasi yang salah terhadap normalisasi dan secara sistematis menghancurkan mereka menggunakan metode ilmiah: ia mendapatkan database besar dan menguji pernyataan ini.
Saya pikir dia menulis itu di Relational Database Tulisan 1988-1991 namun buku ini kemudian digulung menjadi edisi enam Pengantar Sistem Basis Data , yang merupakan satu teks definitif tentang teori database dan desain, dalam edisi kedelapan saat aku menulis dan kemungkinan akan tetap di cetak selama beberapa dekade yang akan datang. Chris Date adalah seorang ahli dalam bidang ini ketika kebanyakan dari kita masih berlarian tanpa alas kaki.
Dia menemukan bahwa:
- Beberapa dari mereka memegang kasus khusus
- Semuanya gagal membayar untuk penggunaan umum
- Semuanya secara signifikan lebih buruk untuk kasus-kasus khusus lainnya
Semuanya kembali untuk mengurangi ukuran set kerja. Gabungan yang melibatkan kunci yang dipilih dengan benar dengan indeks pengaturan yang benar adalah murah, tidak mahal, karena memungkinkan pemangkasan hasil yang signifikan sebelum baris terwujud.
Mewujudkan hasilnya melibatkan pembacaan disk massal yang merupakan aspek paling mahal dari latihan dengan urutan besarnya. Sebaliknya, melakukan penggabungan secara logis membutuhkan hanya pengambilan kunci . Dalam praktiknya, bahkan nilai kunci tidak diambil: nilai hash kunci digunakan untuk perbandingan gabungan, mengurangi biaya gabungan multi-kolom dan secara radikal mengurangi biaya sambungan yang melibatkan perbandingan string. Tidak hanya akan jauh lebih cocok di cache, ada banyak pembacaan disk yang harus dilakukan.
Selain itu, pengoptimal yang baik akan memilih kondisi yang paling ketat dan menerapkannya sebelum melakukan penggabungan, sangat efektif meningkatkan selektivitas tinggi dari gabungan pada indeks dengan kardinalitas tinggi.
Memang jenis optimisasi ini juga dapat diterapkan pada basis data yang dinormalisasi, tetapi jenis orang yang ingin mendenormalisasi skema biasanya tidak memikirkan kardinalitas ketika (jika) mereka membuat indeks.
Penting untuk memahami bahwa pemindaian tabel (pemeriksaan setiap baris dalam tabel selama menghasilkan gabungan) jarang dilakukan. Pengoptimal permintaan akan memilih pemindaian tabel hanya jika satu atau lebih dari yang berikut ini berlaku.
- Ada kurang dari 200 baris dalam hubungan (dalam hal ini pemindaian akan lebih murah)
- Tidak ada indeks yang sesuai pada kolom gabungan (jika bermakna untuk bergabung pada kolom ini, mengapa mereka tidak diindeks? Perbaiki)
- Suatu jenis pemaksaan diperlukan sebelum kolom dapat dibandingkan (WTF ?! perbaiki atau pulang) LIHAT CATATAN UNTUK ADO.NET MASALAH
- Salah satu argumen perbandingan adalah ekspresi (tanpa indeks)
Melakukan operasi lebih mahal daripada tidak melakukannya. Namun, melakukan operasi yang salah , dipaksa ke disk I / O yang tidak berguna dan kemudian membuang sampah sebelum melakukan penggabungan yang benar-benar Anda butuhkan, jauh lebih mahal. Bahkan ketika operasi "salah" dihitung dan indeks telah diterapkan dengan bijaksana, masih ada penalti yang signifikan. Menormalisasi untuk memulai bergabung - terlepas dari anomali pembaruan yang disyaratkan - adalah komitmen untuk bergabung tertentu. Jika Anda membutuhkan gabung yang berbeda , komitmen itu akan menelan biaya besar .
Jika ada yang ingin mengingatkan saya bahwa ini adalah dunia yang berubah, saya pikir Anda akan menemukan bahwa kumpulan data yang lebih besar pada perangkat keras yang lebih besar hanya melebih-lebihkan penyebaran temuan Date.
Untuk Anda semua yang bekerja pada sistem penagihan atau generator junk mail (malu pada Anda) dan dengan marah mengatur tangan ke keyboard untuk memberi tahu saya bahwa Anda tahu fakta bahwa denormalisasi lebih cepat, maaf tetapi Anda tinggal di salah satu tempat khusus case - khususnya, case di mana Anda memproses semua data, secara berurutan. Ini bukan kasus umum, dan Anda akan dibenarkan dalam strategi Anda.
Anda tidak dibenarkan menggeneralisasikannya secara keliru. Lihat bagian akhir catatan untuk informasi lebih lanjut tentang penggunaan denormalisasi yang tepat dalam skenario pergudangan data.
Saya juga ingin merespons
Bergabung hanyalah produk cartesian dengan beberapa lipgloss
Apa beban omong kosong. Pembatasan diterapkan sedini mungkin, paling membatasi dulu. Anda telah membaca teorinya, tetapi Anda belum memahaminya. Bergabung diperlakukan sebagai "produk cartesian yang predikatnya berlaku" hanya oleh pengoptimal permintaan. Ini adalah representasi simbolis (normalisasi, pada kenyataannya) untuk memfasilitasi dekomposisi simbolis sehingga optimizer dapat menghasilkan semua transformasi yang setara dan peringkat mereka berdasarkan biaya dan selektivitas sehingga dapat memilih rencana permintaan terbaik.
Satu-satunya cara Anda akan mendapatkan pengoptimal untuk menghasilkan produk kartesius adalah gagal memasok predikat: SELECT * FROM A,B
Catatan
David Aldridge memberikan beberapa informasi tambahan penting.
Memang ada berbagai strategi lain selain indeks dan pindaian tabel, dan pengoptimal modern akan menghabiskan semuanya sebelum membuat rencana eksekusi.
Saran praktis: jika dapat digunakan sebagai kunci asing, maka indekskan, sehingga strategi indeks tersedia untuk pengoptimal.
Saya dulu lebih pintar daripada pengoptimal MSSQL. Itu mengubah dua versi yang lalu. Sekarang ini biasanya mengajarkan saya . Ini, dalam arti yang sangat nyata, sistem pakar, mengkodifikasi semua kebijaksanaan banyak orang yang sangat pintar dalam domain yang cukup tertutup sehingga sistem berbasis aturan efektif.
"Bollocks" mungkin tidak bijaksana. Saya diminta untuk tidak terlalu angkuh dan diingatkan bahwa matematika tidak bohong. Ini benar, tetapi tidak semua implikasi model matematika harus diambil secara harfiah. Akar kuadrat dari angka negatif sangat berguna jika Anda dengan hati-hati menghindari memeriksa absurditasnya (pun ada) dan pastikan Anda membatalkan semuanya sebelum Anda mencoba menafsirkan persamaan Anda.
Alasan saya merespons dengan sangat kejam adalah karena pernyataan seperti yang dikatakan mengatakan itu
Bergabung adalah produk kartesius ...
Ini mungkin bukan apa yang dimaksudkan tetapi itu adalah apa yang ditulis, dan itu pasti tidak benar. Produk kartesius adalah suatu hubungan. Gabung adalah fungsi. Lebih khusus lagi, gabungan adalah fungsi yang dihargai relasi. Dengan predikat kosong, itu akan menghasilkan produk kartesius, dan memeriksa apakah itu adalah pemeriksaan kebenaran untuk mesin query basis data, tetapi tidak ada yang menulis gabungan yang tidak dibatasi dalam praktik karena mereka tidak memiliki nilai praktis di luar ruang kelas.
Saya menyebut ini karena saya tidak ingin pembaca jatuh ke dalam perangkap kuno yang membingungkan model dengan model yang dibuat. Model adalah perkiraan, sengaja disederhanakan untuk manipulasi yang mudah.
Cut-off untuk pemilihan strategi join table-scan dapat bervariasi di antara mesin basis data. Hal ini dipengaruhi oleh sejumlah keputusan implementasi seperti tree-node fill-factor, ukuran nilai kunci dan seluk-beluk algoritma, tetapi secara umum indeks kinerja tinggi memiliki waktu eksekusi k log n + c . Istilah C adalah overhead tetap yang sebagian besar terbuat dari waktu setup, dan bentuk kurva berarti Anda tidak mendapatkan hasil (dibandingkan dengan pencarian linier) sampai n ada dalam ratusan.
Terkadang denormalisasi adalah ide yang bagus
Denormalisasi adalah komitmen terhadap strategi bergabung tertentu. Seperti yang disebutkan sebelumnya, ini mengganggu strategi bergabung lainnya . Tetapi jika Anda memiliki ember ruang disk, pola akses yang dapat diprediksi, dan kecenderungan untuk memproses banyak atau semuanya, maka mengkompilasi gabungan bisa sangat bermanfaat.
Anda juga dapat mengetahui jalur akses yang biasanya digunakan operasi Anda dan melakukan prakompilasi semua gabungan untuk jalur akses tersebut. Ini adalah premis di belakang gudang data, atau setidaknya ketika dibangun oleh orang-orang yang tahu mengapa mereka melakukan apa yang mereka lakukan, dan bukan hanya demi kepatuhan kata kunci.
Gudang data yang dirancang dengan baik diproduksi secara berkala oleh transformasi massal dari sistem pemrosesan transaksi yang dinormalisasi. Pemisahan operasi dan basis data pelaporan ini memiliki efek yang sangat diinginkan untuk menghilangkan bentrokan antara OLTP dan OLAP (pemrosesan transaksi online yaitu entri data, dan pemrosesan analitis online yaitu pelaporan).
Poin penting di sini adalah bahwa selain dari pembaruan berkala, gudang data hanya dibaca . Ini membuat saya mempermasalahkan masalah pembaruan anomali.
Jangan membuat kesalahan dengan melumpuhkan basis data OLTP Anda (database tempat entri data terjadi). Mungkin lebih cepat untuk penagihan berjalan tetapi jika Anda melakukannya, Anda akan mendapatkan pembaruan anomali. Pernah mencoba membuat Reader's Digest berhenti mengirim barang kepada Anda?
Ruang disk saat ini murah, jadi hancurkan diri Anda. Tetapi denormalising hanya bagian dari cerita untuk gudang data. Keuntungan kinerja yang jauh lebih besar berasal dari nilai-nilai digulung yang telah diperhitungkan: total bulanan, hal semacam itu. Itu selalu tentang mengurangi set kerja.
Masalah ADO.NET dengan tipe ketidakcocokan
Misalkan Anda memiliki tabel SQL Server yang berisi kolom indeks tipe varchar, dan Anda menggunakan AddWithValue untuk melewatkan parameter yang membatasi kueri pada kolom ini. String C # adalah Unicode, jadi tipe parameter yang disimpulkan adalah NVARCHAR, yang tidak cocok dengan VARCHAR.
VARCHAR ke NVARCHAR adalah konversi pelebaran sehingga terjadi secara implisit - tetapi mengucapkan selamat tinggal pada pengindeksan, dan semoga berhasil mencari tahu mengapa.
"Hitung hit disk" (Rick James)
Jika semuanya di-cache dalam RAM, JOINs
agak murah. Artinya, normalisasi tidak memiliki banyak penalti kinerja .
Jika skema "dinormalisasi" menyebabkan JOINs
banyak disk, tetapi skema "denormalized" yang setara tidak harus mengenai disk, maka denasionalisasi memenangkan persaingan kinerja.
Komentar dari penulis asli: Mesin database modern sangat baik mengatur pengurutan akses untuk meminimalkan kesalahan cache selama operasi gabungan. Sementara di atas, sementara benar, mungkin salah dikartikan sebagai menyiratkan bahwa bergabung tentu mahal pada data besar. Hal ini akan menyebabkan pengambilan keputusan yang buruk di pihak pengembang yang tidak berpengalaman.