একজন কীভাবে একটি বাল্ক ইনসার্ট স্টেটমেন্টের কার্যকারিতা তদন্ত করে?


12

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

যদি আমি পুরোপুরি জটিল কিছু দেখতে পাই (ওআরএম সতর্কতার সাথে লিখিত না হয়ে বরং সাধারণ লিনকিউ বিবৃতি থেকেও ভয়ঙ্কর প্রশ্ন উত্পন্ন করতে পারে) এবং / বা ভারী (সময়কাল, সিপিইউ, পৃষ্ঠাটি পড়ছে), আমি এটিকে এসএমএসে নিয়েছি এবং এর সম্পাদন পরিকল্পনাটি যাচাই করি।

এটি আমার ডাটাবেস জ্ঞানের স্তরের জন্য দুর্দান্ত কাজ করে। তবে, বাল্ক ইনসার্টটি একটি বিশেষ প্রাণী বলে মনে হচ্ছে , কারণ এটি কোনও শপ্পলান উত্পাদন করে বলে মনে হচ্ছে না

আমি একটি খুব সাধারণ উদাহরণ চিত্রিত করার চেষ্টা করব:

ছক সংজ্ঞা

CREATE TABLE dbo.ImportingSystemFileLoadInfo
(
    ImportingSystemFileLoadInfoId INT NOT NULL IDENTITY(1, 1) CONSTRAINT PK_ImportingSystemFileLoadInfo PRIMARY KEY CLUSTERED,
    EnvironmentId INT NOT NULL CONSTRAINT FK_ImportingSystemFileLoadInfo REFERENCES dbo.Environment,
    ImportingSystemId INT NOT NULL CONSTRAINT FK_ImportingSystemFileLoadInfo_ImportingSystem REFERENCES dbo.ImportingSystem,
    FileName NVARCHAR(64) NOT NULL,
FileImportTime DATETIME2 NOT NULL,
    CONSTRAINT UQ_ImportingSystemImportInfo_EnvXIs_TableName UNIQUE (EnvironmentId, ImportingSystemId, FileName, FileImportTime)
)

দ্রষ্টব্য: অন্য কোনও সূচী টেবিলে সংজ্ঞায়িত করা হয়নি

বাল্ক সন্নিবেশ (আমি প্রোফাইলারে যা ধরি, কেবল একটি ব্যাচ)

insert bulk [dbo].[ImportingSystemFileLoadInfo] ([EnvironmentId] Int, [ImportingSystemId] Int, [FileName] NVarChar(64) COLLATE Latin1_General_CI_AS, [FileImportTime] DateTime2(7))

ছন্দোবিজ্ঞান

  • 695 আইটেম inোকানো হয়েছে
  • সিপিইউ = 31
  • পঠন = 4271
  • লিখেছেন = 24
  • সময়কাল = 154
  • মোট টেবিল গণনা = 11500

আমার অ্যাপ্লিকেশনটির জন্য, এটি ঠিক আছে, যদিও পাঠকগুলি বড় আকারের বলে মনে হচ্ছে (এসকিউএল সার্ভার ইন্টার্নালগুলি সম্পর্কে আমি খুব কমই জানি, তাই আমি 8 কে পৃষ্ঠার আকার এবং আমার কাছে থাকা ছোট রেকর্ড তথ্যের সাথে তুলনা করছি)

প্রশ্ন: এই বাল্ক ইনসার্টটি যদি অনুকূলিত করা যায় তবে আমি কীভাবে তদন্ত করব? বা এটি কোনও অর্থবোধ করে না, যেহেতু এটি ক্লায়েন্টের অ্যাপ্লিকেশন থেকে এসকিউএল সার্ভারে বৃহত ডেটা ধাক্কা দেওয়ার পক্ষে যুক্তিযুক্ততমতমতম উপায়?

উত্তর:


14

আমি যতদূর বলতে পারি যে আপনি একটি নিয়মিত সন্নিবেশটিকে অনুকূল করতে চান তেমনই একটি বাল্ক সন্নিবেশকে অনুকূল করতে পারেন 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 টি পড়ার রিপোর্ট রয়েছে তবে তা কার্যক্ষম তথ্য নয়। কখনও কখনও রিপোর্ট করা পাঠের সংখ্যা ন্যূনতম লগিংয়ের মাধ্যমে হ্রাস করা যায়, তবে অবশ্যই পার্থক্যটি পারফরম্যান্স লাভে সরাসরি অনুবাদ করা যায় না।


