কীভাবে এসকিউএল সার্ভার বিদেশী কী রেফারেন্সের জন্য একটি সূচক কী চয়ন করে?


9

আমি এমএস অ্যাক্সেস থেকে আমদানি করা লিগ্যাসি ডেটাবেস নিয়ে কাজ করছি। এমএস অ্যাক্সেস> এসকিউএল সার্ভার আপগ্রেড করার সময় অ-ক্লাস্টারযুক্ত, অনন্য প্রাথমিক কীগুলির সাথে প্রায় বিশ টি টেবিল রয়েছে।

এর মধ্যে অনেকগুলি সারণীতেও অনন্য, ক্লাস্টারযুক্ত সূচি নেই যা প্রাথমিক কীটির সদৃশ।

আমি এটি পরিষ্কার করার চেষ্টা করছি।

তবে আমি যা পেয়েছি তা হল ক্লাস্টার ইনডেক্স হিসাবে প্রাথমিক কীগুলি পুনরায় তৈরি করার পরে, এবং তারপরে বিদেশী কী পুনর্নির্মাণের চেষ্টা করার পরে, বিদেশী কীটি পুরানো, সদৃশ সূচকটি উল্লেখ করছে (যা অনন্য ছিল)।

আমি এটি জানি কারণ এটি আমাকে সদৃশ সূচকগুলি ছাড়তে দেয় না।

আমি মনে করি এসকিউএল সার্ভার যদি বিদ্যমান থাকে তবে সর্বদা একটি প্রাথমিক কী বেছে নেবে। এসকিউএল সার্ভারের কোনও অনন্য সূচক এবং একটি প্রাথমিক কী এর মধ্যে নির্বাচনের কোনও পদ্ধতি আছে?

সমস্যার সদৃশ করতে (এসকিউএল সার্ভার ২০০৮ আর 2 তে):

IF EXISTS (SELECT * FROM sys.tables WHERE name = 'Child') DROP TABLE Child
GO
IF EXISTS (SELECT * FROM sys.tables WHERE name = 'Parent') DROP TABLE Parent
GO

-- Create the parent table
CREATE TABLE Parent (ParentID INT NOT NULL IDENTITY(1,1)) 

-- Make the parent table a heap
ALTER TABLE Parent ADD CONSTRAINT PK_Parent PRIMARY KEY NONCLUSTERED (ParentID) 

-- Create the duplicate index on the parent table
CREATE UNIQUE NONCLUSTERED INDEX IX_Parent ON Parent (ParentID) 

-- Create the child table
CREATE TABLE Child  (ChildID  INT NOT NULL IDENTITY(1,1), ParentID INT NOT NULL ) 

-- Give the child table a normal PKey
ALTER TABLE Child ADD CONSTRAINT PK_Child PRIMARY KEY CLUSTERED (ChildID) 

-- Create a foreign key relationship with the Parent table on ParentID
ALTER TABLE Child ADD CONSTRAINT FK_Child FOREIGN KEY (ParentID) 
REFERENCES Parent (ParentID) ON DELETE CASCADE NOT FOR REPLICATION

-- Try to clean this up
-- Drop the foreign key constraint on the Child table
ALTER TABLE Child DROP CONSTRAINT FK_Child

-- Drop the primary key constraint on the Parent table
ALTER TABLE Parent DROP CONSTRAINT PK_Parent

-- Recreate the primary key on Parent as a clustered index
ALTER TABLE Parent ADD CONSTRAINT PK_Parent PRIMARY KEY CLUSTERED (ParentID) 

-- Recreate the foreign key in Child pointing to parent ID
ALTER TABLE Child ADD CONSTRAINT FK_Child FOREIGN KEY (ParentID) 
REFERENCES Parent (ParentID) ON DELETE CASCADE NOT FOR REPLICATION

-- Try to drop the duplicate index on Parent 
DROP INDEX IX_Parent ON Parent 

ত্রুটি

