কয়েক মিলিয়ন রেকর্ড সহ একটি টেবিল আপডেট করা, এটি 4 দিন হয়েছে


12

আমি বর্তমানে লক্ষ লক্ষ রেকর্ড সহ একটি টেবিল আপডেট করছি, এটি 4 দিন হয়েছে এবং ক্যোয়ারী এখনও কার্যকর হচ্ছে uting

আমি ক্রিয়াকলাপের ক্রিয়াকলাপটি চালাচ্ছে তার মনিটরিং এর মনিটরটি পরীক্ষা করে দেখেছি যে কোয়েরি চলছে।

ইভেন্ট লগ এ কোনও ত্রুটি নেই।

কর্মক্ষমতা অনুযায়ী:

  • ডিস্ক এ তে টেম্পডিবি (850 গিগাবাইট ফাঁকা জায়গা)
  • ডিস্ক বিতে ডাটাবেস ফাইল (750 গিগাবাইট ফাঁকা স্থান)
  • 16 জিবি র‌্যাম

দয়া করে আমাকে পরামর্শ দিন আমার কী করা উচিত?

ক্যোয়ারী

UPDATE
    dbo.table1
SET 
    costPercentage = ISNULL(t2.PaymentIndex, 1.0),
    t2.TopUp_Amt = (ISNULL(t2.PaymentIndex, 1.0) - 1.0)
    * ISNULL(dbo.table1.Initial_Tariff_Amt, 0.00),
    Total_Tariff_Inc_t2 = ISNULL(t2.PaymentIndex, 1.0)
    * ISNULL(dbo.table1.Initial_Tariff_Amt, 0.00)
FROM
    dbo.table2 t2
WHERE
    LEFT(dbo.test1.procodet, 3) = LEFT(t2.ProviderCode, 3) COLLATE database_default 

উত্তর:


3

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

সম্ভাব্য কারণটি হ'ল দুটি টেবিলের মধ্যে সংযুক্তি সর্বাধিক সংখ্যক সারি তৈরি করে। এটি ঘটতে পারে যদি LEFT(col, 3)অভিব্যক্তিটি সদৃশ মান তৈরি করে। যদি এটি 10 ​​টি সদৃশ তৈরি করে তবে এতে যোগদানের ফলাফলের 100000x100000 = 10000000000 সারি হবে।

আমি মনে করি না যে সূচীকরণ এখানে একটি ভূমিকা পালন করে। এসকিউএল সার্ভার এই আনইনডেক্সড যোগটিকে ঠিক একটি হ্যাশ বা মার্জ যোগদানের মাধ্যমে সমাধান করতে পারে। 4 দিন লাগে না।

অন্য সম্ভবত কারণ হতে পারে জয়েন্ট ইনপুট বা আউটপুট একটি কার্ডিনালিটি অবমূল্যায়ন। এসকিউএল সার্ভার হয়ত একটি লুপ জয়েন বেছে নিয়েছে।

এটি এখনও অনুমান হিসাবে আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি ক্যোয়ারী পরিকল্পনা পোস্ট করুন যা এই বিষয়ে আলোকপাত করবে।


8

এই ক্যোয়ারিতে আপনাকে সারণীতে প্রতিটি সারি স্ক্যান করতে হবে কারণ এটি

  • আমার ধারণা প্রোকোডেট বা প্রোভাইডার কোড ইনডেক্সড নয়
  • এমনকি যদি সেগুলি সূচকযুক্ত করা হয় তবে আপনার একটি বাম রয়েছে যা একটি পূর্বাভাসের একটি ফাংশন
  • এবং আপনার কাছেও কল্ট রয়েছে যা কার্যকরভাবে কোনও পূর্বাভাসের একটি ফাংশন

"WHERE predicate এ ফাংশন" এর অর্থ সূচকগুলি ব্যবহৃত হবে না

আপনি যদি এটি ব্যাচ করেন (আপডেট টপ (10000) বলুন ... এবং কস্ট পারসেন্টেজ ন্যূন) তবে আপনার কস্ট পারসেন্টেজের উপর একটি সূচক প্রয়োজন এবং এটি ধরে নিই যে আপনি এটি সেট করছেন।

আমি দেখতে পাই একমাত্র সমাধান

  • প্রাথমিক কীটি বলুন এর উপর ভিত্তি করে ব্যাচগুলিতে একটি নতুন টেবিল তৈরি করুন
  • বাম এবং কলটি এক্সপ্রেশনগুলি গোপন করতে সূচিযুক্ত, গণিত কলাম তৈরি করুন, তারপরে আপডেটটি চালান

@ জিবিএন .. ধন্যবাদ এটি একটি দুর্দান্ত ধারণা .. তবে ডেটা মিলিয়নে থাকায় এই প্রক্রিয়াতে সময় লাগবে .... আমি ভাবছিলাম কোয়েরির অগ্রগতি খুঁজে পাওয়ার উপায় আছে কি?
ভাগ্যবান

1
"মিলিয়ন" সারিটি স্ক্যান করতে 4 দিন লাগবে কেন? সারিগুলি কত বড় এবং ভারী সূচকযুক্ত হতে পারে, এটি 4 দিন লাগবে না। সমস্যার মূলটি এখনও অজানা।
usr

1
আপনি যদি নিয়মিতভাবে বড় ডেটা নিয়ে ডিল করেন তবে তার জন্য সঠিক সার্ভারটি কী পাবেন? ডেটা এসএসডি ইত্যাদির উপর রাখুন
টমটম

1
নিঃসন্দেহে আমি উত্তরটি সম্বোধন করছিলাম। কিছু ভুল আছে যা আমরা এখনও পাইনি। এটি নিজে বা হার্ডওয়্যার দ্বারা ক্যোয়ারী নয়। এটি কখনই 4 দিনের সময়কালের পরিমাণ হয় না।
usr

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

4

সবার আগে, ক্যোয়ারীটি এতে পরিবর্তন করুন:

UPDATE t1
SET 
    costPercentage = ISNULL(t2.PaymentIndex, 1.0),
    t2.TopUp_Amt = (ISNULL(t2.PaymentIndex, 1.0) - 1.0)
    * ISNULL(dbo.table1.Initial_Tariff_Amt, 0.00),
    Total_Tariff_Inc_t2 = ISNULL(t2.PaymentIndex, 1.0)
    * ISNULL(dbo.table1.Initial_Tariff_Amt, 0.00)
FROM
  dbo.table1 t1
  inner join dbo.table2 t2
    on LEFT(t1.procodet, 3) = LEFT(t2.ProviderCode, 3) COLLATE database_default 

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

এরপরে, এই এলএফটি এক্সপ্রেশনগুলি অবশ্যই সূচিকৃত হতে হবে। জিবিএন এর উত্তর আপনাকে কীভাবে এটি করতে হবে তার নির্দেশক দেয়।

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