প্রাকৃতিক কীগুলি সার্গেট ইন্টিজার কীগুলির চেয়ে এসকিউএল সার্ভারে উচ্চতর বা নিম্ন কার্যকারিতা সরবরাহ করে?


25

আমি সারোগেট চাবিগুলির একটি অনুরাগী। আমার ফলাফলগুলি নিশ্চিতকরণ পক্ষপাতদুষ্ট হওয়ার ঝুঁকি রয়েছে।

অনেক প্রশ্ন আমি এখানে এবং http://stackoverflow.com এ উভয়ই দেখেছি IDENTITY()মানগুলির উপর ভিত্তি করে সার্গেট কীগুলির পরিবর্তে প্রাকৃতিক কীগুলি ব্যবহার করে ।

কম্পিউটার সিস্টেমে আমার ব্যাকগ্রাউন্ড আমাকে বলছে যে কোনও পূর্ণসংখ্যার তুলনায় তুলনামূলক অপারেশন করা স্ট্রিংগুলির সাথে তুলনা করার চেয়ে দ্রুত হবে be

এই মন্তব্যটি আমার বিশ্বাসকে প্রশ্নবিদ্ধ করেছিল, তাই আমি ভেবেছিলাম যে আমি আমার থিসিসটি তদন্তের জন্য একটি সিস্টেম তৈরি করব যা এসকিউএল সার্ভারে কী হিসাবে ব্যবহারের জন্য স্ট্রিংয়ের চেয়েও পূর্ণতর হয়।

যেহেতু ছোট ডেটাসেটগুলিতে খুব সামান্য বোধগম্য পার্থক্য হওয়ার সম্ভাবনা রয়েছে তাই আমি তত্ক্ষণাত্ দুটি টেবিল সেটআপের কথা ভেবেছিলাম যেখানে প্রাথমিক টেবিলটিতে এক হাজার সারি রয়েছে এবং দ্বিতীয় সারণীতে মোট সারণীতে ১০,০০,০০০ সারি রয়েছে গৌণ সারণী আমার পরীক্ষার মূল ভিত্তি হ'ল এই জাতীয় দুটি টেবিলের সেট তৈরি করা, একটি প্রাকৃতিক কী ব্যবহার করা এবং একটিতে পূর্ণসংখ্যা কী ব্যবহার করা এবং টাইমিং টেস্টগুলি সাধারণ জিজ্ঞাসায় চালানো যেমন:

SELECT *
FROM Table1
    INNER JOIN Table2 ON Table1.Key = Table2.Key;

পরীক্ষার বিছানা হিসাবে আমি তৈরি কোডটি নিম্নলিখিত:

USE Master;
IF (SELECT COUNT(database_id) FROM sys.databases d WHERE d.name = 'NaturalKeyTest') = 1
BEGIN
    ALTER DATABASE NaturalKeyTest SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
    DROP DATABASE NaturalKeyTest;
END
GO
CREATE DATABASE NaturalKeyTest 
    ON (NAME = 'NaturalKeyTest', FILENAME = 
        'C:\SQLServer\Data\NaturalKeyTest.mdf', SIZE=8GB, FILEGROWTH=1GB) 
    LOG ON (NAME='NaturalKeyTestLog', FILENAME = 
        'C:\SQLServer\Logs\NaturalKeyTest.mdf', SIZE=256MB, FILEGROWTH=128MB);
GO
ALTER DATABASE NaturalKeyTest SET RECOVERY SIMPLE;
GO
USE NaturalKeyTest;
GO
CREATE VIEW GetRand
AS 
    SELECT RAND() AS RandomNumber;
GO
CREATE FUNCTION RandomString
(
    @StringLength INT
)
RETURNS NVARCHAR(max)
AS
BEGIN
    DECLARE @cnt INT = 0
    DECLARE @str NVARCHAR(MAX) = '';
    DECLARE @RandomNum FLOAT = 0;
    WHILE @cnt < @StringLength
    BEGIN
        SELECT @RandomNum = RandomNumber
        FROM GetRand;
        SET @str = @str + CAST(CHAR((@RandomNum * 64.) + 32) AS NVARCHAR(MAX)); 
        SET @cnt = @cnt + 1;
    END
    RETURN @str;
