আমি যতদূর বলতে পারি যে আপনি একটি নিয়মিত সন্নিবেশটিকে অনুকূল করতে চান তেমনই একটি বাল্ক সন্নিবেশকে অনুকূল করতে পারেন ize সাধারণত, একটি সাধারণ সন্নিবেশের জন্য ক্যোয়ারী পরিকল্পনা খুব তথ্যবহুল না তাই পরিকল্পনাটি না থাকার বিষয়ে চিন্তা করবেন না। আমি একটি সন্নিবেশকে অনুকূলকরণের কয়েকটি উপায়ে এগিয়ে যাব তবে তাদের বেশিরভাগই সম্ভবত আপনি প্রশ্নটিতে নির্দিষ্ট করা সন্নিবেশটির জন্য প্রয়োগ করবেন না। তবে, ভবিষ্যতে যদি আপনাকে বড় পরিমাণে ডেটা লোড করতে হয় তবে এগুলি সহায়ক হতে পারে।
ক্লাস্টারিং কী ক্রমে ডেটা sertোকান
এসকিউএল সার্ভার একটি ক্লাস্টারড ইনডেক্স সহ একটি টেবিলের মধ্যে সন্নিবেশ করার আগে প্রায়শই ডেটা বাছাই করে। কিছু সারণী এবং অ্যাপ্লিকেশনগুলির জন্য আপনি ফ্ল্যাট ফাইলে ডেটা বাছাই করে এবং এসকিউএল সার্ভারকে এই তথ্যের ORDER
যুক্তির মাধ্যমে ডেটা সাজিয়েছেন তা জানিয়ে কর্মক্ষমতা উন্নত করতে পারেন BULK INSERT
:
অর্ডার ({কলাম [ASC | DESC]} [, ... n])
ডেটা ফাইলের ডেটা কীভাবে সাজানো হয় তা নির্দিষ্ট করে। টেবিলের ক্লাস্টারড ইনডেক্স অনুসারে যদি আমদানি করা ডেটা সাজানো হয় তবে বাল্ক আমদানি পারফরম্যান্সের উন্নতি হবে।
যেহেতু আপনি একটি IDENTITY
কলামটি ক্লাস্টার্ড কী হিসাবে ব্যবহার করছেন আপনার এই সম্পর্কে চিন্তা করার দরকার নেই।
2. TABLOCK
সম্ভব হলে ব্যবহার করুন
আপনার টেবিলের মধ্যে কেবলমাত্র একটি সেশন ডেটা tingোকানোর গ্যারান্টিযুক্ত থাকলে আপনি এর পক্ষে TABLOCK
যুক্তিটি নির্দিষ্ট করতে পারেন BULK INSERT
। এটি লক যুক্তি হ্রাস করতে পারে এবং কিছু পরিস্থিতিতে লঘুতম লগ ইন করতে পারে । তবে আপনি একটি ক্লাস্টারড ইনডেক্স সহ একটি টেবিলের মধ্যে সন্নিবেশ করছেন যা ইতিমধ্যে ডেটা রয়েছে যাতে আপনি ট্রেস পতাকা 610 ছাড়া ন্যূনতম লগিং পাবেন না যা এই উত্তরে পরে উল্লেখ করা হয়েছে।
যদি TABLOCK
সম্ভব না হয়, কারণ আপনি কোডটি পরিবর্তন করতে পারবেন না , সমস্ত আশা হারিয়ে যায় না। ব্যবহার বিবেচনা করুন sp_table_option
:
EXEC [sys].[sp_tableoption]
@TableNamePattern = N'dbo.BulkLoadTable' ,
@OptionName = 'table lock on bulk load' ,
@OptionValue = 'ON'
আর একটি বিকল্প হ'ল ট্রেস পতাকা 715 সক্ষম করা ।
৩. উপযুক্ত ব্যাচের আকার ব্যবহার করুন
কখনও কখনও আপনি ব্যাচের আকার পরিবর্তন করে সন্নিবেশগুলি টিউন করতে সক্ষম হবেন।
ROWS_PER_BATCH = সারি_প্রাপ্ত_বাচ
ডেটা ফাইলে সারিগুলির ডাটাগুলির আনুমানিক সংখ্যা নির্দেশ করে।
ডিফল্টরূপে, ডেটা ফাইলের সমস্ত ডেটা একক লেনদেন হিসাবে সার্ভারে প্রেরণ করা হয় এবং ব্যাচের সারিগুলির সংখ্যা কোয়েরি অপ্টিমাইজারের কাছে অজানা। আপনি যদি ROWS_PER_BATCH নির্দিষ্ট করে থাকেন (একটি মান> 0 সহ) বাল্ক-আমদানি ক্রিয়াকলাপটি অনুকূল করতে সার্ভার এই মানটি ব্যবহার করে। ROWS_PER_BATCH এর জন্য নির্দিষ্ট মানটি প্রায় সারিগুলির প্রকৃত সংখ্যার মতোই হওয়া উচিত। কর্মক্ষমতা বিবেচনার বিষয়ে তথ্যের জন্য, এই বিষয়ে পরে "মন্তব্যগুলি" দেখুন।
নিবন্ধটির পরবর্তীকালের উদ্ধৃতি এখানে:
যদি কোনও একক ব্যাচে পৃষ্ঠাগুলির সংখ্যা সংখ্যা অভ্যন্তরীণ প্রান্তিকের চেয়ে বেশি হয়ে যায়, ব্যাচটি যখন সরে যায় তখন কোন পৃষ্ঠাগুলি ফ্লাশ করতে হবে তা সনাক্ত করতে বাফার পুলের একটি সম্পূর্ণ স্ক্যান দেখা দিতে পারে। এই সম্পূর্ণ স্ক্যান বাল্ক-আমদানি কর্মক্ষমতা ক্ষতি করতে পারে। অভ্যন্তরীণ প্রান্তিক ছাড়িয়ে যাওয়ার সম্ভাব্য কেসটি ঘটে যখন কোনও বড় বাফার পুলটি ধীর আই / ও সাবসিস্টেমের সাথে সংযুক্ত করা হয়। বড় মেশিনগুলিতে বাফার ওভারফ্লো এড়াতে, হয় ট্যাবলোক ইঙ্গিতটি ব্যবহার করবেন না (যা বাল্ক অপ্টিমাইজেশানগুলি সরিয়ে ফেলবে) অথবা একটি ছোট ব্যাচের আকার (যা বাল্ক অপ্টিমাইজেশন সংরক্ষণ করে) ব্যবহার করবেন না।
কম্পিউটারগুলি পরিবর্তিত হওয়ার কারণে, আমরা আপনাকে সুপারিশ করি যে আপনার জন্য কী সর্বোত্তম কাজ করে তা খুঁজে বের করার জন্য আপনার ডেটা লোডের সাথে বিভিন্ন ব্যাচের মাপ পরীক্ষা করুন।
ব্যক্তিগতভাবে আমি কেবল একটি ব্যাচে সমস্ত 695 সারি সন্নিবেশ করতাম। যদিও প্রচুর ডেটা সন্নিবেশ করানোর সময় ব্যাচের আকার টিউন করা বড় পার্থক্য করতে পারে।
4. আপনার IDENTITY
কলামটি প্রয়োজন তা নিশ্চিত করুন need
আমি আপনার ডেটা মডেল বা প্রয়োজনীয়তা সম্পর্কে কিছুই জানি না, তবে IDENTITY
প্রতিটি টেবিলে একটি কলাম যুক্ত করার ফাঁদে পড়ি না । হারুন বারট্রান্ডের এই সম্পর্কে একটি নিবন্ধ আছে যা বলা হয় খারাপ অভ্যাসগুলি লাথি মারার: প্রতিটি টেবিলে একটি পরিচয় কলাম স্থাপন করা । পরিষ্কার হয়ে উঠতে, আমি বলছি না যে আপনার IDENTITY
এই টেবিল থেকে কলামটি সরিয়ে দেওয়া উচিত । তবে, আপনি যদি নির্ধারণ করেন যে IDENTITY
কলামটি প্রয়োজনীয় নয় এবং এটি সরিয়ে ফেলুন যা সন্নিবেশ করানোর কার্যকারিতা উন্নত করতে পারে।
5. সূচী বা সীমাবদ্ধতা অক্ষম করুন
যদি আপনি ইতিমধ্যে যা আছে তার তুলনায় যদি আপনি একটি টেবিলের মধ্যে প্রচুর পরিমাণে ডেটা লোড করছেন তবে লোডের আগে সূচিপত্র বা সীমাবদ্ধতাগুলি অক্ষম করা এবং লোডের পরে এগুলি সক্ষম করার জন্য এটি আরও দ্রুত হতে পারে। বিপুল পরিমাণে ডেটা সারণীতে ডাটা লোড হওয়ার পরিবর্তে এসকিউএল সার্ভারের জন্য একবারে একটি সূচক তৈরি করা সাধারণত আরও অদক্ষ। দেখে মনে হচ্ছে আপনি 11500 টি সারি দিয়ে একটি টেবিলের মধ্যে 695 টি সারি .োকানো হয়েছে, সুতরাং আমি এই কৌশলটি সুপারিশ করব না।
6. টিএফ 610 বিবেচনা করুন
ট্রেস ফ্ল্যাগ 610 কিছু অতিরিক্ত পরিস্থিতিতে ন্যূনতম লগিংয়ের অনুমতি দেয়। একটি IDENTITY
ক্লাস্টার্ড কী সহ আপনার টেবিলের জন্য , আপনার পুনরুদ্ধারের মডেল যতক্ষণ না সহজ বা বাল্ক-লগড থাকে ততক্ষণ আপনি কোনও নতুন ডেটা পৃষ্ঠাগুলির জন্য ন্যূনতম লগিং পাবেন। আমি বিশ্বাস করি যে এই বৈশিষ্ট্যটি ডিফল্ট হিসাবে নেই কারণ এটি কিছু সিস্টেমে কর্মক্ষমতা হ্রাস করতে পারে। এই ট্রেস পতাকাটি সক্ষম করার আগে আপনার সাবধানে পরীক্ষা করা দরকার। প্রস্তাবিত মাইক্রোসফ্ট রেফারেন্সটি এখনও ডেটা লোডিং পারফরম্যান্স গাইড হিসাবে উপস্থিত রয়েছে
ট্রেস পতাকা 610 এর আওতায় ন্যূনতম লগিংয়ের I / O প্রভাব
আপনি যখন একটি বাল্ক লোড লেনদেন করেন যা সর্বনিম্ন লগ হয়েছিল, তখন কমিট কমপ্লিট হওয়ার আগে লোড হওয়া সমস্ত পৃষ্ঠাতে অবশ্যই ডিস্কে ফ্লাশ করা উচিত। আগের চেকপয়েন্ট অপারেশনে ধরা পড়ে না এমন কোনও ফ্লাশ পেজগুলি এলোমেলো I / O এর প্রচুর পরিমাণে তৈরি করতে পারে। এটি সম্পূর্ণরূপে লগ করা অপারেশনের সাথে বৈসাদৃশ্য করুন, যা পরিবর্তে লগতে ক্রমযুক্ত I / O তৈরি করে এবং বোঝার সময় পৃষ্ঠাতে ডিস্কে ফ্লাশ করার প্রয়োজন হয় না।
আপনার লোডের দৃশ্য যদি বিটিআরগুলিতে চেকপয়েন্টের সীমানা অতিক্রম করে না এবং আপনার কাছে একটি ধীর আই / ও সিস্টেম থাকে তবে ন্যূনতম লগিং ব্যবহার করা সন্নিবেশের গতি কমিয়ে দিতে পারে।
যতদূর আমি বলতে পারি এটির ট্রেস পতাকা 610 এর সাথে কোনও সম্পর্ক নেই, বরং স্বল্পতম লগিংয়ের সাথে। আমি বিশ্বাস করি যে সুরের বিষয়ে পূর্ববর্তী উক্তিটি ROWS_PER_BATCH
একই ধারণাটি পেয়েছিল।
উপসংহারে, আপনার টিউন করতে আপনি যা করতে পারেন তা সম্ভবত নেই BULK INSERT
। আপনি আপনার সন্নিবেশের সাথে যে পর্যবেক্ষণটি পর্যবেক্ষণ করেছেন তা সম্পর্কে আমি উদ্বিগ্ন হব না। এসকিউএল সার্ভার যে কোনও সময় আপনি ডেটা সন্নিবেশ করানোর প্রতিবেদন করবে। নিম্নলিখিত খুব সহজ বিবেচনা করুন INSERT
:
DROP TABLE IF EXISTS X_TABLE;
CREATE TABLE X_TABLE (
VAL VARCHAR(1000) NOT NULL
);
SET STATISTICS IO, TIME ON;
INSERT INTO X_TABLE WITH (TABLOCK)
SELECT REPLICATE('Z', 1000)
FROM dbo.GetNums(10000); -- generate 10000 rows
থেকে আউটপুট SET STATISTICS IO, TIME ON
:
সারণি 'X_TABLE'। স্ক্যান গণনা 0, যৌক্তিক পাঠ 11428
আমার কাছে 11428 টি পড়ার রিপোর্ট রয়েছে তবে তা কার্যক্ষম তথ্য নয়। কখনও কখনও রিপোর্ট করা পাঠের সংখ্যা ন্যূনতম লগিংয়ের মাধ্যমে হ্রাস করা যায়, তবে অবশ্যই পার্থক্যটি পারফরম্যান্স লাভে সরাসরি অনুবাদ করা যায় না।