আমি এসকিউএল সার্ভার এবং ওরাকল নিয়ে কাজ করি। কিছু ব্যতিক্রম সম্ভবত রয়েছে, তবে এই প্ল্যাটফর্মগুলির জন্য সাধারণ উত্তরটি হ'ল ডেটা এবং সূচি একই সাথে আপডেট করা হবে।
আমি মনে করি যে লেনদেনের মালিকানাধীন সেশনের জন্য এবং অন্যান্য সেশনের জন্য সূচীগুলি আপডেট করা হয় তখন তার মধ্যে পার্থক্য আনতে সহায়ক হবে। ডিফল্টরূপে, অন্যান্য সেশনগুলি লেনদেনের প্রতিশ্রুতি না দেওয়া পর্যন্ত আপডেট সূচিগুলি দেখতে পাবে না। যাইহোক, লেনদেনের মালিকানাধীন সেশনটি তত্ক্ষণাত আপডেট হওয়া সূচকগুলি দেখতে পাবে।
এটি সম্পর্কে চিন্তা করার এক উপায়ের জন্য, একটি প্রাথমিক কী সহ একটি টেবিলে বিবেচনা করুন। এসকিউএল সার্ভার এবং ওরাকলে এটি সূচক হিসাবে প্রয়োগ করা হয়। বেশিরভাগ সময় আমরা চাই সেখানে তাত্ক্ষণিকভাবে একটি ত্রুটি INSERT
ঘটানো উচিত যা প্রাথমিক কীটি লঙ্ঘন করবে। তা হওয়ার জন্য সূচীটিকে ডেটা হিসাবে একই সময়ে আপডেট করতে হবে। নোট করুন যে অন্যান্য প্ল্যাটফর্মগুলি, যেমন পোস্টগ্রিস, স্থগিতিত প্রতিবন্ধকতাগুলিকে মঞ্জুরি দেয় যা কেবলমাত্র লেনদেনের সময় প্রতিশ্রুতিবদ্ধ হওয়ার সময় চেক করা হয়।
এখানে একটি সাধারণ কেস দেখায় একটি দ্রুত ওরাকল ডেমো রয়েছে:
CREATE TABLE X_TABLE (PK INT NULL, PRIMARY KEY (PK));
INSERT INTO X_TABLE VALUES (1);
INSERT INTO X_TABLE VALUES (1); -- no commit
দ্বিতীয় INSERT
বিবৃতিতে একটি ত্রুটি ছুঁড়েছে:
এসকিউএল ত্রুটি: ORA-00001: অনন্য প্রতিবন্ধকতা (XXXXXX.SYS_C00384850) লঙ্ঘন
00001.
00000 - "অনন্য প্রতিবন্ধকতা (% s।% S) লঙ্ঘন"
* কারণ: একটি আপডেট বা INSERT বিবৃতিটি একটি সদৃশ কী sertোকানোর চেষ্টা করেছে। DBMS ম্যাক মোডে কনফিগার করা বিশ্বাসযোগ্য ওরাকল-এর জন্য, কোনও নকল এন্ট্রি আলাদা স্তরে উপস্থিত থাকলে আপনি এই বার্তাটি দেখতে পাবেন।
* ক্রিয়া: হয় অনন্য বাধা মুছে ফেলুন বা কীটি সন্নিবেশ করবেন না।
আপনি যদি নীচে একটি সূচি আপডেট ক্রিয়া দেখতে পছন্দ করেন তবে এসকিউএল সার্ভারে একটি সাধারণ ডেমো। প্রথমে দশ মিলিয়ন সারি এবং VAL
কলামে একটি অবিবাহিত সূচী সহ একটি দুটি কলাম সারণি তৈরি করুন :
DROP TABLE IF EXISTS X_TABLE_IX;
CREATE TABLE X_TABLE_IX (
ID INT NOT NULL,
VAL VARCHAR(10) NOT NULL
PRIMARY KEY (ID)
);
CREATE INDEX X_INDEX ON X_TABLE_IX (VAL);
-- insert one million rows with N from 1 to 1000000
INSERT INTO X_TABLE_IX
SELECT N, N FROM dbo.Getnums(1000000);
নিম্নলিখিত কোয়েরি অবিচ্ছিন্ন সূচকটি ব্যবহার করতে পারে কারণ সূচিটি সেই প্রশ্নের জন্য একটি আচ্ছাদন সূচক। এটি সম্পাদন করার জন্য প্রয়োজনীয় সমস্ত ডেটা এতে রয়েছে। প্রত্যাশিত হিসাবে কোন রিটার্ন ফেরত না।
SELECT *
FROM X_TABLE_IX
WHERE VAL = 'A';
এখন আসুন একটি লেনদেন শুরু করুন এবং VAL
টেবিলের প্রায় সমস্ত সারিগুলির জন্য আপডেট করুন :
BEGIN TRANSACTION
UPDATE X_TABLE_IX
SET VAL = 'A'
WHERE ID <> 1;
এখানে তার জন্য ক্যোয়ারী পরিকল্পনার অংশ রয়েছে:
লাল রঙে চক্করযুক্ত হ'ল আনক্লাস্টারড ইনডেক্সের আপডেট। নীল রঙে চক্কর দেওয়া হয় ক্লাস্টারড ইনডেক্সের আপডেট, যা মূলত টেবিলের ডেটা। যদিও লেনদেনটি প্রতিশ্রুতিবদ্ধ হয়নি তবে আমরা দেখতে পাচ্ছি যে ডেটা এবং সূচি ক্যোয়ারের সম্পাদনের অংশে আপডেট হয়েছে। নোট করুন যে আপনি সম্ভবত অন্যান্য বিষয়গুলির সাথে জড়িত ডেটার আকারের উপর নির্ভর করে কোনও পরিকল্পনায় সর্বদা এটি দেখতে পাবেন না।
লেনদেন এখনও প্রতিশ্রুতিবদ্ধ না করে, আসুন SELECT
উপরের থেকে কোয়েরিটি আবার দেখা যাক ।
SELECT *
FROM X_TABLE_IX
WHERE VAL = 'A';
ক্যোয়ারী অপ্টিমাইজারটি এখনও সূচকটি ব্যবহার করতে সক্ষম এবং এটি অনুমান করে যে 999999 সারিগুলি ফিরে আসবে। ক্যোয়ারী কার্যকর করা প্রত্যাশিত ফলাফলটি দেয়।
এটি একটি সাধারণ ডেমো ছিল তবে আশা করি এটি কিছুটা সাফ করেছে।
একপাশে, আমি কয়েকটি ক্ষেত্রে সচেতন যে এটিতে তর্ক করা যেতে পারে যে কোনও সূচক সঙ্গে সঙ্গে আপডেট হয় না। এটি কার্য সম্পাদনের কারণে করা হয় এবং শেষ ব্যবহারকারীর বেমানান ডেটা দেখতে পারা উচিত নয়। উদাহরণস্বরূপ, কখনও কখনও মুছে ফেলাগুলি এসকিউএল সার্ভারের কোনও সূচীতে পুরোপুরি প্রয়োগ করা হবে না। একটি পটভূমি প্রক্রিয়া চলে এবং শেষ পর্যন্ত ডেটা পরিষ্কার করে। আপনি যদি কৌতূহলী হন তবে আপনি ভূতের রেকর্ডগুলি সম্পর্কে পড়তে পারেন ।