এমএসজি 3723, স্তর 16, রাজ্য 6, লাইন 36 'প্যারেন্ট.আইএক্স_প্যারেন্ট' সূচকে একটি সুস্পষ্ট ডিআরপি আইএনডিএক্স অনুমোদিত নয়। এটি বিদেশী কী বাধা প্রয়োগের জন্য ব্যবহৃত হচ্ছে।


মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
পল হোয়াইট 9

উত্তর:


7

(অভাবের) ডকুমেন্টেশন পরামর্শ দেয় যে এই আচরণটি একটি বাস্তবায়নের বিশদ, এবং অতএব অপরিবর্তিত এবং যে কোনও সময় পরিবর্তিত হতে পারে।

এটি ক্রিয়েট ফুলটেক্সট ইন্ডেক্সের সম্পূর্ণ বিপরীতে যেখানে আপনাকে সংযুক্ত করার জন্য কোনও সূচকের নাম উল্লেখ করতে হবে - আফাইক, FOREIGN KEYসমতুল্য করার জন্য কোনও অনাবন্ধিত সিনট্যাক্স নেই (যদিও তাত্ত্বিকভাবে ভবিষ্যতে থাকতে পারে)।

যেমনটি উল্লিখিত হয়েছে, এটি বোঝা যায় না যে এসকিউএল সার্ভার বিদেশী কী সংযুক্ত করার জন্য সবচেয়ে ক্ষুদ্রতম শারীরিক সূচকটি বেছে নেয়। আপনি যদি অনন্য বাধা তৈরি করতে স্ক্রিপ্টটি পরিবর্তন করেন তবে স্ক্রিপ্টটি CLUSTERED২০০৮ R2 তে "কাজ করে"। তবে সেই আচরণটি এখনও অপরিজ্ঞাত এবং নির্ভর করা উচিত নয়।

বেশিরভাগ উত্তরাধিকারী অ্যাপ্লিকেশনগুলির মতো, আপনাকে কেবল নিষ্ঠুরতা এবং কৌতুকপূর্ণ জিনিসগুলি নামাতে হবে।


"এসকিউএল সার্ভার বিদেশী কী সংযুক্ত করার জন্য ক্ষুদ্রতম শারীরিক সূচকটি বেছে নেয়" অগত্যা আসলে। প্রতিবেশী উত্তরের একটি উদাহরণ রয়েছে যেখানে স্কেল সার্ভার সূচকটি বেছে নেয় যা ক্ষুদ্রতম শারীরিক আকারের নয়।
আই-ওয়ান

3

এসকিউএল সার্ভারের কোনও অনন্য সূচক এবং একটি প্রাথমিক কী এর মধ্যে নির্বাচনের কোনও পদ্ধতি আছে?

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

প্রাথমিক কীটি যদি রেফারেন্স করা প্রয়োজন, তবে কেবলমাত্র সারণীর নাম উল্লেখ করা উচিত বিদেশী কী সংজ্ঞাতে এবং উল্লেখ করা কলামগুলির তালিকা বাদ দেওয়া উচিত:

ALTER TABLE Child
    ADD CONSTRAINT FK_Child_Parent FOREIGN KEY (ParentID)
        -- omit key columns of the referenced table
        REFERENCES Parent /*(ParentID)*/;

নীচে আরও বিশদ।


নিম্নলিখিত সেটআপ বিবেচনা করুন:

CREATE TABLE T (id int NOT NULL, a int, b int, c uniqueidentifier, filler binary(1000));
CREATE TABLE TRef (tid int NULL);

যেখানে টেবিলটি TRefরেফারেন্স সারণিতে মনস্থ করে T

রেফারেন্সিয়াল সীমাবদ্ধতা তৈরি করতে কেউ ALTER TABLEদুটি বিকল্পের সাহায্যে কমান্ড ব্যবহার করতে পারে :

ALTER TABLE TRef
    ADD CONSTRAINT FK_TRef_T_1 FOREIGN KEY (tid) REFERENCES T (id);

ALTER TABLE TRef
    ADD CONSTRAINT FK_TRef_T_2 FOREIGN KEY (tid) REFERENCES T;

লক্ষ্য করুন যে দ্বিতীয় ক্ষেত্রে সারণীর কোনও কলাম উল্লেখ করা হয়নি ( REFERENCES Tবনাম REFERENCES T (id))।

