কোন সময়ে কোনও ডাটাবেস কোনও লেনদেনে তার সূচকগুলি আপডেট করে?


11

আমি ইনসার্টগুলিতে ইভেন্টের ক্রমটি বোঝার চেষ্টা করছি যেখানে একটি সূচক এবং লেনদেন উভয়ই জড়িত।

উদাহরণস্বরূপ, ওরাকল ডকুমেন্টেশনে বলা হয়েছে:

যদি আপনি ডেটা লোড করার আগে এক বা একাধিক সূচক তৈরি করেন [বা থাকে], ডাটাবেসগুলি অবশ্যই প্রতিটি সারি সন্নিবেশ করানোর সাথে সাথে প্রতিটি সূচি আপডেট করতে হবে।

তবে যদি আমি কোনও লেনদেন তৈরি করি, পাঁচটি সারি সন্নিবেশ করান, তবে কি প্রতিশ্রুতিবদ্ধ? প্রতিটি সন্নিবেশের জন্য সূচিগুলি আপডেট করা হয়, বা কেবল প্রতিশ্রুতিবদ্ধ স্থানে?

লজিক আমাকে বলে যে এগুলি কেবল কমিট পয়েন্টে আপডেট করা হবে, কারণ একটি রেকর্ড প্রতিশ্রুতিবদ্ধ না হওয়া পর্যন্ত একটি আপডেট ইনডেক্স সম্ভবত ব্যবহার করতে পারে না। তবে তা কি সত্য?

যদি তাই হয়, যখন আমার কাছে 1 মিলি সারি সন্নিবেশ করতে হবে, সর্বোত্তম পারফরম্যান্সের জন্য আমার 100 কিলো রেকর্ডের 10 লেনদেন নয়, সমস্ত সারিগুলির একটি বড় কমিট করা উচিত? অবশ্যই আমি বুঝতে পারি যে যদি 999,999 সারিটি ব্যর্থ হয় তবে এটি আরও বৃহত্তর রোলব্যাক ঝুঁকিপূর্ণ।

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

উত্তর:


8

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

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

এটি সম্পর্কে চিন্তা করার এক উপায়ের জন্য, একটি প্রাথমিক কী সহ একটি টেবিলে বিবেচনা করুন। এসকিউএল সার্ভার এবং ওরাকলে এটি সূচক হিসাবে প্রয়োগ করা হয়। বেশিরভাগ সময় আমরা চাই সেখানে তাত্ক্ষণিকভাবে একটি ত্রুটি 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';

ক্যোয়ারী 1

এখন আসুন একটি লেনদেন শুরু করুন এবং VALটেবিলের প্রায় সমস্ত সারিগুলির জন্য আপডেট করুন :

BEGIN TRANSACTION

UPDATE X_TABLE_IX
SET VAL = 'A'
WHERE ID <> 1;

এখানে তার জন্য ক্যোয়ারী পরিকল্পনার অংশ রয়েছে:

ক্যোয়ারী 2

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

লেনদেন এখনও প্রতিশ্রুতিবদ্ধ না করে, আসুন SELECTউপরের থেকে কোয়েরিটি আবার দেখা যাক ।

SELECT *
FROM X_TABLE_IX
WHERE VAL = 'A';

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

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

এটি একটি সাধারণ ডেমো ছিল তবে আশা করি এটি কিছুটা সাফ করেছে।

একপাশে, আমি কয়েকটি ক্ষেত্রে সচেতন যে এটিতে তর্ক করা যেতে পারে যে কোনও সূচক সঙ্গে সঙ্গে আপডেট হয় না। এটি কার্য সম্পাদনের কারণে করা হয় এবং শেষ ব্যবহারকারীর বেমানান ডেটা দেখতে পারা উচিত নয়। উদাহরণস্বরূপ, কখনও কখনও মুছে ফেলাগুলি এসকিউএল সার্ভারের কোনও সূচীতে পুরোপুরি প্রয়োগ করা হবে না। একটি পটভূমি প্রক্রিয়া চলে এবং শেষ পর্যন্ত ডেটা পরিষ্কার করে। আপনি যদি কৌতূহলী হন তবে আপনি ভূতের রেকর্ডগুলি সম্পর্কে পড়তে পারেন ।


এটি একটি দুর্দান্ত উত্তর - এবং আমি ভাবছিলাম যে অন্য একটি জিনিসটিরও জবাব দেয়: প্রাথমিক কী (বা অনুরূপ) লঙ্ঘন সন্নিবেশ বা কমিটের ক্ষেত্রে ঘটবে কিনা। যেমন একটি সম্পূর্ণ প্রতিক্রিয়া জন্য ধন্যবাদ।
আয়ারল্যান্ডকে

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

ওরাকল স্থগিত প্রতিবন্ধকতাগুলিও সমর্থন করে
ববসি

1

আমার অভিজ্ঞতা হ'ল 1,000,000 সারি সন্নিবেশ করানোর জন্য আসলে আরও বেশি সংস্থান প্রয়োজন এবং আপনি যদি ব্যাচের সন্নিবেশ ব্যবহার করেন তবে তার তুলনায় সম্পূর্ণ হতে আরও বেশি সময় লাগবে। এটি 10,000 উদাহরণস্বরূপ 100 টি সন্নিবেশ হিসাবে উদাহরণস্বরূপ প্রয়োগ করা যেতে পারে।

এটি ব্যাচগুলি beingোকানো হচ্ছে ওভারহেড হ্রাস করে এবং, যদি একটি ব্যাচ ব্যর্থ হয়, এটি একটি ছোট রোলব্যাক।

যাইহোক , এসকিউএল সার্ভারের জন্য একটি বিসিপি ইউটিলিটি বা বাল্ক ইনসার্ট কমান্ড রয়েছে যা ব্যাচের সন্নিবেশগুলি ব্যবহার করতে ব্যবহৃত হতে পারে।

এবং, অবশ্যই, আপনি এই পদ্ধতির পরিচালনা করার জন্য নিজের মালিকের কোডও প্রয়োগ করতে পারেন।


1
সাধারণভাবে, যদি আপনাকে কোনও টেবিলের উপরে একটি সূচকের প্রয়োজন হয় এমন একটি বৃহত সংখ্যক সারি সন্নিবেশ করা প্রয়োজন হয় তবে সূচীটি নেমে যাওয়া, ডেটা লোড করা এবং তারপরে সূচকটি পুনর্নির্মাণের পক্ষে এটি দ্রুততর হতে পারে। ওরাকল / * + অ্যাপেনড * / ইঙ্গিতটি ব্যবহার করে সরাসরি পথ বাল্ক লোড বিকল্পকেও সমর্থন করে।
ববসি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.