12

আমি কৌশলগুলির জ্ঞান ভিত্তি তৈরি করার সাথে সাথে এই উত্তরটি ধারাবাহিকভাবে আপডেট করার অভিপ্রায় নিয়ে এই প্রশ্নের উত্তর দেওয়া শুরু করব। আশা করি অন্যরাও এটিকে ঘিরে আসবে এবং প্রক্রিয়াটিতে আমার নিজস্ব জ্ঞান উন্নত করতে আমাকে সহায়তা করবে।

  1. অন্ত্রে চেক করুন: আপনার ফায়ারওয়াল কি রাষ্ট্রীয়, গভীর প্যাকেট পরিদর্শন করছে? আপনি এই সম্পর্কে ইন্টারনেটে তেমন কিছু পাবেন না, তবে আপনার বাল্ক সন্নিবেশগুলি যদি হওয়া উচিত তার চেয়ে প্রায় 10x ধীর হয়ে যায়, তবে আপনার "জেনেরিক এসকিউএল ইনজেকশন প্রতিরোধের" স্তর 3-7 ডিপ প্যাকেট পরিদর্শন করার জন্য কোনও সুরক্ষার সরঞ্জাম রয়েছে বলে সম্ভাবনা রয়েছে chan "।

  2. প্রতি ব্যাচে বাইটে, বাল্ক সন্নিবেশ করানোর পরিকল্পনা করছেন এমন ডেটার আকার পরিমাপ করুন। এবং আপনি কোনও এলওবি ডেটা সংরক্ষণ করছেন কিনা তা পরীক্ষা করুন, কারণ এটি একটি পৃথক পৃষ্ঠা আনয়ন এবং লেখার ক্রিয়া।

    আপনার এভাবে কেন করা উচিত তার বেশ কয়েকটি কারণ:

    ক। এডাব্লুএসে, ইলাস্টিক ব্লক স্টোরেজ আইওপিএসগুলি সারিগুলিতে নয়, বাইটে বিভক্ত হয়ে যায়।

    1. দেখুন Linux ইনস্ট্যান্সের »ইনপুট / আউটপুট বৈশিষ্ট্যের উপর আমাজন EBS ভলিউম পারফরমেন্স এবং মনিটরিং কি একটি EBS IOPS একক একটি ব্যাখ্যা জন্য
    2. বিশেষত, জেনারেল পারপেজ এসএসডি (জিপি 2) খণ্ডে "আই / ও ক্রেডিটস এবং ব্রস্ট পারফরম্যান্স" ধারণা রয়েছে এবং ভারী ইটিএল প্রসেসিংয়ের জন্য বার্স্ট ব্যালেন্সের ক্রেডিট হ্রাস করা সাধারণ। আপনার বিস্ফোরণ সময়কালটি এসকিউএল সার্ভার সারিগুলিতে নয়, বাইটে পরিমাপ করা হয় :)

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

    SELECT *
    FROM 
    sys.dm_db_index_physical_stats(DB_ID(),OBJECT_ID(N'YourTable'), NULL, NULL, 'DETAILED')

    গড়_রেকার্ড_সাইজ_ইন_বাইটস এবং পৃষ্ঠা_কাউন্টগুলিতে মনোযোগ দিন।

    গ। যেমন পল হোয়াইট https://sqlperformance.com/2019/05/sql-performance/minimal-logging-insert-select-heap- এ ব্যাখ্যা করেছেন , "কমপক্ষে লগিং সক্ষম করতে INSERT...SELECT, এসকিউএল সার্ভারকে মোট আকার সহ 250 টিরও বেশি সারি আশা করতে হবে কমপক্ষে একটি মাত্রার (8 পৃষ্ঠাগুলি) "

  3. আপনার যদি চেক সীমাবদ্ধতা, বা অনন্য বাধা সহ কোনও সূচক থাকে তবে আপনার বাল্ক সন্নিবেশটিতে কোনও পড়ার ক্রিয়াকলাপ রয়েছে কিনা তা তথ্য ক্যাপচার করতে SET STATISTICS IO ONএবং SET STATISTICS TIME ON(বা এসকিউএল সার্ভার প্রোফাইলার বা এসকিউএল সার্ভার বর্ধিত ইভেন্ট) ব্যবহার করুন। রিড অপারেশনগুলি এসকিউএল সার্ভার ডেটাবেস ইঞ্জিনের কারণে অখণ্ডতার সীমাবদ্ধতাগুলি নিশ্চিত হয়ে যায় making

  4. একটি পরীক্ষামূলক ডাটাবেস তৈরি করার চেষ্টা করুন যেখানে PRIMARYFILEGROUP র‌্যাম ড্রাইভে মাউন্ট করা আছে। এটি এসএসডি এর চেয়ে কিছুটা দ্রুত হওয়া উচিত তবে আপনার রেড কন্ট্রোলার ওভারহেড যুক্ত করতে পারে কিনা তা কোনও প্রশ্নই দূর করতে পারে। 2018 এ এটি হওয়া উচিত নয়, তবে এর মতো একাধিক ডিফারেনশিয়াল বেসলাইন তৈরি করে আপনার হার্ডওয়্যারটি কত ওভারহেড যুক্ত করছে তার জন্য আপনি একটি সাধারণ ধারণা পেতে পারেন।

  5. সোর্স ফাইলটি একটি র‌্যাম ড্রাইভেও রাখুন।

    যদি আপনি একই ড্রাইভ থেকে আপনার ডাটাবেস সার্ভারের ফাইলগ্রুপ চালু থাকে তবে উত্স ফাইলটি পড়লে কোনও র‌্যাম ড্রাইভে সোর্স ফাইলটি রেখে দেওয়া কোনও বিতর্কিত সমস্যা থেকে বেরিয়ে আসবে।

  6. আপনি 64KB এক্সটেন্টস ব্যবহার করে আপনার হার্ড ড্রাইভ ফর্ম্যাট করেছেন তা যাচাই করুন।

  7. ইউজারবেঞ্চমার্ক.কম ব্যবহার করুন এবং আপনার এসএসডি বেঞ্চমার্ক করুন। এটা হবে:

    1. ডিভাইস থেকে কী পারফরম্যান্স আশা করা যায় সে সম্পর্কে অন্যান্য কর্মক্ষমতা আফিকানোডোগুলিতে আরও জ্ঞান যুক্ত করুন
    2. আপনার ড্রাইভের পারফরম্যান্স একই সঠিক ড্রাইভের সহকর্মীগুলির সাথে কম-সম্পাদন করছে কিনা তা নির্ধারণ করতে আপনাকে সহায়তা করুন
    3. আপনার ড্রাইভের পারফরম্যান্স একই বিভাগে অন্য ড্রাইভগুলি (এসএসডি, এইচডিডি ইত্যাদি) এর অধীনে সম্পাদন করে কিনা তা নির্ধারণ করতে আপনাকে সহায়তা করুন SS
  8. আপনি যদি সত্তা ফ্রেমওয়ার্ক এক্সটেনশনের মাধ্যমে সি # থেকে "ইনসার্ট বাল্ক" কল করছেন, তবে নিশ্চিত হয়ে নিন যে আপনি প্রথম জেআইটিকে "উষ্ণ" করলেন এবং প্রথম কয়েকটি ফলাফল "ফেলে দেবেন" make

  9. আপনার প্রোগ্রামটির জন্য পারফরম্যান্স কাউন্টার তৈরি করার চেষ্টা করুন। .NET এর মাধ্যমে, আপনি বেঞ্চমার্ক.এনইটি ব্যবহার করতে পারেন এবং এটি স্বয়ংক্রিয়ভাবে একগুচ্ছ বেসিক মেট্রিকগুলি প্রোফাইল করবে। তারপরে আপনি ওপেন সোর্স সম্প্রদায়ের সাথে আপনার প্রোফাইলের প্রচেষ্টাগুলি ভাগ করে নিতে পারেন এবং দেখতে পান যে বিভিন্ন হার্ডওয়্যার চালিত লোকেরা একই ম্যাট্রিকগুলি প্রতিবেদন করে (যেমন তুলনা করার জন্য ইউজারব্যান্ডমার্ক.কম ব্যবহার করার বিষয়ে আমার আগের বিষয়টি থেকে)।

  10. নামী পাইপ ব্যবহার করে এটিকে লোকালহোস্ট হিসাবে চালানোর চেষ্টা করুন।

  11. আপনি যদি এসকিউএল সার্ভারকে লক্ষ্য করে এবং। নেট কোর ব্যবহার করে থাকেন তবে এসকিউএল সার্ভার এসটিডি সংস্করণ দিয়ে একটি লিনাক্স কাটানো বিবেচনা করুন - এমনকি গুরুতর হার্ডওয়্যারের জন্যও প্রতি ঘন্টা ডলারেরও কম খরচ হয়। ভিন্ন ওএসের সাথে একই হার্ডওয়্যারের সাথে একই কোডটি চেষ্টা করার বড় সুবিধাটি ওএস কার্নেলের টিসিপি / আইপি স্ট্যাকের কারণে সমস্যা তৈরি হচ্ছে কিনা তা দেখুন।

  12. আপনার ডাটাবেস টেবিলের ফাইলগ্রুপ সংরক্ষণ করে ড্রাইভের জন্য ড্রাইভের বিলম্বতা পরিমাপ করতে গ্লেন ব্যারির এসকিউএল সার্ভার ডায়াগনস্টিক প্রশ্নগুলি ব্যবহার করুন।

    ক। আপনার পরীক্ষার আগে এবং আপনার পরীক্ষার পরে পরিমাপ করার বিষয়টি নিশ্চিত করুন। "আপনার পরীক্ষার আগে" কেবল আপনাকে জানায় যে আপনি বেসলাইন হিসাবে ভয়াবহ আইও বৈশিষ্ট্য পেয়েছেন কিনা।

    খ। "আপনার পরীক্ষার সময়" পরিমাপ করার জন্য, আপনাকে পারফামন পারফরম্যান্স কাউন্টারগুলি ব্যবহার করতে হবে।

    কেন? কারণ বেশিরভাগ ডাটাবেস সার্ভারের কোনও ধরণের নেটওয়ার্ক সংযুক্ত স্টোরেজ (এনএএস) ব্যবহার করা হয়। মেঘে, এডাব্লুএসে, ইলাস্টিক ব্লক স্টোরেজ ঠিক তেমন। আপনি আপনার EBS ভলিউম / এনএএস সমাধানের আইওপিএস দ্বারা আবদ্ধ হতে পারেন।

  13. অপেক্ষার পরিসংখ্যান পরিমাপ করতে কিছু সরঞ্জাম ব্যবহার করুন। রেড গেট এসকিউএল মনিটর , সোলারওয়াইন্ডস ডাটাবেস পারফরম্যান্স অ্যানালাইজার, বা গ্লেন ব্যারির এসকিউএল সার্ভার ডায়াগনস্টিক ক্যোয়ারী বা পল রান্ডালের ওয়েট স্ট্যাটিস্টিকস কোয়েরি

    ক। সর্বাধিক প্রচলিত অপেক্ষার প্রকারগুলি সম্ভবত মেমোরি / সিপিইউ, রাইটেলওগ, পেজআইওল্যাটাক_এক্স এবং এএসআইএনসি_নেট ওয়ার্ক_আইও হবে

    খ। আপনি যদি উপলভ্যতা গোষ্ঠীগুলি চালাচ্ছেন তবে আপনাকে অতিরিক্ত অপেক্ষা করার প্রবণতা থাকতে পারে।

  14. অক্ষম INSERT BULKসহ একাধিক, একযোগে কমান্ডগুলির প্রভাব পরিমাপ করুন TABLOCK(ট্যাব্লক সম্ভবত ইনসার্ট বাল্ক কমান্ডের সিরিয়ালাইজেশনকে বাধ্য করবে)। আপনার বাধা শেষ হওয়ার অপেক্ষায় থাকতে পারে INSERT BULK; আপনার ডাটাবেস সার্ভারের দৈহিক ডেটা মডেল যেভাবে পরিচালনা করতে পারে আপনার এগুলি যতগুলি কাজ সারি করার চেষ্টা করা উচিত।

  15. আপনার টেবিল বিভাজন বিবেচনা করুন। একটি বিশেষ উদাহরণ হিসাবে: যদি আপনার ডাটাবেস টেবিলটি কেবলমাত্র FILEGROUPপরিশিষ্ট হয়, তবে অ্যান্ড্রু নভিক একটি "আজ" তৈরি করার এবং কমপক্ষে দুটি ফাইলগ্রুপ, টুডে এবং বেফোরএফএসডিএতে বিভক্ত করার পরামর্শ দিয়েছেন। এইভাবে, যদি আপনার INSERT BULKডেটা কেবলমাত্র আজকের ডেটা হয় তবে আপনি সমস্ত সন্নিবেশকে একটিতে আঘাত করতে বাধ্য করতে একটি ক্রিয়েটঅন ফিল্ডে ফিল্টার করতে পারেন FILEGROUPএবং ব্যবহারের সময় ব্লকিং হ্রাস করতে পারেন TABLOCK। এই কৌশলটি আরও একটি মাইক্রোসফ্ট হুইটপেপারে আরও বিশদে বর্ণনা করা হয়েছে: এসকিউএল সার্ভার 2008 ব্যবহার করে পার্টিশনযুক্ত টেবিল এবং সূচক কৌশলসমূহ

  16. আপনি যদি TABLOCKকলাম স্টোর সূচী ব্যবহার করছেন, বন্ধ করুন এবং 102,400 সারি ব্যাচের আকারে ডেটা লোড করুন। তারপরে আপনি আপনার সমস্ত ডেটা সমান্তরালভাবে সরাসরি কলামস্টোর রো-গ্রুপগুলিতে লোড করতে পারেন। এই পরামর্শটি (এবং নথিভুক্ত যুক্তিযুক্ত) মাইক্রোসফ্টের কলামস্টোর সূচী থেকে এসেছে - ডেটা লোডিং গাইডেন্স :

    বাল্ক লোডিংয়ের এই বিল্ট-ইন পারফরম্যান্স অপটিমাইজেশন রয়েছে:

    সমান্তরাল লোড: আপনার একাধিক সমকালীন বাল্ক লোড (বিসিপি বা বাল্ক সন্নিবেশ) থাকতে পারে যা প্রতিটি পৃথক ডেটা ফাইল লোড করে। এসকিউএল সার্ভারে রোস্টস্টোর বাল্ক লোডের বিপরীতে, আপনাকে নির্দিষ্ট করার দরকার নেই TABLOCKকারণ প্রতিটি বাল্ক আমদানি থ্রেড একচেটিয়াভাবে লকযুক্ত একটি পৃথক রো-গ্রুপ (সংকীর্ণ বা ডেল্টা রাউগ্রুপ) এ ডেটা একচেটিয়াভাবে লোড করবে। ব্যবহারটি TABLOCKটেবিলে একচেটিয়া লককে বাধ্য করবে এবং আপনি সমান্তরালে ডেটা আমদানি করতে পারবেন না।

    সর্বনিম্ন লগিং:একটি বাল্ক লোড ডেটাতে সর্বনিম্ন লগিং ব্যবহার করে যা সংকুচিত রাউগ্রুপগুলিতে সরাসরি যায়। একটি ডেল্টা রাউগ্রুপে যে কোনও ডেটা যায় সম্পূর্ণরূপে লগড। এটিতে কোনও ব্যাচের মাপ রয়েছে যা 102,400 সারি থেকে কম। যাইহোক, বাল্ক লোডিংয়ের সাথে লক্ষ্যটি হ'ল বেশিরভাগ ডেটা ডেল্টা রাউগ্রুপগুলিকে বাইপাস করে।

    লকিং অপ্টিমাইজেশন: সংকুচিত রো-গ্রুপে লোড করার সময়, সারিগ্রুপে থাকা এক্স লকটি অর্জিত হয়। যাইহোক, যখন বেল্ট ডেল্টা রাউগ্রুপে লোড হচ্ছে, তখন একটি এক্স লকটি রোউগ্রুপে অর্জিত হয় তবে এসকিউএল সার্ভার এখনও লকগুলি লজ করে রাখে পৃষ্ঠাগুলি / এক্সটেন্ট কারণ এক্স রাউগ্রুপ লক লকিংয়ের অংশ নয় part

  17. এসকিউএল সার্ভার ২০১ 2016 অনুসারে, ইনডেক্সড টেবিলটিতে ন্যূনতম লগিংয়ের জন্য আর ট্রেস ফ্ল্যাগ 610 সক্ষম করার দরকার নেই । মাইক্রোসফ্ট ইঞ্জিনিয়ার পরক্ষিত সাবজানি ( জোর খনি ) এর উদ্ধৃতি :

    এসকিউএল সার্ভার ২০১ 2016 এর অন্যতম নকশা লক্ষ্য ছিল গ্রাহকদের জন্য কোনও নোবস বা ট্রেস ফ্ল্যাগের প্রয়োজন ছাড়াই দ্রুত চালনা করার জন্য বাক্সের বাইরে থেকে ইঞ্জিনটির কর্মক্ষমতা এবং স্কেলাবিলিটি উন্নত করা। এই উন্নতিগুলির অংশ হিসাবে, এসকিউএল সার্ভার ইঞ্জিন কোডে করা একটি উন্নতি বাল্ক লোড প্রসঙ্গে (দ্রুত সন্নিবেশকারী বা দ্রুত লোড প্রসঙ্গ হিসাবেও পরিচিত) চালু করা হয়েছিল এবং সাধারণ বা ডাব্লু ডাটাবেসে বাল্ক লোড ক্রিয়াকলাপ সম্পাদন করার সময় ডিফল্টরূপে ন্যূনতম লগিং করা হয়েছিল was বাল্ক লগ রিকভারি মডেল। আপনি যদি ন্যূনতম লগিংয়ের সাথে পরিচিত না হন তবে আমি সুনীল অগ্রওয়ালের এই ব্লগ পোস্টটি পড়ার জন্য সুপারিশ করব যেখানে তিনি এসকিউএল সার্ভারে ন্যূনতম লগিং কীভাবে কাজ করে তা বর্ণনা করেছেন। বাল্ক সন্নিবেশগুলি ন্যূনতমভাবে লগ ইন করার জন্য, এটি এখানে পূর্ববর্তী-প্রয়োজনীয় শর্তাদি পূরণ করতে হবে যা এখানে নথিভুক্ত রয়েছে।

    এসকিউএল সার্ভার ২০১ 2016-এ এই বর্ধনের অংশ হিসাবে, আপনাকে সূচীকরণ সারণিতে নূন্যতম লগিংয়ের জন্য আর ট্রেস ফ্ল্যাগ 610 সক্ষম করতে হবে নাএবং এটি ইতিহাসের অংশ হয়ে উঠার জন্য অন্যান্য কয়েকটি ট্রেস পতাকা (1118, 1117, 1236, 8048) এর সাথে যোগ দেয়। এসকিউএল সার্ভার ২০১ 2016-এ, যখন বাল্ক লোড অপারেশন কোনও নতুন পৃষ্ঠা বরাদ্দের কারণ ঘটায়, সেক্ষেত্রে সেই নতুন পৃষ্ঠাটি ক্রমানুসারে পূরণ করা সমস্ত সারি নূন্যতম লগ হয় যদি পূর্বে আলোচিত ন্যূনতম লগিংয়ের জন্য অন্য সমস্ত প্রাক-প্রয়োজনীয়তা পূরণ হয়। সূচী ক্রম বজায় রাখতে সজ্জিত বিদ্যমান পৃষ্ঠাগুলিতে (নতুন পৃষ্ঠার বরাদ্দ নেই) stillোকানো সারিগুলি এখনও সম্পূর্ণরূপে লগইন করা হয়, লোডের সময় পৃষ্ঠা বিভাজনের ফলে সারিগুলি সরিয়ে নেওয়া হয়। বরাদ্দকালে পৃষ্ঠাগুলি লকগুলি অর্জিত হওয়ায় এবং কেবলমাত্র পৃষ্ঠা বা ব্যাপ্তি বরাদ্দগুলি লগড হওয়ার জন্য ন্যূনতম লগিং অপারেশনের জন্য সূচিগুলির জন্য (যা ডিফল্ট অনুসারে চালু থাকে) জন্য ALLOW_PAGE_LOCKS চালু করাও গুরুত্বপূর্ণ is

  18. আপনি যদি সি # বা সত্ত্বা ফ্রেমওয়ার্ক.এক্সটেনশনগুলিতে স্কেলবুল্ককপি ব্যবহার করছেন q আপনি কি রিলিজ মোডে আপনার পরীক্ষা চালাচ্ছেন? টার্গেট আর্কিটেকচারটি কোনও সিপিইউ / x64 / x86 এ সেট করা আছে?

  19. ইনসার্ট বাল্কের লেনদেন সাসপেন্ডড আছে কিনা তা দেখতে sp_Wo2 ব্যবহার করার বিষয়টি বিবেচনা করুন। এটি সরবরাহ করা যেতে পারে কারণ এটি অন্য স্পাইড দ্বারা অবরুদ্ধ। কীভাবে এসকিউএল সার্ভার ব্লকিং হ্রাস করবেন তা পড়ার বিষয়ে বিবেচনা করুন । আপনি অ্যাডাম মাচানিকের এসপি_হোআইএসএটিভিও ব্যবহার করতে পারেন তবে এসপি_হো 2 আপনাকে আপনার প্রয়োজনীয় প্রাথমিক তথ্য দেবে give

  20. আপনার কেবলমাত্র ডিস্কের আই / ও থাকতে পারে। যদি আপনি একটি বাল্ক সন্নিবেশ করান এবং আপনার ডিস্কের ব্যবহারটি 100% টির উপরে না পৌঁছে এবং প্রায় 2% এ আটকে থাকে তবে আপনার সম্ভবত খারাপ ফার্মওয়্যার, বা ত্রুটিযুক্ত I / O ডিভাইস রয়েছে। (এটি আমার এক সহকর্মীর সাথে ঘটেছিল hardware) হার্ডওয়্যার পারফরম্যান্সের জন্য অন্যদের সাথে তুলনা করার জন্য [এসএসডি ইউজারব্যাঞ্চমার্ক] ব্যবহার করুন, বিশেষত যদি আপনি নিজের স্থানীয় ডেভ মেশিনে আস্তে প্রতিলিপি করতে পারেন। (আমি এটিকে তালিকায় শেষ করে দিয়েছি কারণ বেশিরভাগ সংস্থাগুলি আইপি ঝুঁকির কারণে বিকাশকারীদের তাদের স্থানীয় মেশিনে ডাটাবেস চালাতে দেয় না))

  21. যদি আপনার টেবিলটি সংক্ষেপণ ব্যবহার করে তবে আপনি একাধিক সেশন চালানোর চেষ্টা করতে পারেন এবং প্রতিটি সেশনে বিদ্যমান লেনদেন ব্যবহার করে শুরু করতে পারেন এবং এটি এসকিএলবুলকপি কমান্ডের আগে চালাতে পারেন:

    ALL সার্ভার কনফিগারেশন সেট প্রসেস অফফিনিটি সিপিইউ = অটো;

  22. অবিচ্ছিন্ন লোডিংয়ের জন্য, ধারণাগুলির একটি স্ট্রিম, প্রথমে মাইক্রোসফ্টের হুইটপেপারে বিভক্ত , পার্টিশনযুক্ত টেবিল এবং এসকিউএল সার্ভার ২০০৮ ব্যবহার করে সূচক কৌশলগুলি :

    অবিচ্ছিন্ন লোড হচ্ছে

    কোনও ওলটিপি দৃশ্যে, নতুন ডেটা অবিচ্ছিন্নভাবে আসতে পারে। যদি ব্যবহারকারীরাও নতুন পার্টিশনটি জিজ্ঞাসা করে থাকে, অবিচ্ছিন্নভাবে তথ্য সন্নিবেশ করানো ব্লক করতে পারে: ব্যবহারকারী অনুসন্ধানগুলি সন্নিবেশগুলিকে ব্লক করতে পারে এবং একইভাবে, সন্নিবেশকারীরা ব্যবহারকারী অনুসন্ধানগুলিকে ব্লক করতে পারে।

    লোডিং টেবিল বা পার্টিশনের বিষয়ে বিরোধ স্ন্যাপশট বিচ্ছিন্নতা particular বিশেষত READ COMMITTED SNAPSHOTবিচ্ছিন্নতা স্তর ব্যবহার করে হ্রাস করা যেতে পারে । READ COMMITTED SNAPSHOTবিচ্ছিন্নকরণের অধীনে , কোনও টেবিলের মধ্যে সন্নিবেশ করানো টেম্পটিডিবি সংস্করণ স্টোরটিতে ক্রিয়াকলাপ সৃষ্টি করে না , সুতরাং টেম্পডিবি ওভারহেড সন্নিবেশকারীদের জন্য ন্যূনতম, তবে একই পার্টিশনে ব্যবহারকারী অনুসন্ধানের দ্বারা কোনও ভাগ করা লক নেওয়া হবে না।

    অন্যান্য ক্ষেত্রে, যখন উচ্চতর হারে অবিচ্ছিন্নভাবে একটি পার্টিশনযুক্ত টেবিলের মধ্যে ডেটা isোকানো হচ্ছে, আপনি এখনও স্টেজিং টেবিলগুলিতে অল্প সময়ের জন্য ডেটা স্টেজ করতে সক্ষম হতে পারেন এবং তারপরে উইন্ডো না হওয়া পর্যন্ত বারবার সর্বাধিক পার্টিশনে সেই তথ্যটি সন্নিবেশ করতে সক্ষম হবেন বর্তমান পার্টিশনটি পাস করে এবং পরবর্তী পার্টিশনে ডেটা .োকানো হয়। উদাহরণস্বরূপ, ধরুন আপনার কাছে দুটি স্টেজিং টেবিল রয়েছে যা বৈকল্পিক ভিত্তিতে প্রতি সেকেন্ডে 30 সেকেন্ডের মূল্যবান ডেটা প্রাপ্ত করে: এক মিনিটের প্রথমার্ধের জন্য একটি টেবিল, এক মিনিটের দ্বিতীয়ার্ধের জন্য দ্বিতীয় টেবিল। একটি সন্নিবেশিত সঞ্চিত পদ্ধতি নির্ধারণ করে যে বর্তমান সন্নিবেশ কোন মিনিটের অর্ধেক হবে এবং তারপরে এটি প্রথম মঞ্চের সারণিতে প্রবেশ করিয়ে দেয়। যখন 30 সেকেন্ড শেষ হয়, সন্নিবেশ পদ্ধতিটি এটি নির্ধারণ করে যে এটি অবশ্যই দ্বিতীয় মঞ্চের টেবিলে sertোকাতে হবে। অন্য একটি সঞ্চিত পদ্ধতি তারপরে প্রথম স্টেজিং টেবিল থেকে ডেটাটি সারণীর সর্বাধিক নতুন পার্টিশনে লোড করে এবং তারপরে এটি প্রথম স্টেজিং টেবিলটি কেটে দেয়। অন্য 30 সেকেন্ডের পরে, একই সঞ্চিত প্রক্রিয়াটি দ্বিতীয় সঞ্চিত প্রক্রিয়া থেকে ডেটা সন্নিবেশ করায় এবং বর্তমান পার্টিশনে রাখে এবং তারপরে এটি দ্বিতীয় স্টেজিং টেবিলটি ছিন্ন করে।

  23. মাইক্রোসফ্ট ক্যাট টিমের ডেটা লোডিং পারফরম্যান্স গাইড

  24. আপনার পরিসংখ্যান আপ টু ডেট রয়েছে তা নিশ্চিত করুন। প্রতিটি সূচি তৈরির পরে আপনি যদি পারেন তবে ফুলস্ক্যান ব্যবহার করুন।

  25. এসকিউআইওর সাথে সান পারফরম্যান্স টিউনিং এবং এটিও নিশ্চিত করুন যে আপনি যদি ডিস্কের পার্টিশনগুলি প্রান্তিক করে রেখেছেন এমন কোনও যান্ত্রিক ডিস্ক ব্যবহার করছেন। মাইক্রোসফ্টের ডিস্ক পার্টিশন অ্যালাইনমেন্টের সেরা অভ্যাসগুলি দেখুন

  26. COLUMNSTORE INSERT/ UPDATEকর্মক্ষমতা