END;
GO
CREATE TABLE NaturalTable1
(
    NaturalTable1Key NVARCHAR(255) NOT NULL 
        CONSTRAINT PK_NaturalTable1 PRIMARY KEY CLUSTERED 
    , Table1TestData NVARCHAR(255) NOT NULL 
);
CREATE TABLE NaturalTable2
(
    NaturalTable2Key NVARCHAR(255) NOT NULL 
        CONSTRAINT PK_NaturalTable2 PRIMARY KEY CLUSTERED 
    , NaturalTable1Key NVARCHAR(255) NOT NULL 
        CONSTRAINT FK_NaturalTable2_NaturalTable1Key 
        FOREIGN KEY REFERENCES dbo.NaturalTable1 (NaturalTable1Key) 
        ON DELETE CASCADE ON UPDATE CASCADE
    , Table2TestData NVARCHAR(255) NOT NULL  
);
GO

/* insert 1,000,000 rows into NaturalTable1 */
INSERT INTO NaturalTable1 (NaturalTable1Key, Table1TestData) 
    VALUES (dbo.RandomString(25), dbo.RandomString(100));
GO 1000000 

/* insert 10,000,000 rows into NaturalTable2 */
INSERT INTO NaturalTable2 (NaturalTable2Key, NaturalTable1Key, Table2TestData)
SELECT dbo.RandomString(25), T1.NaturalTable1Key, dbo.RandomString(100)
FROM NaturalTable1 T1
GO 10 

CREATE TABLE IDTable1
(
    IDTable1Key INT NOT NULL CONSTRAINT PK_IDTable1 
    PRIMARY KEY CLUSTERED IDENTITY(1,1)
    , Table1TestData NVARCHAR(255) NOT NULL 
    CONSTRAINT DF_IDTable1_TestData DEFAULT dbo.RandomString(100)
);
CREATE TABLE IDTable2
(
    IDTable2Key INT NOT NULL CONSTRAINT PK_IDTable2 
        PRIMARY KEY CLUSTERED IDENTITY(1,1)
    , IDTable1Key INT NOT NULL 
        CONSTRAINT FK_IDTable2_IDTable1Key FOREIGN KEY 
        REFERENCES dbo.IDTable1 (IDTable1Key) 
        ON DELETE CASCADE ON UPDATE CASCADE
    , Table2TestData NVARCHAR(255) NOT NULL 
        CONSTRAINT DF_IDTable2_TestData DEFAULT dbo.RandomString(100)
);
GO
INSERT INTO IDTable1 DEFAULT VALUES;
GO 1000000
INSERT INTO IDTable2 (IDTable1Key)
SELECT T1.IDTable1Key
FROM IDTable1 T1
GO 10

উপরের কোডটি একটি ডাটাবেস এবং 4 টি সারণী তৈরি করে এবং পরীক্ষার জন্য প্রস্তুত টেবিলগুলি ডেটা দিয়ে পূর্ণ করে। আমি যে পরীক্ষার কোডটি চালিয়েছি তা হ'ল:

USE NaturalKeyTest;
GO
DECLARE @loops INT = 0;
DECLARE @MaxLoops INT = 10;
DECLARE @Results TABLE (
    FinishedAt DATETIME DEFAULT (GETDATE())
    , KeyType NVARCHAR(255)
    , ElapsedTime FLOAT
);
WHILE @loops < @MaxLoops
BEGIN
    DBCC FREEPROCCACHE;
    DBCC FREESESSIONCACHE;
    DBCC FREESYSTEMCACHE ('ALL');
    DBCC DROPCLEANBUFFERS;
    WAITFOR DELAY '00:00:05';
    DECLARE @start DATETIME = GETDATE();
    DECLARE @end DATETIME;
    DECLARE @count INT;
    SELECT @count = COUNT(*) 
    FROM dbo.NaturalTable1 T1
        INNER JOIN dbo.NaturalTable2 T2 ON T1.NaturalTable1Key = T2.NaturalTable1Key;
    SET @end = GETDATE();
    INSERT INTO @Results (KeyType, ElapsedTime)
    SELECT 'Natural PK' AS KeyType, CAST((@end - @start) AS FLOAT) AS ElapsedTime;

    DBCC FREEPROCCACHE;
    DBCC FREESESSIONCACHE;
    DBCC FREESYSTEMCACHE ('ALL');
    DBCC DROPCLEANBUFFERS;
    WAITFOR DELAY '00:00:05';
    SET @start = GETDATE();
    SELECT @count = COUNT(*) 
    FROM dbo.IDTable1 T1
        INNER JOIN dbo.IDTable2 T2 ON T1.IDTable1Key = T2.IDTable1Key;
    SET @end = GETDATE();
    INSERT INTO @Results (KeyType, ElapsedTime)
    SELECT 'IDENTITY() PK' AS KeyType, CAST((@end - @start) AS FLOAT) AS ElapsedTime;

    SET @loops = @loops + 1;
