ওরাকলবুলকপিটি বিশেষত কী করে এবং আমি কীভাবে এর সম্পাদনাকে আরও অনুকূল করতে পারি?


14

সুনির্দিষ্ট বিবরণগুলির সংক্ষিপ্তসার হিসাবে: আমাদের প্রায় 5 মিলিয়ন সারিটি একজন বিক্রেতার (ওরাকল) ডাটাবেসের মধ্যে মঞ্চস্থ করতে হবে। OracleBulkCopy(ODP.NET) ব্যবহার করে 500k সারিগুলির ব্যাচগুলির জন্য সবকিছু দুর্দান্ত হয়ে যায় , তবে আমরা যখন 5M পর্যন্ত স্কেল করার চেষ্টা করি তখন 1M চিহ্নটি একবার আঘাত করলে পারফরম্যান্স ক্রলটিতে ধীরে ধীরে শুরু হয়, আরও সারি লোড হওয়ার সাথে ধীরে ধীরে ধীর হয়ে যায় এবং শেষ পর্যন্ত 3 ঘন্টা বা তার পরে সময় বার।

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

  1. OracleBulkCopyশ্রেণিটি কি প্রচলিত বা প্রত্যক্ষ পথে লোডিং ব্যবহার করে? এটির কোনও উপায় আছে যা আমি এটি নিশ্চিত করতে পারি, একভাবে বা অন্যভাবে?

  2. ধরে নিলাম এটি সরাসরি-পাথ লোড ব্যবহার করে : এটি কী সত্য যে ওরাকল স্বয়ংক্রিয়ভাবে সমস্ত সূচকগুলি লোডের সময় অকেজো হয়ে যায় এবং পরে অনলাইনে ফিরিয়ে দেয়? আমি এই প্রসঙ্গে বেশ কয়েকটি বিবৃতি পড়েছি কিন্তু আবার এটি নিশ্চিত করতে পারছি না।

  3. যদি # 2 সত্য হয়, তবে আমি একটি বাল্ক অনুলিপি অপারেশন শুরু করার আগে টেবিলে কী সূচি রয়েছে সেগুলি নিয়ে কি কোনও পার্থক্য করা উচিত? যদি তাই হয় তবে কেন?

  4. # 3 এর সাথে সম্পর্কিত, সাধারণভাবে কোনও অকেজো ইন্ডেক্সের সাথে বাল্ক লোডিংয়ের মধ্যে কোনও বাস্তব পার্থক্য আছে কি না? আসলে লোডের আগে সূচকটি ফেলে দেওয়া এবং পরে এটি পুনরায় তৈরি করা?

  5. # 2 যদি সঠিক না হয় , বা যদি এমন কিছু সতর্কতা থাকে যা আমি বুঝতে পারি না, তবে এটি কি স্পষ্টতই বাল্ক লোডের আগে সূচকটিকে অকেজো করে তুলবে এবং তারপরে স্পষ্টতই এটি পুনরায় নির্মাণ করবে?

  6. আরও কিছু রেকর্ড যুক্ত হওয়ার সাথে সাথে সূচি তৈরির বাইরেও কি অন্য কিছু রয়েছে, যার ফলে একটি বাল্ক অনুলিপি ক্রিয়াকলাপ ধীরে ধীরে ধীরে ধীরে বৃদ্ধি পেতে পারে? (সম্ভবত লগিংয়ের সাথে কিছু করার জন্য, যদিও আমি আশা করব যে বাল্ক অপারেশনগুলি লগ করা হয়নি?)

  7. যদি প্রথমে পিকে / ইনডেক্স বাদ না দিয়ে পারফরম্যান্সকে সামনে রেখে অন্য কোনও উপায় না পাওয়া যায় তবে সূচকটি পুরোপুরি অদৃশ্য হয়ে যায় না তা নিশ্চিত করার জন্য আমি কী পদক্ষেপ নিতে পারি, অর্থাৎ যদি ডাটাবেসের সাথে সংযোগটি হারিয়ে যায় তবে প্রক্রিয়া মাঝখানে?


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

আপনি উত্স থেকে ডেটা পড়তে একটি ডেটা রিডার ব্যবহার করছেন?
bernd_k

@ বারেন্ড_কে: না, পুরোপুরি স্মৃতি থেকে লোড হচ্ছে। এটি অবশ্যই সমস্যাটি উত্স নয়।
অ্যারোনআউট

উত্তর:


13