2

পাঠগুলি সন্নিবেশ করার সময় অনন্য ও এফ কে বাধাগুলি যাচাই করা হতে পারে - আপনি যদি সন্নিবেশের সময় এগুলি অক্ষম / ড্রপ করতে এবং পরে তাদের সক্ষম / পুনরায় তৈরি করতে পারেন তবে আপনি একটি গতি উন্নতি করতে পারেন। এগুলি সচল রাখার তুলনায় এটি সামগ্রিকভাবে ধীর হয়ে যায় কিনা আপনাকে পরীক্ষা করতে হবে makes অন্যান্য প্রক্রিয়াগুলি একই টেবিলে একই সাথে লিখতে থাকলে এটিও ভাল ধারণা হতে পারে না। - গ্যারেথ লিয়নস

প্রশ্নোত্তর অনুসারে এবং বিদেশী কীগুলি বিপুল পরিমাণে sertোকানোর পরে অবিশ্বস্ত হয়ে যায় , BULK INSERTকোনও CHECK_CONSTRAINTSবিকল্প ছাড়াই এফকে সীমাবদ্ধতা অবিশ্বস্ত হয়ে যায় (আমার ক্ষেত্রে আমি অবিশ্বস্ত বাধা দিয়ে শেষ হয়েছি)। এটি পরিষ্কার নয় তবে এগুলি পরীক্ষা করে এখনও অবিশ্বস্ত করে তোলা বুদ্ধিমানের কাজ নয়। তবে, পিকে এবং ইউনিক্য এখনও পরীক্ষা করা হবে (দেখুন বাল্ক ইনসার্ট (লেনদেন-এসকিউএল) )। - আলেক্সি

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