বৈদেশিক কী এর জন্য রেফারেন্সড ইনডেক্স পরিবর্তন করুন


9

আমার এরকম কিছু রয়েছে:

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)
)

পারফরম্যান্সের (এবং ডেডলক) কারণে আমি টি 1 এ একটি নতুন সূচক তৈরি করেছি

CREATE UNIQUE NONCLUSTERED INDEX IX_T1_Id ON T1 (Id)

তবে যদি আমি পরীক্ষা করে দেখি যে সূচকটি এফকে কে রেফারেন্স করে, তবে ক্লাস্টারড ইনডেক্সে রেফারেন্স রাখে

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');

যদি আমি সীমাবদ্ধতাটি ছেড়ে দিই এবং আবার তৈরি করি তবে এটি অবিবাহিত সূচকের উল্লেখ করে তবে এই সমস্ত টি 2 এফকে আবার যাচাই করে।

এটি পরিবর্তন করার কোনও উপায় আছে যাতে FK_T2_T1 এফকে না ফেলে এবং এফকে চেকিংয়ে টেবিলটি লক না করে PK_T1 এর পরিবর্তে IX_T1_Id ব্যবহার করে?

ধন্যবাদ!


একটা প্রাসঙ্গিক আলোচনা ছিল এখানে
আই-ওয়ান

উত্তর:


6

ঠিক আছে, অনুসন্ধান চালিয়ে যাওয়ার পরে আমি এই নিবন্ধটি পেয়েছি

একটি সাধারণ ক্যোয়ারের বিপরীতে, পরিসংখ্যান আপডেট হওয়ার কারণে, একটি নতুন সূচক তৈরি হচ্ছে, এমনকি একটি সার্ভার পুনরায় বুট হওয়ার কারণে এটি কোনও নতুন সূচকটি গ্রহণ করবে না। অন্য সূচকের সাথে এফকে বাঁধাই সম্পর্কে আমি অবগত যে একমাত্র উপায় হ'ল এফকে বাদ দিন এবং পুনরায় তৈরি করুন, এটি ম্যানুয়ালি নিয়ন্ত্রণের কোনও বিকল্প ছাড়াই সূচকটি স্বয়ংক্রিয়ভাবে নির্বাচন করতে দেয়।

ততক্ষণে, অন্যথায় কেউ না বলতে না পারলে, এই কাজটি সম্পাদন করার জন্য আমাকে একটি সময় উইন্ডো সন্ধান করতে হবে।

ধন্যবাদ


2

এমএস ডকস পড়ার পরে এখানে

একটি বিদেশী কী পরিবর্তন করতে

লেনদেন-এসকিউএল ব্যবহার করে একটি বিদেশী কী সীমাবদ্ধতা সংশোধন করতে আপনাকে প্রথমে বিদ্যমান বিদেশী কী বাধা মুছে ফেলতে হবে এবং তারপরে নতুন সংজ্ঞা দিয়ে পুনরায় তৈরি করতে হবে। আরও তথ্যের জন্য, দেখুন বিদেশী মূল সম্পর্কগুলি মুছুন এবং বৈদেশিক কী সম্পর্ক তৈরি করুন।

আপনার ক্ষেত্রে আমি বিশ্বাস করি যে একটি নতুন এফকে যুক্ত করুন এবং পুরানোটি মুছুন। স্ক্যান অক্ষম করতে আপনি NO CHECKবিকল্পটি ব্যবহার করতে পারেন

--DROP TABLE T2
--DROP TABLE T1


CREATE TABLE T1 (
    [Id] INT,
    [NAME] varchar(100), CONSTRAINT [PK_T1] PRIMARY KEY CLUSTERED (id))

CREATE TABLE T2 (
    t2_id int,
    T1_Id INT NOT NULL
    ,CONSTRAINT [FK_T2_T1] FOREIGN KEY (T1_Id) REFERENCES T1(Id)
)


CREATE UNIQUE NONCLUSTERED INDEX IX_T1_Id ON T1 (Id)


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');



╔══════════╦════════════╦═════════════════╦══════════╗
 index_id  index_name  index_type_desc  fk_name  
╠══════════╬════════════╬═════════════════╬══════════╣
        1  PK_T1       CLUSTERED        FK_T2_T1 
        2  IX_T1_Id    NONCLUSTERED     NULL     
╚══════════╩════════════╩═════════════════╩══════════╝




 ALTER TABLE T2
    WITH NOCHECK 
    ADD CONSTRAINT [FK_T2_T1_NEW] FOREIGN KEY(T1_Id)
    REFERENCES T1(Id)

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');


╔══════════╦════════════╦═════════════════╦══════════════╗
 index_id  index_name  index_type_desc    fk_name    
╠══════════╬════════════╬═════════════════╬══════════════╣
        1  PK_T1       CLUSTERED        FK_T2_T1     
        2  IX_T1_Id    NONCLUSTERED     FK_T2_T1_NEW 
╚══════════╩════════════╩═════════════════╩══════════════╝   

ALTER TABLE T2  
DROP CONSTRAINT FK_T2_T1 

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');


╔══════════╦════════════╦═════════════════╦══════════════╗
 index_id  index_name  index_type_desc    fk_name    
╠══════════╬════════════╬═════════════════╬══════════════╣
        1  PK_T1       CLUSTERED        NULL         
        2  IX_T1_Id    NONCLUSTERED     FK_T2_T1_NEW 
╚══════════╩════════════╩═════════════════╩══════════════╝

দেখুন কি এটি কাজ করে, আমি যা চেষ্টা করছি তা আরও একটি এফকে যুক্ত করা যাতে নতুনটি তৈরি হওয়া নতুন সূচকের সাথে যুক্ত হয় এবং পুরানো এফকে বাদ দেয়। আমি জানি প্রশ্নটি বিদ্যমানটি বাদ দেওয়ার নয় তবে দেখুন এই বিকল্পটি আপনাকে সহায়তা করবে কিনা।

এছাড়াও, ম্যাক্স ভার্ননের মন্তব্য অনুসারে: "উইথ এনওচেক বিকল্পটি বিদেশী কীটি অপ্টিমাইজারের দ্বারা বিশ্বাসযোগ্য হওয়া থেকে বিরত করবে some পরীক্ষা করে দেখুন "

NOCHECKশুধুমাত্র সৃষ্টির সময়ে উপেক্ষা করা হবে কিন্তু সততা contraint জোরদার করা সময় কিছু সময়ে এই ফেলেছেন।


WITH NOCHECKফরেইন কী প্রতিরোধ করবে বিকল্প অপটিমাইজার দ্বারা বিশ্বস্ত হচ্ছে। এক পর্যায়ে, আপনাকে বিদেশী কীটি পরিবর্তন করতে হবে যাতে এটি ব্যবহার করে বিশ্বাস করা যায়ALTER TABLE ... WITH CHECK
ম্যাক্স ভার্নন

@ ম্যাক্স ভার্নন যাতে তার মানে আমাদের কাছে বিকল্প নেই
বিজু জোসে

সঠিক। নতুন সূচকটি ব্যবহার করার জন্য বিদেশী কী পাওয়ার একমাত্র উপায় হ'ল চেক বিকল্পটি অক্ষত রেখে বিদেশী কীটি পুনরায় তৈরি করা।
ম্যাক্স ভার্নন

@ ম্যাক্স ভার্নন, তারপরে উত্তরটি আপডেট করবেন
বিজু

আইজিকাল ডকুমেন্টের জন্য @ বিজু জোসকে ধন্যবাদ।
মারিয়ানো জি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.