বর্তমান বছর ছাড়া সমস্ত সংরক্ষণাগার রাখার সর্বোত্তম উপায় এবং একই সময়ে টেবিলটি বিভাজন করা


23

কার্য

বড় টেবিলগুলির একটি গ্রুপ থেকে 13 মাসের রোলিং ছাড়া সমস্ত সংরক্ষণাগারটি সংরক্ষণ করুন। সংরক্ষণাগারযুক্ত ডেটা অবশ্যই অন্য একটি ডাটাবেসে সংরক্ষণ করতে হবে।

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

"সংরক্ষণাগার" টেবিলটিতে প্রায় 1.1 বিলিয়ন সারি থাকবে, "লাইভ" টেবিলটি প্রায় 400 মিলিয়ন। স্পষ্টতই আর্কাইভ টেবিলটি সময়ের সাথে সাথে বৃদ্ধি পাবে, তবে আমি আশা করি লাইভ টেবিলটিও খুব দ্রুত যুক্তিসঙ্গতভাবে বৃদ্ধি পাবে। কমপক্ষে পরবর্তী কয়েক বছরে 50% বলুন।

আমি অ্যাজুরে স্ট্রেচ ডাটাবেসগুলি সম্পর্কে ভেবেছিলাম তবে দুর্ভাগ্যক্রমে আমরা ২০০৮ আর ২ তে আছি এবং সম্ভবত কিছুক্ষণ সেখানে থাকার সম্ভাবনা রয়েছে।

বর্তমান পরিকল্পনা

  • একটি নতুন ডাটাবেস তৈরি করুন
  • নতুন ডাটাবেসে মাসের মধ্যে বিভক্ত নতুন টেবিলগুলি তৈরি করুন (পরিবর্তিত তারিখটি ব্যবহার করে)।
  • পার্টিশনযুক্ত টেবিলগুলিতে অতি সাম্প্রতিক 12-13 মাসের ডেটা সরান।
  • দুটি ডাটাবেসের একটি নতুন নাম বদল করুন
  • এখন "সংরক্ষণাগার" ডাটাবেস থেকে সরানো ডেটা মুছুন।
  • "সংরক্ষণাগার" ডাটাবেসের প্রতিটি সারণী বিভাজন করুন।
  • ভবিষ্যতে ডেটা আর্কাইভ করতে পার্টিশন অদলবদলগুলি ব্যবহার করুন।
    • আমি বুঝতে পারি যে আমাকে সংরক্ষণাগারভুক্ত করার জন্য ডেটা বদল করতে হবে, সংরক্ষণাগার ডাটাবেসে সেই টেবিলটি অনুলিপি করতে হবে এবং তারপরে সংরক্ষণাগার টেবিলের মধ্যে এটিকে অদলবদল করতে হবে। এটি গ্রহণযোগ্য।

সমস্যা: আমি প্রাথমিক বিভাজনযুক্ত টেবিলগুলিতে ডেটা স্থানান্তরিত করার চেষ্টা করছি (আসলে আমি এখনও এটিতে ধারণার একটি প্রমাণ করছি)। আমি টিএফ 610 ( ডেটা লোডিং পারফরম্যান্স গাইড অনুসারে ) এবং INSERT...SELECTপ্রাথমিকভাবে এটি ন্যূনতমভাবে লগ করা হবে ভেবে ডেটা সরাতে একটি বিবৃতি ব্যবহার করার চেষ্টা করছি । দুর্ভাগ্যক্রমে প্রতিবার চেষ্টা করার পরে এটি সম্পূর্ণরূপে লগড।

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

আমার সাধারণ পরিকল্পনায় আমি কি কিছু মিস করছি, এবং এসএসআইএস খুব দ্রুত ডেটা সরাতে এবং লগের সর্বনিম্ন ব্যবহারের সাথে (স্থান সম্পর্কিত উদ্বেগগুলি) আমার সেরা বাজি?

ডেটা কোড ছাড়াই ডেটা কোড

-- Existing structure
USE [Audit]
GO

CREATE TABLE [dbo].[AuditTable](
    [Col1] [bigint] NULL,
    [Col2] [int] NULL,
    [Col3] [int] NULL,
    [Col4] [int] NULL,
    [Col5] [int] NULL,
    [Col6] [money] NULL,
    [Modified] [datetime] NULL,
    [ModifiedBy] [varchar](50) NULL,
    [ModifiedType] [char](1) NULL
); 
-- ~1.4 bill rows, ~20% in the last year