যেহেতু Tএখনও কোনও কী সূচি নেই, এই আদেশগুলি কার্যকর করা ত্রুটি তৈরি করবে।

প্রথম কমান্ড নিম্নলিখিত ত্রুটি প্রদান করে:

এমএসজি 1776, স্তর 16, রাজ্য 0, লাইন 4

রেফারেন্সিং সারণী 'টি' তে এমন কোনও প্রাথমিক বা প্রার্থী কী নেই যা বিদেশী কী 'FK_TRef_T_1' তে রেফারেন্সিং কলাম তালিকার সাথে মেলে।

দ্বিতীয় কমান্ড, যদিও বিভিন্ন ত্রুটি প্রদান করে:

এমএসজি 1773, স্তর 16, রাজ্য 0, লাইন 4

বিদেশী কী 'FK_TRef_T_2' অবজেক্ট 'টি' তে অন্তর্নিহিত রেফারেন্স রয়েছে যা এতে কোনও প্রাথমিক কী সংজ্ঞায়িত করে না।

দেখুন প্রথম ক্ষেত্রে প্রত্যাশাটি প্রাথমিক বা প্রার্থী কীগুলি , তবে দ্বিতীয় ক্ষেত্রে প্রত্যাশা কেবল প্রাথমিক কী

এসকিএলএস সার্ভার দ্বিতীয় কমান্ডের সাহায্যে প্রাথমিক কী ছাড়া অন্য কিছু ব্যবহার করবে কিনা তা পরীক্ষা করে দেখা যাক।

যদি আমরা কিছু অনন্য সূচি এবং অনন্য কী যুক্ত করি T:

CREATE UNIQUE INDEX IX_T_1 on T(id) INCLUDE (filler);
CREATE UNIQUE INDEX IX_T_2 on T(id) INCLUDE (c);
CREATE UNIQUE INDEX IX_T_3 ON T(id) INCLUDE (a, b);

ALTER TABLE T
    ADD CONSTRAINT UQ_T UNIQUE CLUSTERED (id);

FK_TRef_T_1সৃষ্টির জন্য কমান্ড সাফল্য পেয়েছে, তবে FK_TRef_T_2এখনও তৈরির আদেশটি এমএসজি 1773 এর সাথে ব্যর্থ হয়।

অবশেষে, আমরা যদি প্রাথমিক কী যুক্ত করি তবে T:

ALTER TABLE T
    ADD CONSTRAINT PK_T PRIMARY KEY NONCLUSTERED (id);

FK_TRef_T_2সৃষ্টির জন্য আদেশ সফল হয়েছে eds

আসুন টেবিলে Tবিদেশী কী দ্বারা সারণীর সূচীগুলি কী তা উল্লেখ করা হয় তা দেখুন TRef:

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('TRef')
where ix.object_id = object_id('T');

এটি ফিরে আসে:

index_id  index_name  index_type_desc   fk_name
--------- ----------- ----------------- ------------
1         UQ_T        CLUSTERED         NULL
2         IX_T_1      NONCLUSTERED      FK_TRef_T_1
3         IX_T_2      NONCLUSTERED      NULL
4         IX_T_3      NONCLUSTERED      NULL
5         PK_T        NONCLUSTERED      FK_TRef_T_2

দেখতে FK_TRef_T_2মিলা PK_T

সুতরাং, হ্যাঁ, REFERENCES Tসিনট্যাক্সের সাথে বিদেশী কী এর TRefপ্রাথমিক কীতে ম্যাপ করা হয়েছে T

আমি স্কেল সার্ভার ডকুমেন্টেশনে সরাসরি বর্ণিত এ জাতীয় আচরণ খুঁজে পাইনি, তবে উত্সর্গীকৃত এমএসজি 1773 পরামর্শ দেয় যে এটি দুর্ঘটনাক্রমে নয়। সম্ভবত এ জাতীয় বাস্তবায়ন এসকিউএল স্ট্যান্ডার্ডের সাথে সম্মতি সরবরাহ করে, নীচে এএনএসআই / আইএসও 9075-2: 2003 এর ১১.৮ ধারা থেকে সংক্ষিপ্ত অংশ

