উত্তর:
এসকিউএল সার্ভারের জন্য, আপনি তর্ক করতে পারেন যে কোনও প্রতিশ্রুতিবদ্ধ ক্রিয়াকলাপ লগ ফাইলে LOP_COMMIT_XACT লেখা এবং লকগুলি প্রকাশ করা ছাড়া আর কিছুই নয়, যা অবশ্যই আপনার লেনদেনটি বিগইন ট্র্যানের পরে সম্পাদিত প্রতিটি ক্রিয়াকলাপের রোলব্যাকের চেয়ে দ্রুততর হতে চলেছে।
আপনি যদি কোনও লেনদেনের প্রতিটি পদক্ষেপের কথা বিবেচনা করেন, কেবল প্রতিশ্রুতি না দিয়ে, আমি এখনও তর্ক করব যে আপনার বক্তব্যটি সত্য নয়। বাহ্যিক কারণগুলি বাদ দিয়ে, লগ ডিস্কের গতি তুলনামূলকভাবে ডেটা ডিস্কের গতির তুলনায়, সম্ভবত কোনও লেনদেনের দ্বারা করা কোনও কাজের রোলব্যাক প্রথম স্থানে কাজ করার চেয়ে দ্রুত হবে।
একটি রোলব্যাক পরিবর্তনগুলির ক্রমিক ফাইলটি পড়ছে এবং মেমোরি ডেটা পৃষ্ঠাগুলিতে সেগুলি প্রয়োগ করছে। মূল "কাজ" এর জন্য একটি কার্যনির্বাহী পরিকল্পনা তৈরি করতে হয়েছিল, পৃষ্ঠাগুলি অর্জন করতে হয়েছিল, সারিগুলিতে যোগ দিতে হবে ইত্যাদি had
সম্পাদনা করুন: এটি কিছুটা নির্ভর করে ...
@ জ্যাকডুগলাস এই নিবন্ধটির দিকে ইঙ্গিত করেছেন যা এমন পরিস্থিতির একটি বর্ণনা করে যেখানে রোলব্যাক আসল অপারেশন থেকে উল্লেখযোগ্যভাবে বেশি সময় নিতে পারে। উদাহরণস্বরূপ একটি 14 ঘন্টা লেনদেন, অনিবার্যভাবে সমান্তরালতা ব্যবহার করে, যা রোলব্যাক করতে 48+ ঘন্টা সময় নেয় কারণ রোলব্যাক বেশিরভাগ ক্ষেত্রে একক থ্রেডযুক্ত। আপনি সম্ভবত বার বার বাফার পুলটি মন্থন করছেন, সুতরাং আপনি আর মেমরি পৃষ্ঠায় পরিবর্তনগুলি পরিবর্তন করছেন না।
সুতরাং, আমার আগের উত্তরের একটি সংশোধিত সংস্করণ। রোলব্যাক কত ধীর? অন্যান্য সমস্ত বিষয় বিবেচনা করা হয়, একটি সাধারণ ওয়ালটিপি লেনদেনের জন্য এটি হয় না। সাধারণ সীমানার বাইরে, "ডু" এর চেয়ে "পূর্বাবস্থায় ফিরতে" আরও বেশি সময় লাগতে পারে তবে (এটি কি কোনও সম্ভাব্য জিহ্বা টুইস্টার?) "কী" কীভাবে করা হয়েছিল তার উপর কেন নির্ভর করবে।
সম্পাদনা 2: মন্তব্যগুলিতে আলোচনার পরে, এখানে একটি প্রমাণযুক্ত উদাহরণ হিসাবে দেখানো হচ্ছে যে কাজটি করা হচ্ছে ক্রিয়াকলাপ হিসাবে বনাম রোলব্যাকের আপেক্ষিক ব্যয় নির্ধারণের মূল কারণ।
দুটি টেবিল তৈরি করুন এবং সেগুলি অকার্যকরভাবে প্যাক করুন (প্রতি পৃষ্ঠায় নষ্ট স্থান):
SET STATISTICS IO OFF;
SET STATISTICS TIME OFF;
SET NOCOUNT ON;
GO
CREATE TABLE dbo.Foo
(
col1 INT IDENTITY(1,1) PRIMARY KEY CLUSTERED
, col2 CHAR(4000) NOT NULL DEFAULT REPLICATE('A', 4000)
)
CREATE TABLE dbo.Bar
(
col1 INT IDENTITY(1,1) PRIMARY KEY CLUSTERED
, col2 CHAR(4000) NOT NULL DEFAULT REPLICATE('A', 4000)
)
GO
INSERT dbo.Foo DEFAULT VALUES
GO 100000
INSERT dbo.Bar DEFAULT VALUES
GO 100000
একটি "খারাপ" আপডেট ক্যোয়ারী চালান, কাজের জন্য সময় নেওয়া এবং কমিট ইস্যু করার জন্য সময় নির্ধারণ করে।
DECLARE
@StartTime DATETIME2
, @Rows INT
SET @Rows = 1
CHECKPOINT
DBCC DROPCLEANBUFFERS
BEGIN TRANSACTION
SET @StartTime = SYSDATETIME()
UPDATE
dbo.bar
SET
col2 = REPLICATE('B', 4000)
FROM
dbo.bar b
INNER JOIN
(
SELECT TOP(@Rows)
col1
FROM
dbo.foo
ORDER BY
NEWID()
) f
ON f.col1 = b.col1
OPTION (MAXDOP 1)
SELECT 'Find and update row', DATEDIFF(ms, @StartTime, SYSDATETIME())
SET @StartTime = SYSDATETIME()
COMMIT TRANSACTION
SELECT 'Commit', DATEDIFF(ms, @StartTime, SYSDATETIME())
GO
আবার একই কাজ করুন তবে রোলব্যাক ইস্যু করুন এবং পরিমাপ করুন।
DECLARE
@StartTime DATETIME2
, @Rows INT
SET @Rows = 1
CHECKPOINT
DBCC DROPCLEANBUFFERS
BEGIN TRANSACTION
SET @StartTime = SYSDATETIME()
UPDATE
dbo.bar
SET
col2 = REPLICATE('B', 4000)
FROM
dbo.bar b
INNER JOIN
(
SELECT TOP(@Rows)
col1
FROM
dbo.foo
ORDER BY
NEWID()
) f
ON f.col1 = b.col1
OPTION (MAXDOP 1)
SELECT 'Find and update row', DATEDIFF(ms, @StartTime, SYSDATETIME())
SET @StartTime = SYSDATETIME()
ROLLBACK TRANSACTION
SELECT 'Rollback', DATEDIFF(ms, @StartTime, SYSDATETIME())
GO
@ সারিগুলির সাথে = 1 দিয়ে আমি যুক্তিসঙ্গতভাবে সামঞ্জস্য পেয়েছি:
@ সারি = 100 সহ:
@ সারি = 1000 সহ:
পিছনে মূল প্রশ্ন। যদি আপনি কাজটি আরও কমিট করার জন্য সময় নিরূপণ করেন তবে রোলব্যাক হাতছাড়া করছে কারণ সেই কাজটির বেশিরভাগ অংশই আপডেট করার জন্য সারি সন্ধান করতে ব্যয় করেছে, প্রকৃতপক্ষে ডেটা সংশোধন করছে না। যদি আপনি বিচ্ছিন্নভাবে প্রতিশ্রুতিবদ্ধ অপারেশনটির দিকে তাকাচ্ছেন, তবে এটি পরিষ্কার হওয়া উচিত যে কমিটগুলি খুব কম "কাজ" করে। প্রতিশ্রুতিবদ্ধ "আমি সম্পন্ন"।
begin tran
কেবল লেনদেনের পাল্টা বাড়ে। যদি আমি আপনাকে বুঝতে পারি, rdbms COMMIT এ সমস্ত কাজ (সারিগুলিতে যোগদান করে, কার্যকর করার পরিকল্পনা তৈরি করে ...) করছে?
ওরাকল-এর ক্ষেত্রে, রোলব্যাকটি পিছনে ঘুরছে এমন পরিবর্তনগুলি করতে যে সময়ের চেয়ে বেশি সময় লেগেছিল তার চেয়ে অনেক বেশি সময় নিতে পারে। এটি প্রায়শই গুরুত্বপূর্ণ নয় কারণ
এসকিউএল সার্ভারের জন্য আমি নিশ্চিত না যে পরিস্থিতিটি একই রকম কিনা তবে অন্য কেউ বলবে যদি তা না হয় ...
"কেন" হিসাবে, আমি বলব যে এটি বিরলrollback
হওয়া উচিত , সাধারণত যদি কিছু ভুল হয়ে যায় এবং অবশ্যই আরও বেশি সাধারণ হতে পারে - সুতরাং এটির জন্য অপ্টিমাইজ করা বোধ করিcommit
commit
রোলব্যাক কেবল "ওহ, কিছু মনে করবেন না" - অনেকগুলি ক্ষেত্রে এটি ইতিমধ্যে যা করেছে তা পূর্বাবস্থায় ফিরে আসতে হবে। কোনও নিয়ম নেই যে রোলব্যাক অপারেশন সর্বদা ধীর হবে বা আসল অপারেশনের চেয়ে সর্বদা দ্রুত হবে যদিও মূল লেনদেন সমান্তরালে চলতে থাকলেও রোলব্যাকটি একক থ্রেডযুক্ত। আপনি যদি অপেক্ষা করেন তবে আমি কেবল অপেক্ষা চালিয়ে যাওয়া সবচেয়ে নিরাপদ বলে পরামর্শ দিই।
এসকিউএল সার্ভার 2019 এর অবশ্যই এই সমস্ত পরিবর্তন এবং এক্সিলারেটেড ডেটাবেস রিকভারি (যা পেনাল্টিতে এটিও পরিবর্তনশীল, আকারের-ডেটা নির্বিশেষে তাত্ক্ষণিক রোলব্যাকের অনুমতি দেয়)।
সমস্ত লেনদেনেই তাদের প্রতিশ্রুতিবদ্ধ ক্রিয়াকলাপ তাদের রোলব্যাকের চেয়ে বেশি ভাল সম্পাদন করবে না। এরকম একটি কেস এসকিউএল-এ মুছুন অপারেশন। যখন কোনও লেনদেন সারিগুলি মুছে দেয়, এই সারিগুলি ভূতের রেকর্ড হিসাবে চিহ্নিত করা হয়। একবার কোন প্রতিশ্রুতি জারি করা হয় এবং একটি ভূত রেকর্ড পরিষ্কারের কাজ শুরু হয়ে গেলে কেবল এই রেকর্ডগুলি 'মোছা' হয়।
পরিবর্তে যদি কোনও রোলব্যাক জারি করা হয় তবে এটি কেবল এই রেকর্ডগুলি থেকে ভুতের চিহ্নগুলি সরিয়ে দেয়, নিবিড় inোকানো বিবৃতিগুলি নয়।
সব হয় না। দুটি ক্রিয়াকলাপই ডিস্ক আই / ও এর ক্ষেত্রে কার্যকরভাবে অভিন্ন হওয়ায় পোস্টগ্রিএসকিউএল কমিট করার চেয়ে বেশি সময় নিতে পারে না takes আমি আসলে মনে করি না যে এটি প্রতিশ্রুতিবদ্ধ হওয়ার জন্য এতটা অনুকূলিতকরণের প্রশ্ন, কারণ এটি অন্য প্রশ্নগুলির জন্য কাকে অনুকূল করে তুলছে তা একটি প্রশ্ন।
আপনি কীভাবে অন ডিস্ক লেআউটটিকে সম্বোধন করেন এবং এটি কীভাবে কমিট বনাম রোলব্যাককে প্রভাবিত করে তা হল মূল প্রশ্ন। মেজর ডিবি যেগুলি প্রতিশ্রুতি দেওয়ার চেয়ে ধীরে ধীরে ফিরে আসে, বিশেষত ক্লাস্টার টেবিলগুলি থেকে, মূল ডেটা স্ট্রাকচারের বাইরে এবং ডেটা আপডেট করার সময় এটি একটি রোলব্যাক সেগমেন্টে রাখে। এর অর্থ এই যে আপনি প্রতিশ্রুতিবদ্ধ করতে কেবল রোলব্যাক সেগমেন্টটি ফেলে দিন তবে রোল ব্যাক করতে আপনাকে সমস্ত ডেটা আবার কপি করতে হবে।
PostgreSQL- এর জন্য সমস্ত সারণী হিপ টেবিল এবং সূচি পৃথক পৃথক। এর অর্থ হ'ল পিছনে ঘূর্ণায়মান বা প্রতিশ্রুতিবদ্ধ হওয়ার সময় কোনও ডেটা পুনরায় ব্যবস্থা করতে হবে না। এটি কমিট এবং রোলব্যাক উভয়ই দ্রুত করে তোলে।
তবে এটি অন্যান্য কিছু জিনিসকে কিছুটা ধীর করে তোলে। উদাহরণস্বরূপ একটি প্রাথমিক কী অনুসন্ধানের জন্য, একটি সূচী ফাইলটি অতিক্রম করতে হয় এবং তারপরে এটি হ্যাপ টেবিলটি আঘাত করতে হয় (প্রযোজ্য কোনও প্রচ্ছদ সূচক ধরে না করে) hit এটি কোনও বিশাল চুক্তি নয় তবে এটি অতিরিক্ত তথ্য সন্ধান বা অন্যান্য তথ্য এবং দৃশ্যমানতার জন্য যাচাই করার জন্য কয়েকটি র্যান্ডম পৃষ্ঠাগুলি (যদি সেই সারিটিতে প্রচুর আপডেট উপস্থিত থাকে) যোগ করে।
এখানে গতি অবশ্য লেখার জন্য বনাম পড়ার জন্য পোস্টগ্রাইএসকিউএলে অনুকূলকরণের প্রশ্ন নয়। অন্যদের উপরের কিছু পড়া অপারেশনকে সুবিধামুক্ত করা অনিচ্ছুক। ফলস্বরূপ পোস্টগ্র্রেএসকিউএল অন্যান্য ডিবি'র পাশাপাশি গড় সম্পাদন করে। এটি কেবলমাত্র নির্দিষ্ট অপারেশন যা দ্রুত বা ধীর হতে পারে।
সুতরাং আমি মনে করি আসল উত্তরটি হ'ল ডিবিগুলি পড়ার পক্ষের নির্দিষ্ট কাজের চাপের জন্য অনুকূলিত এবং এটি লেখার পক্ষে চ্যালেঞ্জের দিকে পরিচালিত করে। সাধারণত যেখানে প্রশ্ন থাকে, কমিটগুলি সাধারণত হয় না, যদিও সর্বদা হয় না, রোলব্যাকের চেয়ে বেশি পছন্দ হয়। এটি তবে যে কোনও একটি করার প্রভাবের উপর নির্ভর করে (আপডেটগুলি মুছে ফেলার চেয়ে পৃথক পৃথক)।