প্রস্তাবিত ব্যাচের আকারটি কী জন্য SqlBulkCopy
? আমি একটি সাধারণ সূত্র খুঁজছি যা আমি পারফরম্যান্স টিউনিংয়ের জন্য একটি প্রাথমিক পয়েন্ট হিসাবে ব্যবহার করতে পারি।
প্রস্তাবিত ব্যাচের আকারটি কী জন্য SqlBulkCopy
? আমি একটি সাধারণ সূত্র খুঁজছি যা আমি পারফরম্যান্স টিউনিংয়ের জন্য একটি প্রাথমিক পয়েন্ট হিসাবে ব্যবহার করতে পারি।
উত্তর:
আমার এসকিউএল সার্ভার উদাহরণ হিসাবে একই শারীরিক সার্ভারে আমার একটি আমদানি ইউটিলিটি রয়েছে। একটি কাস্টম ব্যবহার করে IDataReader
, এটি ফ্ল্যাট ফাইলগুলি পার্স করে এবং তাদের ব্যবহার করে একটি ডেটাবেজে সন্নিবেশ করায় SQLBulkCopy
। একটি সাধারণ ফাইলে প্রায় 6M যোগ্য সারি থাকে, দশমিক এবং সংক্ষিপ্ত পাঠ্যের 5 টি কলাম গড়, প্রতি সারিতে প্রায় 30 বাইট।
এই দৃশ্যের প্রেক্ষিতে, আমি গতি এবং মেমরির ব্যবহারের সর্বোত্তম আপস হতে 5000 ব্যাচের আকার পেয়েছি। আমি 500 দিয়ে শুরু করেছি এবং বৃহত্তর সাথে পরীক্ষা করেছি। আমি 5000 এর চেয়ে 500x এর চেয়েও দ্রুত 2.5x দ্রুত পেয়েছি।
10,000 দ্রুত পরিমাপযোগ্য দ্রুত ছিল না। ৫০,০০০ এর উপরে চলে যাওয়া কয়েক শতাংশ পয়েন্টের গতি উন্নত করে তবে এটি সার্ভারের বর্ধিত লোডের পক্ষে মূল্যবান নয়। 50,000 এর উপরে গতির কোনও উন্নতি দেখায়নি।
এটি কোনও সূত্র নয়, তবে এটি আপনার ব্যবহারের জন্য অন্য ডেটা পয়েন্ট।
এটি এমন একটি বিষয় যা আমি অনুসন্ধানে কিছুটা সময় ব্যয় করেছি। আমি একটি সি # কনসোল অ্যাপ্লিকেশন (। নেট 2.0) ব্যবহার করে একটি এসকিউএল সার্ভার 2005 ডাটাবেসে বড় সিএসভি ফাইল (16+ গিগাবাইট, 65+ মিলিয়ন রেকর্ডস, এবং ক্রমবর্ধমান) আমদানি করতে অপ্টিমাইজ করতে চাই। হিসাবে জেরেমি করেছে ইতিমধ্যে নির্দিষ্ট , আপনি আপনার বিশেষ পরিস্থিতিতে কিছু ফাইন টিউনিং করতে প্রয়োজন হবে, কিন্তু আমি সুপারিশ করবে আপনি 500 ইনিশিয়াল ব্যাচ আকার আছে, এবং পরীক্ষা উভয় উপরে এবং নীচের এই সহকারে বিবেচনা করে।
আমি এই এমএসডিএন ফোরামের পোস্ট থেকে ব্যাচ আকারের জন্য 100 এবং 1000 এর মধ্যে মান পরীক্ষা করার জন্য সুপারিশ পেয়েছি এবং তা নিয়ে সন্দেহ ছিল। তবে আমি যখন 100 থেকে 10,000 এর মধ্যে ব্যাচের আকারের জন্য পরীক্ষা করেছি তখন আমি দেখতে পেলাম যে 500 টি হ'ল আমার আবেদনের অনুকূল মান। এর জন্য 500 মানটি SqlBulkCopy.BatchSize
এখানেও সুপারিশ করা হয় ।
আপনার স্কেলবুল্ককপি অপারেশনটিকে আরও অনুকূল করতে, এই এমএসডিএন পরামর্শটি দেখুন ; আমি দেখতে পেলাম যে স্কেলবুল্ককপিঅ্যাপশনগুলি ব্যবহার করে T টেবিললক লোডিংয়ের সময় কমাতে সহায়তা করে।
অন্যরা যেমন বলেছে, এটি আপনার পরিবেশের উপর নির্ভর করে বিশেষভাবে সারি ভলিউম এবং নেটওয়ার্কের বিলম্ব।
ব্যক্তিগতভাবে, আমি BatchSize
সম্পত্তিটি 1000 সারিতে সেট করে শুরু করব এবং দেখব কীভাবে এটি সম্পাদন করে। যদি এটি কাজ করে তবে আমি সময়সীমা না পাওয়া পর্যন্ত আমি সারিগুলির সংখ্যা দ্বিগুণ করে রাখি (যেমন 2000, 4000 ইত্যাদি),
অন্যথায়, যদি টাইমআউটটি 1000 এ ঘটে তবে আমি কাজ না করা অবধি সারিগুলির সংখ্যা অর্ধেকে (উদাহরণস্বরূপ 500) কমিয়ে দেব।
প্রতিটি ক্ষেত্রে আমি দ্বিগুণ (যদি সফল হয়) বা অর্ধবৃত্ত করতে পারি (ব্যর্থ হলে) শেষ দুটি চেষ্টা ব্যাচের আকারের মধ্যে একটি মিষ্টি স্পট না পাওয়া পর্যন্ত পার্থক্য রাখি ।
অন্যান্য বিষয় বিবেচনা করার জন্য হ'ল সারিগুলির একক ব্যাচ অনুলিপি করতে কত সময় লাগে । টাইমআউটগুলি ঘটবে যদি অনুলিপি করা সারিগুলির ব্যাচটি BulkCopyTimeout
সম্পত্তি থেকে বেশি হয়ে যায় যা ডিফল্টরূপে 30 সেকেন্ড হয়। আপনি BulkCopyTimeout
সম্পত্তিটি 60 সেকেন্ডে দ্বিগুণ করার চেষ্টা করতে পারেন । এটি ব্যাচের সারিগুলির বৃহত্তর সেটটি অনুলিপি করার জন্য দীর্ঘ সময়ের জন্য অনুমতি দেয়। উদাহরণস্বরূপ, 50,000 সারিগুলির একটি ব্যাচ প্রায় 30 সেকেন্ড সময় সীমা অতিক্রম করে প্রায় 40 সেকেন্ড সময় নিতে পারে তাই এটি 60 সেকেন্ড পর্যন্ত বাম্প করা পারফরম্যান্সে সহায়তা করতে পারে।
এটি আপনার বাস্তবায়নের উপর নির্ভর করে।
আপনার নেটওয়ার্কে আপনি কী ধরণের গতি আশা করতে পারেন? আপনি কি এটি ফর্ম বা এএসপি.নেটে ব্যবহার করছেন? আপনার কি অগ্রগতির ব্যবহারকারীকে সতর্ক করা দরকার? মোট কাজের আকার কত?
আমার অভিজ্ঞতায় নির্দিষ্ট ব্যাচের আকার ছাড়াই বাল্ক অনুলিপি চলমান সময়সীমার সমস্যার কারণ হবে। আমি 1000 রেকর্ডের মতো কিছু দিয়ে শুরু করতে এবং সেখান থেকে কিছু সমন্বয় করতে চাই।
আমি একাধিক আকার চেষ্টা করেছি, আমার ক্ষেত্রে 5000 ভাল ছিল