Saat ini, kami memiliki database dan aplikasi yang sudah ada yang berfungsi penuh. Saya tidak memiliki kemampuan untuk mengubah arsitektur pada saat ini. Hari ini, setiap tabel dalam database memiliki bidang "IsDeleted" BUKAN NULL BIT dengan default '0'. Ketika aplikasi "menghapus" data, itu hanya memperbarui bendera IsDeleted ke 1.
Yang saya mengalami kesulitan memahami adalah bagaimana indeks pada masing-masing tabel harus disusun. Saat ini, setiap query / join / etc selalu mengimplementasikan pemeriksaan IsDeleted. Ini adalah standar yang harus diikuti oleh pengembang kami. Yang sedang berkata, saya mencoba untuk menentukan apakah semua indeks kunci utama berkerumun saya pada setiap tabel perlu diubah untuk memasukkan kunci utama DAN bidang BIT IsDeleted. Juga, karena SETIAP permintaan / gabung / dll. harus menerapkan pemeriksaan IsDeleted, apakah ini asumsi yang tepat bahwa indeks SETIAP TUNGGAL (non-clustered juga) harus menyertakan bidang IsDeleted sebagai bidang pertama indeks?
Satu pertanyaan lain yang saya miliki adalah sekitar indeks yang difilter. Saya mengerti bahwa saya dapat menempatkan filter pada indeks seperti "WHERE IsDeleted = 0" untuk mengurangi ukuran indeks. Namun, karena setiap join / kueri harus mengimplementasikan cek IsDeleted, apakah itu akan mencegah indeks difilter dari digunakan (karena kolom IsDeleted digunakan dalam join / query)?
Ingat, saya tidak memiliki kemampuan untuk mengubah pendekatan IsDeleted.
sumber
IsDeleted
kolom, terlepas dari penyimpanan fisik, mungkin masuk akal untuk mengekspos data melalui dua tampilan (opsional dalam skema yang berbeda), menyelesaikan masalah parameterisasi dan membuat kesalahan dengan mengakses data yang seharusnya tidak diakses lebih kecil kemungkinannya. Mengakses data dasar hanya relevan untuk kasus-kasus langka di mana data yang dihapus dan tidak terhapus perlu digabungkan entah bagaimana, dan ketika baris sebenarnya perlu diubah ke "dihapus".Ini mungkin pendapat yang tidak populer, tapi saya rasa tidak ada "lakukan ini di mana-mana" / satu ukuran cocok untuk semua jawaban atas pertanyaan Anda.
Jika Anda memiliki kueri yang memindai banyak baris IsDeleted tanpa alasan, salah satu solusinya adalah membuat indeks yang difilter dan tidak disaring untuk memenuhi kueri itu.
Opsi lain adalah membuat tampilan yang diindeks yang dapat dimanfaatkan oleh sejumlah kueri yang berbeda, yang difilter hanya ke baris yang tidak dihapus. Ini bisa sangat berguna pada Edisi Perusahaan, di mana pencocokan tampilan terindeks otomatis berfungsi tanpa memberikan
NOEXPAND
petunjuk.Untuk tabel kecil, atau tabel yang banyak dibaca, menambahkan indeks atau tampilan nonclustered yang difilter atau yang lainnya mungkin hanya menambahkan overhead yang tidak perlu ke dalam database Anda.
sumber
Di bawah asumsi masuk akal bahwa penghapusan jarang terjadi, tidak ada perubahan pada indeks adalah solusi yang tepat.
Saya menemukan bahwa cepat atau lambat orang harus meminta referensi untuk baris yang dihapus, dan baris yang ada dalam indeks tiba-tiba sangat berharga.
Harap perhatikan bahwa kecuali jika Anda menggunakan tampilan, Anda harus mengedit semua pertanyaan Anda untuk tetap menyertakan filter.
sumber
Saya telah melihat sistem di mana bendera IS_DELETED bernilai 0 atau nilai PK. Dalam sistem lain itu adalah negatif dari PK.
Karena sebagian besar kueri mengambil nilai dengan kunci "alami" atau bisnis (terkadang multi-bidang), mereka tidak pernah ditanyai oleh PK kecuali melalui gabungan; tetapi mereka selalu menambahkan AND IS_DELETED = 0 di akhir untuk tabel utama dan untuk semua tabel yang tergabung.
Sistem ini juga memiliki tabel audit untuk setiap tabel transaksional yang melacak perubahan; dan aplikasi memiliki fitur untuk menampilkan semua perubahan data termasuk data yang dihapus.
sumber
Semoga Anda memiliki hak dan kemampuan untuk mengubah kueri.
Saya ingin mengatakan satu poin penting, semoga saya bisa menjelaskannya.
Dalam kueri kompleks di mana
Transaction table
danMaster
tabel keduanya digunakan.Gunakan
IsDeleted=0
hanya dalamTransaction
tabel. Jangan gunakan dalamMaster
tabel.Contoh,
Tidak ada gunanya
c.isdeleted=0
(menggunakan dalamCategory
tabel). Tidak perlu.Demikian pula apakah ada gunanya menggunakan
P.isdeleted=0
?Karena saya ingin semua Urutan yang belum dihapus dan detailnya.
Bagaimana bisa
Product
dihapus saatOrder
iniActive
atau di mana punProductid
adalah referensi.Jadi dengan cara ini jika Anda men-debug dengan hati-hati dalam permintaan penting, maka mungkin Anda dapat menghapus beberapa isdeleted = 0.
Jangan membabi buta Buat Indeks yang Difilter, pertama-tama pilih semua permintaan yang sangat penting dan lambat itu.
Optimalkan kueri lambat itu lalu tentukan saja tentang Indeks Tersaring atau Indeks Selaras.
sumber