11 স্কিমার সংজ্ঞা এবং কারসাজি

11.8 <রেফারেন্সিয়াল সীমাবদ্ধতার সংজ্ঞা>

ফাংশন
একটি রেফারেন্সিয়াল সীমাবদ্ধতা নির্দিষ্ট করে।

বিন্যাস

<referential constraint definition> ::=
    FOREIGN KEY <left paren> <referencing columns> <right paren>
        <references specification>

<references specification> ::=
    REFERENCES <referenced table and columns>
    [ MATCH <match type> ]
    [ <referential triggered action> ]
...

সিনট্যাক্স বিধি
...
3) কেস:
...
খ) যদি <রেফারেন্সেড টেবিল এবং কলামগুলি <একটি রেফারেন্স কলাম তালিকা> নির্দিষ্ট করে না, তবে রেফারেন্সযুক্ত সারণির টেবিল বর্ণনাকারীতে একটি অনন্য বাধা অন্তর্ভুক্ত করা হবে যা প্রাথমিক কী নির্দিষ্ট করে। যাক রেফারেন্সড কলাম কলাম বা যে অনন্য বাধ্যতা অনন্য কলাম দ্বারা চিহ্নিত কলাম হতে হবে এবং দিন রেফারেন্সড কলাম এক ধরনের কলাম হতে। <রেফারেন্স সারণী এবং কলামগুলি> স্পষ্টভাবে একটি <রেফারেন্স কলাম তালিকা> যা << অনন্য কলাম তালিকার অনুরূপ> নির্দিষ্ট করে বিবেচিত হবে।
...

লেনদেন-এসকিউএল এএনএসআই এসকিউএল সমর্থন করে এবং প্রসারিত করে। এটি ঠিক তবে এসকিউএল স্ট্যান্ডার্ডের সাথে খাপ খায় না। এসকিউএল সার্ভার লেনদেন-এসকিউএল আইএসও / আইসিআই 9075-2 স্ট্যান্ডার্ডস সাপোর্ট ডকুমেন্ট (সংক্ষেপে এমএস-টিএসকিউএসআইএলআইএসও ২2, এখানে দেখুন ) নামক একটি নথি রয়েছে যা ট্রানজ্যাক্ট-এসকিউএল দ্বারা সরবরাহিত সহায়তার স্তর বর্ণনা করে। দস্তাবেজটি স্ট্যান্ডার্ডে এক্সটেনশন এবং প্রকরণগুলি তালিকাভুক্ত করে। উদাহরণস্বরূপ এটি দলিল করে যে MATCHরেফারেন্সিয়াল সীমাবদ্ধতার সংজ্ঞাতে ধারাটি সমর্থন করে না। তবে স্ট্যান্ডার্ড টুকরাটির সাথে সম্পর্কিত কোনও ডকুমেন্টেড ভিন্নতা নেই। সুতরাং, আমার মতে পর্যবেক্ষণ করা আচরণ যথেষ্ট নথিভুক্ত।

এবং REFERENCES T (<reference column list>)সিনট্যাক্সের ব্যবহারের সাথে মনে হয় যে স্কেল সার্ভারটি উল্লেখযোগ্য টেবিলের সূচকের মধ্যে প্রথম উপযুক্ত নন-ক্ল্লাস্টারড সূচক নির্বাচন করে ( index_idপ্রশ্ন মন্তব্যে অনুমিত হিসাবে ক্ষুদ্রতম শারীরিক আকারের সাথে একটি নয়), বা যদি ক্লাস্টারড ইনডেক্স থাকে তবে স্যুট এবং কোনও উপযুক্ত অবিচ্ছিন্ন সূচক নেই। স্কেল সার্ভার ২০০৮ (সংস্করণ 10.0) থেকে এই জাতীয় আচরণটি সামঞ্জস্যপূর্ণ বলে মনে হচ্ছে। এটি অবশ্যই পর্যবেক্ষণ, এই ক্ষেত্রে কোনও গ্যারান্টি নেই।

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