পড়ার এবং পরীক্ষার আরও কয়েকটি দিন এবং আমি (বেশিরভাগ ক্ষেত্রে) এর অনেক উত্তর দিতে সক্ষম হয়েছি:

  1. আমি এই মগ্ন পাওয়া ODP.NET ডকুমেন্টেশন (হাস্যকর নাOracleBulkCopyডক্স):

    ODP.NET বাল্ক অনুলিপি বৈশিষ্ট্যটি একটি সরাসরি পাথ লোড পদ্ধতির ব্যবহার করে, যা অনুরূপ তবে ওরাকল এসকিউএল * লোডারের মতো নয়। প্রত্যক্ষ পাথ লোড ব্যবহার প্রচলিত লোডিংয়ের চেয়ে দ্রুত (প্রচলিত এসকিউএল INSERTস্টেটমেন্টগুলি ব্যবহার করে )।

    সুতরাং এটি প্রদর্শিত হবে এটি নেই সরাসরি পথ ব্যবহার করুন।

  2. এটি আমি একটি বৃহত বাল্ক অনুলিপি অপারেশন করে এবং এসকিউএল বিকাশকারী এর সূচক বৈশিষ্ট্য পেয়ে যাচাই করতে সক্ষম হয়েছি। সূচক হয়নি হিসাবে প্রদর্শিত UNUSABLEযখন বাল্ক কপি উন্নতি ছিল। যাইহোক , আমি এটিও আবিষ্কার করেছি যে OracleBulkCopy.WriteToServerসূচিটি কোনও রাজ্যে শুরু হলে চালানো অস্বীকার করবে UNUSABLE, সুতরাং এখানে আরও স্পষ্টত আরও কিছু ঘটছে, কারণ যদি এটি সূচককে অক্ষম করা এবং পুনর্নির্মাণের মতো সহজ ছিল তবে এটি প্রাথমিক অবস্থার বিষয়ে চিন্তা করা উচিত নয়।

  3. সূচকটিও সীমাবদ্ধ থাকলে এটি বিশেষত কোনও পার্থক্য আনতে পারে । উপরের লিঙ্কযুক্ত নথিটিতে এই ছোট্ট রত্নটি পাওয়া গেছে:


    একটি ওরাকল বাল্ক কপির সময় সীমাবদ্ধগুলি সক্ষম করা হয়েছে , নিম্নলিখিত সীমাবদ্ধতাগুলি ডিফল্টরূপে স্বয়ংক্রিয়ভাবে সক্ষম হয়:

    • NOT NULL
    • UNIQUE
    • PRIMARY KEY (নাল কলামে অনন্য-সীমাবদ্ধতা)

    NOT NULLসীমাবদ্ধতাগুলি কলাম অ্যারে বিল্ড টাইমে পরীক্ষা করা হয়। NOT NULLসীমাবদ্ধতা লঙ্ঘন করে এমন কোনও সারি প্রত্যাখ্যান করা হবে।

    UNIQUEলোডের শেষে সূচিগুলি পুনরায় তৈরি করা হলে সীমাবদ্ধতাগুলি যাচাই করা হয়। কোনও UNIQUEসীমাবদ্ধতা লঙ্ঘন করলে সূচিটি অনুলিখিত অবস্থায় ছেড়ে যায় ।

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

  4. আমি নিশ্চিত নই যে পর্যবেক্ষণ করা পার্থক্য ওরাকলের মধ্যেই রয়েছে বা কেবলমাত্র এক দফায় দফায় OracleBulkCopy। জুরি এখনও এই এক খুঁজে।

  5. OracleBulkCopyপ্রাথমিকভাবে কোনও সূচক UNUSABLEরাজ্যে থাকলে একটি ব্যতিক্রম ছুঁড়ে ফেলা হবে , সুতরাং এটি সত্যিই একটি মূল বিষয়।

  6. সেখানে যদি হয় অন্যান্য বিষয়, ইনডেক্স (এবং বিশেষ করে পি কে ইনডেক্স) এখনও সবচেয়ে গুরুত্বপূর্ণ, যেমন আমি খুঁজে পাওয়া যায় নি আছেন:

  7. একই স্কিমা (ব্যবহার করে CREATE AS) দিয়ে একটি বিশ্বব্যাপী অস্থায়ী টেবিল তৈরি করা , তারপরে অস্থায়ী টেবিলটিতে বাল্ক অনুলিপি করা এবং অবশেষে INSERTটেম্প টেবিল থেকে রিয়েল টেবিলের মধ্যে একটি সরল পুরানো কাজ করা। যেহেতু টেম্প টেবিলটির কোনও সূচক নেই, বাল্ক অনুলিপিটি খুব দ্রুত ঘটে এবং ফাইনালটিও INSERTদ্রুত হয় কারণ ডেটা ইতিমধ্যে একটি সারণীতে থাকে (5M সারি টেবিল থেকে টেবিল অনুলিপি হওয়ার পরে, আমি এখনও সংযোজন ইঙ্গিতটি চেষ্টা করি নি) ইতিমধ্যে 1 মিনিটেরও কম সময় নেয়)।

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

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

উপসংহার: ODP.NET ব্যবহার করে সূচিকৃত ওরাকল টেবিলটিতে প্রায় 100k টির বেশি সারি বেশি কপি করার চেষ্টা করতে বিরক্ত করবেন না other হয় সূচকটি (যদি আপনার আসলে এটির প্রয়োজন না হয়) বা ডেটাটিকে আলাদা (অ-সূচিযুক্ত) সারণীতে "প্রিলোড" করুন ।


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

@ বারেন্ড_কে: সূচিটি Deleteহওয়ায় এটি সম্ভব নয় UNUSABLE। এটি সীমাবদ্ধতা যাচাইয়ের ফলাফল যা বাল্ক কপির শেষে ঘটে।
অ্যারোনআউট

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

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

সম্ভবত আপনি যখন এটি করতে সাহায্য করবেalter session set skip_unusable_indexes = true;
ওয়ার্নফ্রিড ডমসচিট

1

এখানে ওরাকল থেকে একটি নিবন্ধ দেওয়া হয়েছে যা বাল্ক সন্নিবেশ ব্যবহার করা কখন সুবিধাজনক হবে বা কখন নয় তা ব্যাখ্যা করে। এছাড়াও, ডাটাবেস স্তরে কী ঘটে তার একটি অন্তর্দৃষ্টি আছে।

http://docs.oracle.com/cd/B28359_01/server.111/b28319/ldr_modes.htm


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