কোনও টেবিলের বৃহত পরিবর্তনগুলির জন্য আরও ভাল কী: প্রতিবার মুছে ফেলুন এবং অন্তর্ভুক্ত করুন বা বিদ্যমান আপডেট করুন?


27

আমি এমন একটি প্রকল্প তৈরি করছি যেখানে আমাকে প্রতিদিন একটি টেবিলের প্রায় 36K রেকর্ড পরিবর্তন করতে হবে। আমি আরও ভাল পারফরম্যান্স করবে কি ভাবছি:

  1. সারিগুলি মুছুন এবং নতুন সন্নিবেশ করুন, বা
  2. ইতিমধ্যে বিদ্যমান সারিগুলি আপডেট করুন

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

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

আমি কি এই রজনী প্রক্রিয়াটির জন্য রেকর্ডগুলি মুছে / সন্নিবেশ করবো বা আমার বিদ্যমান (যেখানে সম্ভব) আপডেট করা উচিত?


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

উত্তর:


9

এটি সত্যিই নির্ভর করে যে কতটা ডেটা পরিবর্তন হচ্ছে। এই টেবিলটিতে 20 টি কলাম রয়েছে বলে দিন। এবং আপনার কাছে 5 টি সূচকও রয়েছে - প্রতিটি আলাদা আলাদা। কলাম।

এখন যদি সমস্ত 20 কলামের মানগুলি পরিবর্তন হয় বা এমনকি 5 টি কলামের ডেটা পরিবর্তন হয় এবং এই 5 টি কলামটি সমস্ত সূচকযুক্ত হয়, তবে আপনি "মোছা এবং সন্নিবেশ করানো" থেকে ভাল হতে পারেন। তবে যদি কেবল 2 টি কলাম পরিবর্তন হয় এবং যাক এইগুলি কোনও ক্লাস্টারযুক্ত সূচকের অংশ নয়, তবে আপনি রেকর্ডগুলি "আপডেট করা" থেকে ভাল হতে পারেন কারণ এই ক্ষেত্রে কেবল ক্লাস্টারড সূচি আপডেট করা হবে (এবং সূচীগুলি করতে হবে না) আপডেট করা)।


আরও গবেষণায়, আমি খুঁজে পেয়েছি যে আমার দ্বারা উপরের মন্তব্যটি এক ধরণের অপ্রয়োজনীয় কারণ এসকিউএল সার্ভার অভ্যন্তরীণভাবে একটি আপডেট করার জন্য 2 পৃথক প্রক্রিয়া রয়েছে। - একটি "ইন-প্লেস আপডেট" (অর্থাত্ মূল কাতারে একটি কলামের মান পরিবর্তন করে) বা "ইন-প্লেস আপডেট নয়" (একটি ইনসার্ট অনুসরণ করে মুছে ফেলা) হিসাবে as

জায়গায় আপডেটগুলি নিয়ম হয় এবং সম্ভব হলে সম্পাদিত হয়। এখানে সারিগুলি একই পৃষ্ঠায় একই পৃষ্ঠায় ঠিক একই স্থানে থাকে। ক্ষতিগ্রস্ত কেবলমাত্র বাইটগুলিই চেনাজড হয়। টলোগুলের কেবল একটি রেকর্ড রয়েছে (প্রদত্ত কোনও আপডেট ট্রিগার নেই)। কোনও গাদা আপডেট করা হচ্ছে (এবং পৃষ্ঠায় পর্যাপ্ত জায়গা রয়েছে) আপডেট হলে জায়গায় ঘটে। যদি ক্লাস্টারিং কী পরিবর্তন হয় তবে সারিটি মোটেও সরানোর প্রয়োজন হয় না তবে আপডেটগুলিও জায়গায় ঘটে।

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

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

"আপডেট" ইন্টার্নাল সম্পর্কিত তথ্যের জন্য বা সে সম্পর্কিত কোনও এসকিউএল সার্ভার সম্পর্কিত ইন্টার্নালগুলির জন্য, ক্যালেন ডেলানিকে, পল র্যান্ডালের, এবং অন্যান্য বইয়ের - এসকিউএল সার্ভার ২০০৮ ইন্টারনালগুলি দেখুন


8