END
SELECT KeyType, FORMAT(CAST(AVG(ElapsedTime) AS DATETIME), 'HH:mm:ss.fff') AS AvgTime 
FROM @Results
GROUP BY KeyType;

এগুলি ফলাফল:

এখানে চিত্র বর্ণনা লিখুন

আমি কি এখানে কিছু ভুল করছি, বা INT কীগুলি 25 টি অক্ষরের প্রাকৃতিক কীগুলির চেয়ে 3 গুণ বেশি দ্রুত?

দ্রষ্টব্য, আমি এখানে একটি ফলো-আপ প্রশ্ন লিখেছি ।


1
ওয়েল আইএনটি 4 বাইট এবং কার্যকর এনভিসার্চার (25) প্রায় 14 গুণ বেশি দীর্ঘ (সিস্টেমের ডেটা যেমন দৈর্ঘ্যের মতো) দীর্ঘ হয়, তাই কেবলমাত্র সূচকের ক্ষেত্রে আমি বিশ্বাস করি যে আপনার একটি উল্লেখযোগ্যতর প্রশস্ত এবং গভীর পি কে সূচক হবে এবং তাই আমি আরও / O প্রয়োজন হয় যা প্রক্রিয়াজাতকরণের সময়কে প্রভাবিত করে। হ্যাভেভ একটি প্রাকৃতিক পূর্ণসংখ্যা (সম্ভবত ডিজিট পরীক্ষাও করতে পারেন) ঠিক একই আইএনটি হবে যা আমরা একটি সারোগেট আইডেন্টিটি কলামের জন্য ব্যবহার করার কথা ভাবি। সুতরাং, "প্রাকৃতিক কী" হতে পারে একটি আইএনটি, বিগিন্ট, চার, এনভিচারার এবং এটি সমস্ত বিষয়।
আরএলএফ

7
আমি মনে করি @ মাইকশোরিল'গ্যাটক্যাল 'এর পারফরম্যান্স লাভটি হচ্ছিল যে আপনি যখন প্রাকৃতিক কী ব্যবহার করেন তখন "লুকিং" টেবিলের বিপরীতে আপনার আসলে যোগদানের দরকার নেই। যোগদানের সাথে অনুসন্ধানের মানটি পেতে একটি কোয়েরির সাথে তুলনা করুন যেখানে মানটি ইতিমধ্যে মূল সারণীতে সংরক্ষিত আছে এমন একটি ক্যোয়ারির সাথে। আপনি সন্ধানের সারণিতে প্রাকৃতিক কী দৈর্ঘ্য এবং সারিগুলির উপর নির্ভর করে একটি আলাদা "বিজয়ী" পেতে পারেন।
মিকেল এরিকসন

3
@ মিকায়েল এরিকসন যা বলেছিলেন প্লাস যখন আপনি 2 টিরও বেশি টেবিলের মধ্যে যোগ দিতে চান (4 বলুন) যেখানে সার্োগেটের সাথে আপনাকে বি এবং সি এর মাধ্যমে টেবিল A ​​থেকে D টেবিলগুলিতে যোগদান করতে হবে এবং প্রাকৃতিক কী সহ আপনি সরাসরি A থেকে D এ যোগ দিতে পারবেন
ypercubeᵀᴹ

উত্তর:


18

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

এসকিউএল সার্ভার ডিফল্টরূপে প্রাথমিক কীতে একটি টেবিল ক্লাস্টার করে। ক্লাস্টারড ইনডেক্স কীটি সারিগুলি সনাক্ত করতে ব্যবহৃত হয়, সুতরাং এটি প্রতিটি অন্যান্য সূচকে অন্তর্ভুক্ত কলাম হিসাবে যুক্ত হয়। বৃহত্তর যে কীটি, প্রতিটি গৌণ সূচক বৃহত্তর।

আরও ভয়াবহ, যদি দ্বিতীয় সূচীগুলি UNIQUEক্লাস্টারড ইনডেক্স কী হিসাবে স্পষ্টভাবে সংজ্ঞায়িত না হয় তবে স্বয়ংক্রিয়ভাবে সেগুলির প্রত্যেকের কীটির অংশ হয়ে যায়। এটি সাধারণত বেশিরভাগ সূচকের ক্ষেত্রে প্রযোজ্য, সাধারণত সূচিগুলি তখনই অনন্য হিসাবে ঘোষণা করা হয় যখন প্রয়োজনীয়তা স্বতন্ত্রতা প্রয়োগ করার প্রয়োজন হয়।

সুতরাং যদি প্রশ্নটি হয়, প্রাকৃতিক বনাম সারোগেট ক্লাস্টারড ইনডেক্স, সারোগেট প্রায় সর্বদা জিতবে।

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

