Saya punya sesuatu seperti ini:
CREATE TABLE T1 (
Id INT
...
,Constraint [PK_T1] PRIMARY KEY CLUSTERED [Id]
)
CREATE TABLE T2 (
....
,T1_Id INT NOT NULL
,CONSTRAINT [FK_T2_T1] FOREIGN KEY (T1_Id) REFERENCES T1(Id)
)
Untuk alasan kinerja (dan kebuntuan) saya membuat indeks baru di T1
CREATE UNIQUE NONCLUSTERED INDEX IX_T1_Id ON T1 (Id)
Tetapi jika saya memeriksa Indeks mana yang merujuk pada FK, terus merujuk pada indeks yang dikelompokkan
select
ix.index_id,
ix.name as index_name,
ix.type_desc as index_type_desc,
fk.name as fk_name
from sys.indexes ix
left join sys.foreign_keys fk on
fk.referenced_object_id = ix.object_id
and fk.key_index_id = ix.index_id
and fk.parent_object_id = object_id('T2')
where ix.object_id = object_id('T1');
Jika saya menghilangkan batasan dan membuat lagi itu merujuk pada indeks nonclustered, tetapi ini mengarah untuk memeriksa semua t2 FK lagi.
Apakah ada cara untuk mengubah ini sehingga FK_T2_T1 menggunakan IX_T1_Id bukannya PK_T1 tanpa menjatuhkan FK dan mengunci tabel pada pemeriksaan FK?
Terima kasih!
sql-server
sql-server-2014
foreign-key
Mariano G
sumber
sumber
Jawaban:
Nah, setelah terus mencari saya menemukan artikel ini
Karena itu, kecuali seseorang dapat mengatakan sebaliknya, saya harus mencari waktu untuk melakukan tugas ini.
Terima kasih
sumber
Setelah membaca MS DOCS di sini .
Jika Anda, saya percaya menambahkan FK baru dan menghapus yang lama. Untuk menonaktifkan pemindaian, Anda dapat menggunakan
NO CHECK
opsiLihat apakah ini berfungsi, apa yang saya coba adalah menambahkan satu lagi FK sehingga yang baru dikaitkan dengan indeks baru yang dibuat dan lepaskan FK yang lama. Saya tahu pertanyaannya bukan untuk menjatuhkan yang sudah ada tapi lihat apakah opsi ini akan membantu Anda.
Juga, sesuai komentar dari Max Vernon: "opsi WITH NOCHECK akan mencegah kunci asing dipercaya oleh pengoptimal. Pada titik tertentu, Anda harus mengubah kunci asing sehingga dipercaya menggunakan ALTER TABLE ... DENGAN PERIKSA "
The
NOCHECK
hanya akan diabaikan pada saat penciptaan, tetapi untuk menegakkan contraint integritas Anda telah menjalankan ini di beberapa titik waktu.sumber
WITH NOCHECK
pilihan akan mencegah kunci asing yang dipercaya oleh optimizer. Pada titik tertentu, Anda harus mengubah kunci asing agar dapat dipercaya menggunakanALTER TABLE ... WITH CHECK