100 মিমি রেকর্ডে যোগ দিয়ে আপডেট করুন, কীভাবে এটি আরও ভাল করা যায়? (টি-এসকিউএল এ)


11

আমাকে একক টেবিলের 100 মিলিয়ন রেকর্ড আপডেট করতে হবে, ফলস্বরূপ, কেবলমাত্র একটি আইডি দিয়ে একটি কলামের ভারচার মান প্রতিস্থাপন করে টেবিলটিকে সাধারণকরণ করতে হবে। (আমি "প্রতিস্থাপন" বলছি তবে সত্যই আমি আইডিটি অন্য কলামে লিখছি))

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

UPDATE A
SET A.AutoClassID = B.AutoClassID
FROM AutoDataImportStaging.dbo.Automobile as A
JOIN AutoData.dbo.AutoClass as B on (A.AutoClassName = B.AutoClassName)

পটভূমি

  • সার্ভার ২০০৮ আর 2 তে এমএসএসকিউএল ২০০৮ আর 2 ব্যবহার করে
  • সার্ভারে 8 জিবি র‌্যাম রয়েছে
  • সার্ভারের একটি RAID10 রয়েছে, 7200 আরপিএম সটা (দুর্দান্ত নয়, আমি জানি, উত্পাদনে এটি কেবল ডেটা পড়বে এবং ডেটা লিখবে না; পাশাপাশি সাম্প্রতিক এইচডি সংকট ব্যয়ের জন্য এটি প্রয়োজনীয় করেছে)
  • সার্ভারে ডুয়াল কোয়াড-কোর জিয়ন সিপিইউ রয়েছে
  • মেশিন অন্য কিছু করছে না (বর্তমানে দেবের জন্য উত্সর্গীকৃত, কেবল এই প্রক্রিয়া)
  • সরল লগিং চালু (? - তবে এটি কী এখনও লগ ইন করে যাতে এটি রোলব্যাক করতে পারে?)
  • নোট করুন যে ক্যোয়ারী দুটি পৃথক ডিবি উল্লেখ করে, এটির জন্য মূল্য
  • সারণিতে আপডেট হওয়া রেকর্ডের "প্রস্থ" 455 বাইট

কার্যকর করার সময় সংস্থানসমূহ

  • শারীরিক র‌্যাম সর্বোচ্চ আউট হয়
  • ডিস্ক আই / ও ম্যাক্স আউট হয়
  • সিপিইউ খুব কমই কিছু করছে (চোক পয়েন্টটি I / O)
  • রান সময় হয়েছে 14 ঘন্টা এবং গণনা!

আমি কিছু জিনিস সন্দেহ করি যেমন কাঁচা ডেটাতে আমার একটি সূচি প্রয়োজন, যদিও আমি নরমালাইজেশন আপডেটের পরে কলামটি (অটোক্লাসনাম) বাদ দিচ্ছি। আমি আরও আশ্চর্য হয়েছি যে জিনের পরিবর্তে আমার একবারে কেবল টেবিলের একটি রেকর্ডটি লুপ করা উচিত, যা আমি এটি শুরু করার সময় হাস্যকর মনে হয়েছিল, তবে এখন মনে হচ্ছে এটি আরও দ্রুততর হত।

আমি কীভাবে আমার বাকী নরমালাইজেশন আপডেটগুলি (এটির অনুরূপ) আরও দ্রুত আমার পদ্ধতি পরিবর্তন করব?

উত্তর:


7

আপনি একক (খুব বড়) লেনদেন হিসাবে এটি করার চেষ্টা করছেন। পরিবর্তে, ছোট ব্যাচে আপডেট করুন।

আপনি এর থেকে উপকার পাবেন:

  • AutoData.dbo.AutoClass.AutoClassName এ একটি অস্থায়ী সূচক
  • আরও র‌্যাম। লটের আরও র‌্যাম।

1
+1 আমি ক্লজটি ব্যবহার করে ব্যাচ আপডেট করার সাথে একমত TOP। এটা আমার পদ্ধতির হতে হবে।
টমাস স্ট্রিংগার

আমি যদি শীর্ষস্থানীয় আপডেট করি তবে আমার যেখানে একটি ক্লজ প্রয়োজন (যেখানে অটো ক্লাসিড নাল?) যেখানে দফায় কোনও নতুন পারফরম্যান্স হিট প্রবর্তন করবে না (একটি টেবিল স্ক্যান আমি এখন করছি না)। সন্দেহ নেই যে এটি জিনের সাথে আমার যে র‍্যাম সমস্যা রয়েছে তা হ্রাস পাবে।
ক্রিস আদ্রগনা