অবশেষে, প্রাকৃতিক কীগুলি প্রায়শই ডেটা মডেলটি বোঝা সহজ করে তোলে। বেশি স্টোরেজ স্পেস ব্যবহার করার সময়, প্রাকৃতিক প্রাথমিক কীগুলি প্রাকৃতিক বিদেশী কীগুলিতে বাড়ে যা ফলস্বরূপ স্থানীয় তথ্যের ঘনত্ব বাড়িয়ে তোলে।

সুতরাং, প্রায়শই ডাটাবেস জগতে, আসল উত্তরটি "এটি নির্ভর করে"। এবং - সর্বদা বাস্তব পরিবেশগত তথ্য সহ আপনার নিজের পরিবেশে পরীক্ষা করুন।


10

আমি বিশ্বাস করি, এটি মাঝখানে সবচেয়ে ভাল

প্রাকৃতিক কী ওভারভিউ:

  1. এগুলি ডেটা মডেলটিকে আরও স্পষ্ট করে তুলছে কারণ তারা বিষয় ক্ষেত্র থেকে এসেছে, না কারও মাথা থেকে।
  2. সরল কীগুলি (একটি কলাম, এর মধ্যে CHAR(4)এবং CHAR(20)) কিছু অতিরিক্ত বাইট সংরক্ষণ করে, তবে আপনাকে তাদের ধারাবাহিকতার জন্য নজর রাখা দরকার ( ON UPDATE CASCADEসেই কীগুলির জন্য গুরুত্বপূর্ণ হয়ে ওঠে, এটি পরিবর্তন হতে পারে)।
  3. অনেকগুলি ক্ষেত্রে, যখন প্রাকৃতিক কীগুলি জটিল থাকে: দুটি বা ততোধিক কলাম থাকে। যদি এই জাতীয় কী কোনও ফরেনিং কী হিসাবে অন্য সত্তায় স্থানান্তরিত হতে পারে, তবে এটি ডেটা ওভারহেড যুক্ত করবে (সূচকগুলি এবং ডেটা কলামগুলি বড় আকার ধারণ করতে পারে) এবং কর্মক্ষমতা আলগা হবে।
  4. কীটি যদি বড় স্ট্রিং হয়, তবে এটি সম্ভবত সর্বদা পূর্ণসংখ্যার কীতে .িলে হয়ে যায়, কারণ সহজ অনুসন্ধানের শর্তটি ডাটাবেস ইঞ্জিনে একটি বাইট অ্যারের তুলনায় পরিণত হয়, যা বেশিরভাগ ক্ষেত্রে পূর্ণসংখ্যার তুলনায় ধীর হয়।
  5. কীটি যদি একটি বহুভাষিক স্ট্রিং হয় তবে তার সাথে কোলিশগুলিও দেখতে হবে।

উপকারিতা: 1 এবং 2।

প্রহরী: 3, 4 এবং 5।


কৃত্রিম পরিচয় কীগুলির ওভারভিউ:

  1. এই বৈশিষ্ট্যটি ডেটাবেস ইঞ্জিন দ্বারা পরিচালিত হওয়ায় আপনার তাদের তৈরি এবং পরিচালনা সম্পর্কে (বেশিরভাগ ক্ষেত্রে) বিরক্ত করার দরকার নেই। এগুলি ডিফল্টরূপে অনন্য এবং প্রচুর স্থান নেয় না। পছন্দসই ক্রিয়াকলাপ ON UPDATE CASCADEবাদ দেওয়া যেতে পারে, কারণ মূল মানগুলি পরিবর্তন হচ্ছে না।

  2. বিদেশী চাবি হিসাবে তারা (প্রায়শই) মাইগ্রেশনের সেরা প্রার্থী কারণ:

    2.1। একটি কলাম গঠিত;

    2.2। একটি সহজ ধরণের ব্যবহার করে যা কম ওজনযুক্ত এবং তুলনা ক্রিয়াকলাপের জন্য দ্রুত কাজ করে।

  3. কোনও সংস্থার সত্তা, কোন কীগুলি কোথাও মাইগ্রেট হয় না, এটি কোনও খাঁটি ডেটা ওভারহেডে পরিণত হতে পারে, কারণ এটি দরকারীতা হারিয়েছে। জটিল প্রাকৃতিক প্রাথমিক কী (যদি সেখানে কোনও স্ট্রিং কলাম নেই) আরও কার্যকর হবে।

উপকারিতা: 1 এবং 2।

প্রহরী: 3।


উপসংহার:

