Kami memiliki tabel besar [MyTable]
yang saat ini memiliki a Primary Key
, dan a Unique Non Clustered Index
pada kolom yang sama ( [KeyColumn]
). Indeks U NC juga memiliki kolom penutup tambahan.
Memiliki kedua PK dan Indeks NC Unik pada kolom yang sama tampaknya berlebihan, jadi saya sedang mempertimbangkan menghapus Kunci Utama dan sebagai gantinya menggunakan indeks Unik Non Clustered untuk keperluan Integritas Referensial.
Perhatikan bahwa tabel dikelompokkan oleh kolom lain seluruhnya.
Yaitu Jadi kita memiliki:
ALTER TABLE [MyTable]
ADD CONSTRAINT [PK_MyTable]
PRIMARY KEY NONCLUSTERED ([KeyColumn])
GO
DAN
CREATE UNIQUE NONCLUSTERED INDEX [IX_MyTable_SomeIndex]
ON [MyTable] ([KeyColumn])
INCLUDE ([Column1], [Column2])
GO
Sejauh yang saya tahu, tidak mungkin menambahkan kolom penutup ke Kunci Utama, jadi saya bermaksud untuk melakukan:
- Jatuhkan Batasan Kunci Asing bergantung pada
MyTable.KeyColumn
- Jatuhkan Kunci Utama
MyTable.KeyColumn
sepenuhnya - Tambahkan kembali kunci asing ke tabel (yaitu RI akan diberlakukan melalui
MyTable.KeyColumn
)
Satu-satunya implikasi yang dapat saya pikirkan untuk melakukan ini adalah bahwa kita tidak akan mendapatkan simbol kunci visual pada diagram ERD kita, dan bahwa kepadatan indeks (daun) akan lebih sedikit karena kolom yang disertakan.
Saya telah membaca /programming/487314/primary-key-or-unique-index dan saya senang dengan aspek integritas dan kinerja dalam melakukan ini.
Pertanyaan saya adalah: Apakah pendekatan ini cacat?
Edit Apa yang saya coba capai : Optimasi Kinerja dan Pembersihan Musim Semi . Dengan menghapus baik PK atau Indeks, akan ada lebih sedikit halaman yang dibutuhkan untuk indeks saya = menulis lebih cepat, ditambah juga manfaat pemeliharaan / operasional, yaitu satu indeks lebih sedikit untuk terus defrag dll.
Untuk menjelaskan hal ini, saya belum pernah punya meja yang direferensikan, tanpa PK. Namun, fakta bahwa Indeks NC dengan kolom penutup ditambahkan ke tabel berarti bahwa saya perlu menyesuaikan pemikiran saya.
sumber
Jawaban:
Anda harus dapat membuktikan bahwa apa yang diusulkan akan benar-benar membantu (biaya vs. manfaat). Untuk alasan apa perubahan ini dipertimbangkan? Apakah sebenarnya ada masalah kinerja dengan tabel ini, atau hanya "terlihat salah"?
Berikut beberapa pertanyaan lain yang akan membantu Anda mengambil keputusan terbaik untuk lingkungan Anda:
Berapa banyak waktu yang akan dihemat di jendela perawatan? Di jendela cadangan?
Berapa banyak ruang penyimpanan yang akan dihemat ini (file data, file log, cadangan, dll.)?
Apakah
INSERT
kinerja pada tabel ini benar - benar menjadi hambatan saat ini? Berapa banyak yang akan ditingkatkan? Apakah menghapus indeks merupakan strategi terbaik untuk memperbaiki masalah itu?Apakah ini akan menyebabkan masalah dengan alat dan kerangka kerja basis data (khususnya ORM) yang mengharapkan setiap tabel memiliki kunci utama dan bukan hanya indeks unik? Replikasi Transaksional membutuhkan kunci utama pada tabel yang diterbitkan.
Apakah skema basis data yang mendokumentasikan sendiri penting?
Meskipun penggunaannya terbatas, apakah sempitnya indeks kunci utama masih memungkinkan pengoptimal untuk menghasilkan rencana yang lebih efisien untuk permintaan tertentu? (Gunakan
sys.dm_db_index_usage_stats
untuk mencari tahu.)Secara pribadi, dari apa yang telah Anda katakan kepada kami, saya akan membiarkannya sampai dapat dibuktikan bahwa kedua (a) indeks tambahan adalah masalah, dan (b) menghapusnya adalah solusinya.
sumber
Satu-satunya jenis kueri pada tabel itu yang akan berkinerja lebih buruk (dan hanya sedikit lebih buruk) adalah mereka yang meminta berbagai nilai KeyColumn - karena pertanyaan tersebut saat ini akan lebih baik dilayani oleh pencarian indeks di PK Anda.
Perlu diingat bahwa biaya pemeriksaan integritas referensial untuk tabel yang mereferensikan tabel ini akan lebih tinggi (sekali lagi hanya sedikit lebih tinggi).
Selama Anda mengurus aspek yang dapat dibatalkan, maka Anda harus baik-baik saja dengan satu indeks.
Jika itu DB saya, saya mungkin akan memilih satu indeks unik, semua hal lain dianggap sama.
sumber
Jika Anda memiliki indeks berkerumun di KeyColumn, maka karena itu adalah indeks berkerumun, semua kolom lainnya secara implisit 'tertutup'. Jadi Anda tidak mendapatkan apa-apa dengan menambahkan indeks lain di KeyColumn. Bahkan Anda akan memperlambat sisipan Anda dan menggunakan lebih banyak ruang.
Ini karena indeks berkerumun bukan indeks seperti itu, tetapi hanya instruksi untuk menyimpan baris tabel dalam urutan indeks. Dan setelah Anda menemukan satu baris dengan kunci utama, maka Anda memiliki semua kolom lainnya di sana.
sumber
The table is clustered by another column entirely.