আমার প্রতিক্রিয়া দীর্ঘ বিলম্বিত, কিন্তু আমার ক্ষেত্রে, সেট ROWCOUNT সবচেয়ে কার্যকর হিসাবে প্রমাণিত be
ক্রিস আদ্রগনা

10

আমি একটি ভিন্ন পদ্ধতির গ্রহণ করব।

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

এটি প্রায় অবশ্যই দ্রুত হবে:

SELECT DISTINCT
    AutoClassID,
    <Other fields>
INTO
    AutoDataImportStaging.dbo.Automobile
FROM
    AutoData.dbo.AutoClass

বর্তমানে লেখা হিসাবে, এখানে অনেকগুলি যৌক্তিক ক্রিয়াকলাপ চলছে:

  • এ.আউটো ক্লাসনামের সমস্ত মান পড়ুন
  • বি.আউটো ক্লাসনামের সমস্ত মান পড়ুন
  • এ এবং বি মানগুলির তুলনা করুন
  • মিলে যাওয়া সেটগুলির মধ্যে, বিআউটোক্লাসআইডি-র সমস্ত মান পড়ুন
  • সূচি বিদ্যমান যা কিছু আছে তার মাধ্যমে B.AutoClassId মান হতে A.AutoClassId এর বিদ্যমান মানগুলি আপডেট করুন

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

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

5

একসাথে এক সারি টেবিলটি লুপিং করা দ্রুত হবে না!

সন্দেহজনক এবং আপনার দ্বারা নিশ্চিত হিসাবে, এটি আই / ও আবদ্ধ হবে - একটি ডিস্ক থাকা, পড়া, লেখা, লেনদেন লগ এবং (যে কোনও) অস্থায়ী কাজের স্থান সব একই আই / ওয়ের জন্য প্রতিযোগিতা করবে।

সরল পুনরুদ্ধার এখনও লেনদেনগুলিতে লগ করবে, তবে লগটি একটি চেকপয়েন্ট দ্বারা সাফ করা হবে। এটি সম্ভব যে আপনি প্রাথমিক লগের আকার এবং স্বতঃবৃদ্ধি সেটিংস কিছু আই / ওকে ধীর করে দিচ্ছে - পরিবর্তনগুলি সামঞ্জস্য করার জন্য লেনদেনের লগ বাড়তে হবে।

আপনি কি অটোক্লাসনাম ক্ষেত্রকে সূচিকর্ম করার চেষ্টা করেছেন? কতটি পৃথক অটাক্লাস মান আছে?

আপনার i / o এর সীমাবদ্ধতার ভিত্তিতে আপনাকে আপডেটগুলি ব্যাচ করতে হবে। সুতরাং 1 মিলিয়ন, চেকপয়েন্ট আপডেট করুন, পুনরাবৃত্তি করুন ...


এখানে কেবল 15 টি পৃথক অটোক্লাসের মান রয়েছে। আপনার মন্তব্যগুলি আমার অনেক সন্দেহের (এবং বেদনা!) নিশ্চিত করে। তোমার উত্তরের জন্য ধন্যবাদ.
ক্রিস আদ্রগনা

3

যোগদানের ক্ষেত্রগুলির জন্য সূচী তৈরি করুন।

আপনার কাজ শেষ হয়ে গেলে আপনি সর্বদা সূচকগুলি ফেলে দিতে পারেন।

আমি সূচকগুলি আপডেটের পারফরম্যান্সটিতে উল্লেখযোগ্যভাবে উন্নতি না করতে পারলে আমি খুব অবাক হব।


আমি নিশ্চিত যে সূচকগুলি উন্নত হবে। আমি মনে করি প্রশ্নটি হল যে তারা সূচি তৈরি করতে সময় নেয় তার চেয়ে বেশি উন্নতি হয় (কেবলমাত্র একটি ব্যবহারের জন্য)। সম্ভবত হ্যাঁ. :)
ক্রিস আদ্রগনা

3

আপনি যেভাবে চান তা এক্সপোর্ট করুন, একটি নতুন টেবিল তৈরি করুন এবং ফিরে আমদানি করুন। বোনাস হিসাবে, আপনার কাছে অলৌকিক ঘটনা ঘটে থাকলে ব্যাকআপ হিসাবে ডেটার একটি অনুলিপি থাকে।

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