অ্যারিফায়াল কীগুলি আরও রক্ষণাবেক্ষণযোগ্য, নির্ভরযোগ্য এবং দ্রুত কারণ এগুলি এই বৈশিষ্ট্যগুলির জন্য ডিজাইন করা হয়েছে। তবে কিছু ক্ষেত্রে এর প্রয়োজন হয় না। উদাহরণস্বরূপ, CHAR(4)বেশিরভাগ ক্ষেত্রে একক কলাম প্রার্থী এর মতো আচরণ করে INT IDENTITY। সুতরাং এখানে আরও একটি প্রশ্ন আছে: রক্ষণাবেক্ষণ + স্থায়িত্ব বা স্পষ্টতা ?

প্রশ্ন "আমি একটি কৃত্রিম কী ইনজেকশন করা উচিত বা না?" সর্বদা প্রাকৃতিক কী কাঠামোর উপর নির্ভর করে:

  • যদি এটিতে একটি বড় স্ট্রিং থাকে, তবে এটি ধীর হয় এবং অন্য কোনও সত্তায় বিদেশী হিসাবে স্থানান্তরিত হলে ওভারহেডের ডেটা যুক্ত করবে।
  • যদি এটিতে একাধিক কলাম থাকে, তবে এটি ধীর হয় এবং বিদেশী হিসাবে অন্য কোনও সত্তায় স্থানান্তরিত হলে ওভারহেডের ডেটা যুক্ত করবে।

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

@ মাইকশেরিল'কেলক্যাল 'হ্যাঁ, অবশ্যই। যাইহোক, ON UPDATE CASCADEব্যবহৃত হয়নি, যখন কীগুলি কখনই আপডেট হয় না। তবে, যদি সেগুলি হয় তবে ON UPDATE NO ACTIONকনফিগার করা থাকলে এটি সমস্যা হতে পারে । আমার অর্থ, ডিবিএমএস কখনই এটি ব্যবহার করে না, যখন কী কলামের মান পরিবর্তন হয় না।
ব্লিটজেড

4

একটি কী একটি ডাটাবেসের একটি যৌক্তিক বৈশিষ্ট্য যেখানে কর্মক্ষমতা সর্বদা স্টোরেজে শারীরিক প্রয়োগের মাধ্যমে এবং সেই প্রয়োগের বিরুদ্ধে চালিত শারীরিক ক্রিয়াকলাপ দ্বারা নির্ধারিত হয়। অতএব কীগুলির সাথে পারফরম্যান্স বৈশিষ্ট্যগুলি বিশিষ্ট করা একটি ভুল।

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

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

সারোগেট কী সম্পর্কে অপরিহার্য বিষয়টি হ'ল এটি কোনও টেবিলের অতিরিক্ত বৈশিষ্ট্য যেখানে টেবিলটিতে ব্যবসায়িক ডোমেনে ব্যবহৃত "অর্থবহ" কী বৈশিষ্ট্যও রয়েছে। এটি নন-সারোগেট বৈশিষ্ট্য যা কোয়েরি ফলাফলগুলি কার্যকর হওয়ার জন্য আগ্রহী। একটি বাস্তবসম্মত পরীক্ষাটি হ'ল বিকল্প টেস্টে প্রাকৃতিক এবং সারোগেট কী উভয়ই রাখে বিকল্প বাস্তবায়নের সাথে কেবল প্রাকৃতিক কী ব্যবহার করে সারণীর তুলনা করা । সারোগেট কীগুলি সাধারণত অতিরিক্ত স্টোরেজ এবং ইনডেক্সিং প্রয়োজন এবং সংজ্ঞা অনুসারে অতিরিক্ত স্বাতন্ত্র্যতার সীমাবদ্ধতা প্রয়োজন। বহিরাগত প্রাকৃতিক কী মানগুলিকে তাদের সারোগেটগুলিতে মানচিত্রের জন্য surrogates অতিরিক্ত প্রক্রিয়াজাতকরণ প্রয়োজন এবং বিপরীতে।

এখন এই সম্ভাব্য কোয়েরি তুলনা করুন:

উ:

SELECT t2.NaturalTable2Key, t2.NaturalTable1Key
FROM Table2 t2;

এর যৌক্তিক সমতুল্যে যদি টেবিল 2-এ প্রাকৃতিক টেবিল 1 কী বৈশিষ্ট্যটি সারোগেট IDTable1 কে দিয়ে প্রতিস্থাপন করা হয়:

বি

SELECT t2.NaturalTable2Key, t1.NaturalTable1Key
FROM Table2 t2
INNER JOIN Table1 t1
ON t1.IDTable1Key = t2.IDTable1Key;

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

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