রোলব্যাক কি দ্রুত অপারেশন?


20

এটি কি সত্য যে আরডিবিএমএস সিস্টেমগুলি COMMITঅপারেশনের জন্য অনুকূলিত হয়েছে ? ROLLBACKঅপারেশনগুলি কত ধীর / দ্রুত হয় এবং কেন?

উত্তর:


14

এসকিউএল সার্ভারের জন্য, আপনি তর্ক করতে পারেন যে কোনও প্রতিশ্রুতিবদ্ধ ক্রিয়াকলাপ লগ ফাইলে 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 দিয়ে আমি যুক্তিসঙ্গতভাবে সামঞ্জস্য পেয়েছি:

  • 5500ms অনুসন্ধান / আপডেটের জন্য
  • 3 এস কমিট
  • 1 এমএস রোলব্যাক

@ সারি = 100 সহ:

  • 8500ms অনুসন্ধান / আপডেট
  • 15ms কমিট
  • 15 মিমি রোলব্যাক

@ সারি = 1000 সহ:

  • 15000ms অনুসন্ধান / আপডেট
  • 10ms কমিট
  • 500ms রোলব্যাক

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


2
'কম কাজ' অগত্যা 'দ্রুত' নয়
জ্যাক ডগলাস

আমি জানতাম যে begin tranকেবল লেনদেনের পাল্টা বাড়ে। যদি আমি আপনাকে বুঝতে পারি, rdbms COMMIT এ সমস্ত কাজ (সারিগুলিতে যোগদান করে, কার্যকর করার পরিকল্পনা তৈরি করে ...) করছে?
গারিক

3
না, সমস্ত কাজ কমিটমেন্ট করার আগেই হয়ে গেছে। কমিট অপারেশন নিজেই তুলনামূলকভাবে সামান্য করে।
মার্ক স্টোরি-স্মিথ

@ মার্ক আমি 2 মি সারি সন্নিবেশ করিয়ে এবং প্রত্যাবর্তন বা ফিরে ঘূর্ণায়মান কিছু রুক্ষ এবং প্রস্তুত পরীক্ষা করেছি done রোলব্যাক সহ সামগ্রিক সময় প্রতিশ্রুতি সহ সামগ্রিক সময়ের জন্য 6 থেকে 14 এর মধ্যে বনাম 10 থেকে 30 এর মধ্যে পরিবর্তিত হয় vers ওয়াইএমএমভি অবশ্যই তবে এটি ইঙ্গিত করে যে ব্যালপার্ক রোলব্যাকটি কমপক্ষে আমার পরিবেশে আসল লেনদেনের প্রায় দীর্ঘ বা দীর্ঘ longer
জ্যাক ডগলাস

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

13

ওরাকল-এর ক্ষেত্রে, রোলব্যাকটি পিছনে ঘুরছে এমন পরিবর্তনগুলি করতে যে সময়ের চেয়ে বেশি সময় লেগেছিল তার চেয়ে অনেক বেশি সময় নিতে পারে। এটি প্রায়শই গুরুত্বপূর্ণ নয় কারণ

  1. লেনদেনটি পিছনে ফিরে যাওয়ার সময় কোনও লক ধরা হয় না
  2. এটি নিম্ন অগ্রাধিকার ব্যাকগ্রাউন্ড প্রক্রিয়া দ্বারা পরিচালিত হয়

এসকিউএল সার্ভারের জন্য আমি নিশ্চিত না যে পরিস্থিতিটি একই রকম কিনা তবে অন্য কেউ বলবে যদি তা না হয় ...

"কেন" হিসাবে, আমি বলব যে এটি বিরলrollback হওয়া উচিত , সাধারণত যদি কিছু ভুল হয়ে যায় এবং অবশ্যই আরও বেশি সাধারণ হতে পারে - সুতরাং এটির জন্য অপ্টিমাইজ করা বোধ করিcommitcommit


9

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

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


2
এবং আমাদের সকলেরই ছিল যে "রোলব্যাক করতে যুগে যুগে সময় লাগছে, আসুন এটি পুনরায় চালু করুন" ঠিক কোন সময়ে কথোপকথনটি ঘটে?
মার্ক স্টোরী-স্মিথ

আমি অনেক ক্লায়েন্ট এটি করতে দেখেছি। কিছু অপেক্ষাকৃত অপ্রকাশিত বাইরে আসে, অন্যদের অনেক কম ভাগ্যবান।
অ্যারন বারট্র্যান্ড

1
@ মার্কস্টোরি-স্মিথ - আপনি যদি মিড-রোলব্যাকটি রিবুট করেন তবে এসকিউএল সার্ভারকে আর কোনওভাবে প্রারম্ভকালে রোলব্যাক চালিয়ে যেতে হবে না?
নিক চ্যামাস 19

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

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

8

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

পরিবর্তে যদি কোনও রোলব্যাক জারি করা হয় তবে এটি কেবল এই রেকর্ডগুলি থেকে ভুতের চিহ্নগুলি সরিয়ে দেয়, নিবিড় inোকানো বিবৃতিগুলি নয়।


রোলব্যাকের জন্য নির্দিষ্ট অপারেশনগুলি কীভাবে অনুকূলিত হয় তার ভাল উদাহরণ।
মার্ক স্টোরী-স্মিথ

5

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

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

PostgreSQL- এর জন্য সমস্ত সারণী হিপ টেবিল এবং সূচি পৃথক পৃথক। এর অর্থ হ'ল পিছনে ঘূর্ণায়মান বা প্রতিশ্রুতিবদ্ধ হওয়ার সময় কোনও ডেটা পুনরায় ব্যবস্থা করতে হবে না। এটি কমিট এবং রোলব্যাক উভয়ই দ্রুত করে তোলে।

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

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

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


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