আপনি কি এসকিউএল ২০০৮- এ মার্জ কমান্ডটি তদন্ত করেছেন ? এখানে একটি প্রাথমিক উদাহরণ:

  merge YourBigTable ybt
  using (select distinct (RecordID) from YourOtherTable) yot
     on yot.Recordid = YBT.RecordID
  when NOT matched by target
  then  insert (RecordID)
        values (yot.DeviceID) ;

এটি মূলত একটি "ইউপিএসআরটি" কমান্ড। এটি উপস্থিত থাকলে আপডেট করুন, এটি না থাকলে sertোকান। খুব দ্রুত, খুব দুর্দান্ত কমান্ড।


1
এটি কোনও আপডেটের চেয়ে দ্রুত নয়, হুডের নীচে একই যান্ত্রিক।
মার্ক স্টোরী-স্মিথ

এটি আপডেট করার চেয়ে দ্রুত যা ইতিমধ্যে বিদ্যমান নেই এমনগুলি সন্নিবেশ করানোর চেয়ে দ্রুত।
ডেটাগোড

2
আপনি যদি বিষয়টি জানেন তবে এটি প্রমাণ করুন :)
মার্ক স্টোরি-স্মিথ

4

তবে, আমি নিজেই 30 মিলিয়ন (3 কোটি) রেকর্ড রয়েছে এমন একটি টেবিলে মুছুন এবং সন্নিবেশ বনাম আপডেটটি পরীক্ষা করে দেখেছি। এই টেবিলটিতে একটি ক্লাস্টারযুক্ত অনন্য মিশ্র কী এবং 3 টি নন-ক্ল্লাস্টার কী রয়েছে। মুছুন ও সন্নিবেশ করানোর জন্য এটি 9 মিনিট সময় নিয়েছে। আপডেটের জন্য এটি 55 মিনিট সময় নিয়েছিল। কেবলমাত্র একটি কলাম রয়েছে যা প্রতিটি সারিতে আপডেট হয়েছিল।

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


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

3

আপডেট তত দ্রুত নয়। কৌশলটি একটি দ্রুত সন্নিবেশ অর্জন করা হ'ল ডেটা isোকানোর সময় সূচী অক্ষম করা।

এটি ব্যবহার বিবেচনা করুন:

-- disable indexes
ALTER INDEX [index_name] ON dbo.import_table DISABLE
-- ... disable more indexes

-- don't use delete if you don't care about minimal logging. truncate is faster
TRUNCATE TABLE dbo.import_table

-- just insert the new rows
INSERT dbo.import_table
SELECT
    *
FROM
    dbo.source_table

-- rebuild indexes
ALTER INDEX [index_name] ON dbo.import_table REBUILD
-- ... rebuild more indexes

এমনকি দ্রুত ডিবি বিকল্পগুলিতে স্বয়ংক্রিয় পরিসংখ্যান আপডেট বন্ধ করা is টেবিলটি উল্লেখযোগ্যভাবে পরিবর্তিত হলে আপনার চালানো উচিত:

UPDATE STATISTICS dbo.import_table

অথবা

EXEC sp_updatestats

স্ট্যাটাসটি আপ টু ডেট রাখার জন্য নিয়মিত ভিত্তিতে (দৈনিক, সাপ্তাহিক ডিবি আকারের উপর নির্ভর করে) চাকরি হিসাবে। সারণীটি খালি থাকলে পরিসংখ্যান আপডেট করা thing টেবিলটি আবার জনপ্রিয় হওয়ার পরে আপনি যদি এটি চালনা না করেন তবে এটি পরিসংখ্যানগুলি স্ক্রু করবে।


4
আমি সর্বদা এই ক্ষেত্রে যে অসমত। এছাড়াও, @ অ্যাডভাইলোটের প্রশ্নের টেবিলটি ট্রানকেট দ্বারা সাফ করা যাবে না কারণ এতে 89 মি রেকর্ড রয়েছে এবং তিনি কেবল 36 কে আপডেট করতে চান।
মার্ক স্টোরি-স্মিথ

আরও সাবধানে পোস্ট পড়তে শেখা দরকার! আমি পোস্টটি আপডেট করব ... আসলে আমার অনেক কিছু বদলাতে হবে।
জিজ্ঞাসা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.