CREATE CLUSTERED INDEX [AuditTable_Modified] ON [dbo].[AuditTable]
(   [Modified] ASC   )
GO


-- New DB & Code
USE Audit_New
GO

CREATE PARTITION FUNCTION ThirteenMonthPartFunction (datetime)
AS RANGE RIGHT FOR VALUES ('20150701', '20150801', '20150901', '20151001', '20151101', '20151201', 
                            '20160101', '20160201', '20160301', '20160401', '20160501', '20160601', 
                            '20160701') 

CREATE PARTITION SCHEME ThirteenMonthPartScheme AS PARTITION ThirteenMonthPartFunction
ALL TO ( [PRIMARY] );

CREATE TABLE [dbo].[AuditTable](
    [Col1] [bigint] NULL,
    [Col2] [int] NULL,
    [Col3] [int] NULL,
    [Col4] [int] NULL,
    [Col5] [int] NULL,
    [Col6] [money] NULL,
    [Modified] [datetime] NULL,
    [ModifiedBy] [varchar](50) NULL,
    [ModifiedType] [char](1) NULL
) ON ThirteenMonthPartScheme (Modified)
GO

CREATE CLUSTERED INDEX [AuditTable_Modified] ON [dbo].[AuditTable]
(
    [Modified] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON ThirteenMonthPartScheme (Modified)
GO

CREATE NONCLUSTERED INDEX [AuditTable_Col1_Col2_Col3_Col4_Modified] ON [dbo].[AuditTable]
(
    [Col1] ASC,
    [Col2] ASC,
    [Col3] ASC,
    [Col4] ASC,
    [Modified] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON ThirteenMonthPartScheme (Modified)
GO

কোড সরান

USE Audit_New
GO
DBCC TRACEON(610);

INSERT INTO AuditTable
SELECT * FROM Audit.dbo.AuditTable
WHERE Modified >= '6/1/2015'
ORDER BY Modified

আর "ডেটা সরান": লগের ব্যবহার হ্রাস করতে আপনি ব্যাচগুলিতে ডেটা স্থানান্তর করতে পারেন যেমন dba.stackexchange.com/a/139009/94130 এ " অ্যাপ্রোচ 2" । পার্টিশন সম্পর্কিত বিষয়ে আপনি কি বিভাজনভিত্তিক দৃষ্টিভঙ্গি বিবেচনা করেছেন?
অ্যালেক্স

@ অ্যালেক্স হ্যাঁ, আমি এই দুটোই বিবেচনা করেছি। আমার ব্যাকআপ পরিকল্পনাটি এসএসআইএস ব্যবহার করে ব্যাচগুলিতে ডেটা স্থানান্তর করা। এবং এই বিশেষ ক্ষেত্রে আমার সমস্যা হ'ল পার্টিশনটি কী জন্য নির্মিত। (দ্রুত স্যুইচিং ব্যবহার করে ডেটা লোড / আনলোড)
কেনেথ ফিশার

উত্তর:


10

আপনি কেন ন্যূনতম লগিং পাচ্ছেন না?

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

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

প্রস্তাবিত পদ্ধতির

ডেটা লোডিং পারফরম্যান্স গাইডের সুপারিশগুলির ভিত্তিতে ("বাল্ক লোডিং একটি পার্টিশনযুক্ত টেবিল" বিভাগ সহ) পাশাপাশি কয়েক বিলিয়ন সারি সহ পার্টিশনযুক্ত টেবিলগুলি লোড করার বিস্তৃত অভিজ্ঞতার ভিত্তিতে, আমি যে পদ্ধতির সুপারিশ করব তা এখানে:

  • একটি নতুন ডাটাবেস তৈরি করুন।
  • নতুন ডাটাবেসে মাসের ব্যবধানে নতুন টেবিল তৈরি করুন।
  • নিম্নলিখিত ফ্যাশনে, ডেটা সবচেয়ে সাম্প্রতিক বছর সরান:
    • প্রতি মাসের জন্য, একটি নতুন গাদা টেবিল তৈরি করুন;
    • ট্যাব্লক ইঙ্গিতটি ব্যবহার করে হিপে সেই মাসের ডেটা Inোকান;
    • সেই মাসের ডেটাযুক্ত গাদাতে ক্লাস্টারড ইনডেক্স যুক্ত করুন;
    • সারণিতে এই মাসের ডেটা রয়েছে তা প্রয়োগ করে চেক সীমাবদ্ধতা যুক্ত করুন;
    • নতুন সামগ্রিক বিভাজনযুক্ত টেবিলের সংশ্লিষ্ট পার্টিশনে টেবিলটি স্যুইচ করুন।
  • দুটি ডাটাবেসের একটি নতুন নাম বদল করুন।
  • এখন "সংরক্ষণাগার" ডাটাবেসে ডেটা কেটে দিন।
  • "সংরক্ষণাগার" ডাটাবেসের প্রতিটি সারণী বিভাজন করুন।
  • ভবিষ্যতে ডেটা আর্কাইভ করতে পার্টিশন অদলবদলগুলি ব্যবহার করুন।

আপনার আসল পদ্ধতির সাথে তুলনা করার সময় পার্থক্যগুলি:

  • TABLOCKপার্টিশন সারণিতে ডাটা রাখার জন্য পার্টিশন স্যুইচিং ব্যবহার করে আপনি যদি একবারে এক মাসের সাথে একটি গাদাতে লোড করেন তবে সাম্প্রতিক 12-13 মাসের ডেটা সরিয়ে নেওয়ার পদ্ধতিটি আরও কার্যকর হবে ।
  • একজন DELETEদূরে পরিষ্কার পুরাতন টেবিল সম্পূর্ণরূপে লগ করা হবে না। সম্ভবত আপনি হয় TRUNCATEবা টেবিলটি ফেলে রেখে একটি নতুন সংরক্ষণাগার সারণী তৈরি করতে পারেন ।

ডেটার সাম্প্রতিক বছর সরানোর জন্য পদ্ধতির তুলনা

আমার মেশিনে যুক্তিসঙ্গত পরিমাণের সাথে পদ্ধতির তুলনা করার জন্য, আমি একটি 100MM rowপরীক্ষামূলক ডেটা সেট ব্যবহার করেছি যা আমি উত্পন্ন করেছি এবং এটি আপনার স্কিমা অনুসরণ করে।

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

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

এখানে সম্পূর্ণ পরীক্ষার স্ক্রিপ্ট

চূড়ান্ত নোট

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

উদাহরণস্বরূপ, আমি প্রকৃত দেব সার্ভারে (ডেল আর 720) প্রস্তাবিত পদ্ধতিটি চালিয়েছি এবং 76 seconds( 156 secondsআমার ল্যাপটপ থেকে) এ হ্রাস পেয়েছি। মজার বিষয় হচ্ছে, বিভাজনযুক্ত টেবিলের মধ্যে প্রবেশের মূল পদ্ধতির ক্ষেত্রে একই উন্নতি হয়নি এবং এখনও 12 minutesডেভ সার্ভারে এসেছিল । সম্ভবত এটি হ'ল কারণ এই প্যাটার্নটি একটি ক্রমিক ক্রিয়াকলাপের পরিকল্পনা দেয় এবং আমার ল্যাপটপের একটি একক প্রসেসর দেব সার্ভারের একক প্রসেসরের সাথে মেলে।


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

1

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


0

হতে পারে, নতুন ডাটাবেস তৈরি করার পরিবর্তে, নতুন ডাটাবেসে আসল ডাটাবেসটি পুনরুদ্ধার করুন এবং 12-13 মাসের নতুন ডেটা মুছুন। তারপরে আপনার আসল ডাটাবেসে সেই তথ্যটি মুছুন যা আপনার সদ্য তৈরি করা সংরক্ষণাগার অঞ্চলে নেই। বড় ডিলেটগুলি যদি সমস্যা হয় তবে এটি করার জন্য আপনি কেবল 10K বা বৃহত্তর সেটগুলি স্ক্রিপ্টের মাধ্যমে মুছতে পারেন।

আপনার বিভাজনের কাজগুলি দেখে মনে হচ্ছে না যে এগুলি হস্তক্ষেপ করা হবে এবং আপনার মুছে ফেলার পরে কোনওটি ডাটাবেসের ক্ষেত্রে প্রযোজ্য বলে মনে হচ্ছে।


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