পদ্ধতিটির ক্ষেত্রে, আমি বিশ্বাস করি আপনি ভুল বি-ট্রিটি ছাঁটাই করছেন ;-)।
আমরা যা জানি:
প্রথমে আসুন আমরা একত্রীকরণ করি এবং পরিস্থিতি সম্পর্কে আমরা কী জানি তা পর্যালোচনা করি:
আমরা কী লক্ষ্য করতে পারি:
এরপরে, আমরা অতিরিক্ত তথ্য সংশ্লেষ করতে পারি কিনা যা আমাদের এক বা একাধিক বোতল ঘাড় খুঁজে বের করতে সহায়তা করবে এবং কোনও সমাধানের দিকে ইঙ্গিত করতে পারে বা কমপক্ষে কিছু সম্ভাব্য সমাধান বেরিয়ে যায় কিনা তা দেখতে আমরা এই সমস্ত ডেটা পয়েন্টের সাথে একসাথে দেখতে পারি।
মন্তব্যে চিন্তার বর্তমান দিকনির্দেশটি হ'ল প্রধান সমস্যাটি এসকিউএল সার্ভার এবং এক্সেলের মধ্যে ডেটা স্থানান্তর। আসলেই কি তাই হয়? যদি স্টোরড পদ্ধতিটি 800,000 সারির প্রত্যেকটির জন্য ডাকা হয় এবং প্রতিটি কল প্রতি 50 এমএস লাগে (অর্থাত্ প্রতিটি সারিতে), যা 40,000 সেকেন্ড (এমএস নয়) যোগ করে। এবং এটি 6 666 মিনিটের সমতুল্য (এইচএমএম ;-), বা মাত্র ১১ ঘন্টা। তবুও পুরো প্রক্রিয়াটি চালাতে মাত্র 7 ঘন্টা সময় নেবে বলে জানা গেছে। আমরা ইতিমধ্যে মোট সময়ের চেয়ে 4 ঘন্টা বেশি রয়েছি এবং গণনা করতে বা এসকিউএল সার্ভারে ফলাফলগুলি পুনরুদ্ধার করতে আমরা সময়ের সাথে যুক্ত করেছি। তাই এখানে কিছু ঠিক নেই।
সঞ্চিত পদ্ধতির সংজ্ঞাটি দেখে, কেবলমাত্র একটি ইনপুট প্যারামিটার রয়েছে @FileID
; কোন ফিল্টার নেই @RowID
। সুতরাং আমি সন্দেহ করি যে নিম্নলিখিত দুটি পরিস্থিতিতে একটি ঘটছে:
- এই সঞ্চিত পদ্ধতিটি প্রতিটি প্রতি সারিতে আসলে কল হয় না , তবে প্রতিটির পরিবর্তে
@FileID
, যা প্রায় 4000 সারি বিস্তৃত প্রদর্শিত হয়। যদি বর্ণিত 4000 সারিগুলি মোটামুটি সুসংগত পরিমাণ হয় তবে 800,000 সারিগুলিতে গ্রুপিং করা লোকদের মধ্যে কেবল 200 জন রয়েছে। এবং 200 মৃত্যুদণ্ড 50 7 ঘন্টা থেকে 10 সেকেন্ডের প্রতিটি পরিমাণে 50 এমএস গ্রহণ করে।
- যদি এই সঞ্চিত পদ্ধতিটি আসলে প্রতিটি সারিটির জন্য আহ্বান জানায়, তবে প্রথমবার কোনও নতুন
@FileID
পাসটি বাফার পুলে নতুন সারিগুলি টানতে একটু বেশি সময় নেয় না, তবে পরবর্তী 3999 মৃত্যুদন্ড কার্যকরভাবে ইতিমধ্যে ইতিমধ্যে দ্রুত ফিরে আসবে ক্যাশে, তাই না?
আমি মনে করি যে এই "ফিল্টার" সঞ্চিত পদ্ধতি, বা এক্সেল SQL সার্ভার থেকে কোন ডাটা ট্রান্সফার উপর নিকটতর নিবদ্ধ, একটি হল লাল হেরিং ।
এই মুহুর্তের জন্য, আমি মনে করি অভাবনীয় পারফরম্যান্সের সর্বাধিক প্রাসঙ্গিক সূচকগুলি হ'ল:
- 800,000 সারি রয়েছে
- অপারেশন এক সময় এক সারিতে কাজ করে works
- ডেটাটি এসকিউএল সার্ভারে পুনরায় সংরক্ষণ করা হচ্ছে, সুতরাং অন্যান্য কলামগুলিতে ম্যানিপুলেট করার জন্য কিছু কলাম থেকে মানগুলি [ব্যবহার করে] "[আমার ইমাস ফ্যাস ;-)]
আমি সন্দেহ করি যে:
- ডেটা পুনরুদ্ধার এবং গণনাগুলির উন্নতির কিছু অবকাশ রয়েছে, এগুলি আরও ভাল করে তোলা প্রক্রিয়াজাতকরণের সময়কালে উল্লেখযোগ্য পরিমাণ হ্রাস করার মতো হবে না।
- প্রধান বাধা 800,000 পৃথক
UPDATE
বিবৃতি জারি করছে , যা 800,000 পৃথক লেনদেন।
আমার প্রস্তাবনা (বর্তমানে উপলব্ধ তথ্যের ভিত্তিতে):
আপনার উন্নতির বৃহত্তম ক্ষেত্রটি হ'ল একাধিক সারি আপডেট করা (যেমন এক লেনদেনে)। আপনার FileID
পরিবর্তে প্রত্যেকের পরিবর্তে প্রতিটি পদে কাজ করার জন্য আপনার প্রক্রিয়াটি আপডেট করা উচিত RowID
। তাই:
FileID
একটি অ্যারের মধ্যে একটি নির্দিষ্ট সমস্ত 4000 সারি পড়ুন
- অ্যারেতে ক্ষেত্রগুলি ম্যানিপুলেট করা হচ্ছে এমন প্রতিনিধিত্বকারী উপাদান থাকা উচিত
- অ্যারে জুড়ে চক্র, প্রতিটি সারিটি বর্তমানে আপনি যেমন করছেন তেমন প্রক্রিয়াজাতকরণ
- অ্যারেতে সমস্ত সারি একবার (যেমন এই নির্দিষ্ট জন্য
FileID
) গণনা করা হয়েছে:
- একটি লেনদেন শুরু
- প্রতি প্রতিটি আপডেট কল
RowID
- যদি কোনও ত্রুটি না থাকে তবে লেনদেন করুন
- যদি কোনও ত্রুটি ঘটে থাকে তবে রোলব্যাক করুন এবং যথাযথভাবে পরিচালনা করুন
যদি আপনার ক্লাস্টারড সূচকটি ইতিমধ্যে সংজ্ঞায়িত না হয় (FileID, RowID)
তবে আপনার এটি বিবেচনা করা উচিত (@ মিকায়েল এরিকসন প্রশ্নের উপর একটি মন্তব্যে প্রস্তাবিত হিসাবে)। এটি এই সিঙ্গলটন আপডেটের ক্ষেত্রে সহায়তা করবে না, তবে এটি সামগ্রিক ক্রিয়াকলাপকে কমপক্ষে কিছুটা উন্নত করবে যেমন আপনি যে "ফিল্টার" সঞ্চিত পদ্ধতিতে যা করছেন সেগুলি সমস্ত ভিত্তিতে তৈরি হওয়ার কারণে FileID
।
আপনার যুক্তিটি একটি সংকলিত ভাষায় সরানো বিবেচনা করা উচিত। আমি একটি নেট নেটফর্ম অ্যাপস এমনকি কনসোল অ্যাপ্লিকেশন তৈরির পরামর্শ দেব। এসকিউএল এজেন্ট বা উইন্ডোজ নির্ধারিত টাস্কগুলির মাধ্যমে সময় নির্ধারণ করা সহজ বলে আমি কনসোল অ্যাপটিকে পছন্দ করি। এটি ভিবি.এনইটি বা সি # তে সম্পন্ন হয়েছে কিনা তা বিবেচ্য নয়। VB.NET আপনার বিকাশকারীদের জন্য আরও প্রাকৃতিক ফিট হতে পারে তবে কিছু শিখনের বক্ররেখা থাকবে।
এসকিউএলসিআরআর এ যাওয়ার জন্য আমি এই মুহুর্তে কোনও কারণ দেখছি না। যদি অ্যালগোরিদম ঘন ঘন পরিবর্তিত হয়, তবে এটি বিরক্তিকর হয়ে উঠতে হবে সমস্ত সময় বিধানসভাটিকে পুনরায় স্থাপন করতে হবে। একটি কনসোল অ্যাপ পুনর্নির্মাণ করা এবং .exe নেটওয়ার্কের যথাযথ ভাগ করা ফোল্ডারে স্থাপন করা যেমন আপনি কেবল একই প্রোগ্রামটি চালান এবং এটি সর্বদা আপ-টু-ডেট থাকে, এটি করা মোটামুটি সহজ হওয়া উচিত।
আমি মনে করি না যে প্রসেসিংটিকে পুরোপুরি টি-এসকিউএলে স্থানান্তরিত করলে সমস্যাটি যদি আমার সন্দেহ হয় এবং আপনি একবারে কেবলমাত্র একটি আপডেট করছেন help
যদি প্রক্রিয়াকরণটি .NET এ সরানো হয় তবে আপনি টেবিল-মূল্যবান প্যারামিটারগুলি (টিভিপি) ব্যবহার করতে পারেন যেমন আপনি অ্যারেটিকে একটি সঞ্চিত পদ্ধতিতে UPDATE
উত্তীর্ণ করতে পারেন যা একটি টিভিপি টেবিলের ভেরিয়েবলের সাথে যুক্ত হয় এবং তাই একক লেনদেন হয় । INSERT
একক লেনদেনের জন্য 4000 টি গোষ্ঠীভুক্ত করার চেয়ে টিভিপি দ্রুত হওয়া উচিত । কিন্তু INSERT
1 লেনদেনের 4000 এস-এর বেশি টিভিপি ব্যবহার করে প্রাপ্ত লাভ সম্ভবত ৮০০,০০০ পৃথক লেনদেন থেকে প্রত্যেকে ৪০০০ সারি মাত্র ২০০ লেনদেনে স্থানান্তরিত হওয়া উন্নতির মতো ততটা তাৎপর্যপূর্ণ হবে না।
টিভিপি বিকল্পটি স্থানীয়ভাবে ভিবিএ পক্ষের জন্য উপলভ্য নয়, তবে কেউ এমন একটি কাজ নিয়ে এসেছিল যা পরীক্ষার জন্য মূল্যবান হতে পারে:
ভিবিএ থেকে এসকিউএল সার্ভার ২০০৮ আর 2 এ যাওয়ার সময় আমি কীভাবে ডাটাবেস কর্মক্ষমতা উন্নত করব?
যদি ফিল্টার প্রোকটি কেবলমাত্র ধারাটিতে ব্যবহার করা FileID
হয় WHERE
এবং যদি প্রতিটি প্রকৃত অর্থে প্রক্টকে ডাকা হয়, তবে আপনি প্রথম রানের ফলাফলগুলি ক্যাশে করে এবং প্রতি সারিটির বাকি অংশে ব্যবহার করে কিছু প্রক্রিয়াকরণের সময় বাঁচাতে পারেন FileID
, ঠিক আছে?
একবার আপনি প্রক্রিয়াকরণ সম্পন্ন FileID প্রতি , তারপর আমরা সমান্তরাল প্রক্রিয়াজাতকরণ সম্পর্কে কথা বলা শুরু করতে পারেন। তবে এটি সেই সময়ে প্রয়োজন হবে না :)। প্রদত্ত যে আপনি 3 টি মোটামুটি বড় অ-আদর্শ অংশ নিয়ে কাজ করছেন: এক্সেল, ভিবিএ, এবং 800 কে লেনদেন, এসএসআইএসের যে কোনও আলোচনা, বা সমান্তরালোগ্রাফ, বা কে জানে, অকাল অপটিমাইজেশন / কার্টের আগে-ঘোড়া ধরণের স্টাফ । যদি আমরা এই 7 ঘন্টা প্রক্রিয়াটি 10 মিনিট বা তারও কম সময়ে পেতে পারি, তবে আপনি কি এটি আরও দ্রুত করার জন্য অতিরিক্ত উপায়ের কথা ভাবছেন? আপনার মনে থাকা কোনও লক্ষ্য সমাপ্তির সময় কি আছে? মনে রাখবেন যে একবার প্রতি ফাইলআইডি- তে প্রসেসিং হয়ে যায় ভিত্তিতে, আপনার যদি ভিবি.এনইটি কনসোল অ্যাপ (যেমন কমান্ড-লাইন। এক্সইএস) থাকে, তবে আপনাকে এসকিউএল এজেন্ট সিএমডিএক্সেক পদক্ষেপ বা উইন্ডোজ শিড্যুলড কার্যগুলির মাধ্যমে একসাথে কয়েকটি ফাইলআইডি চালানো থেকে বিরত থাকতে পারে না, প্রভৃতি
এবং, আপনি সর্বদা একটি "পর্যায়ক্রমে" পন্থা নিতে পারেন এবং একবারে কয়েকটি উন্নতি করতে পারেন। যেমন প্রতি আপডেট আপডেট করা শুরু করা FileID
এবং সেইজন্য সেই গোষ্ঠীর জন্য একটি লেনদেন ব্যবহার করা। তারপরে, দেখুন আপনি টিভিপি কাজ করতে পারেন কিনা। তারপরে সেই কোডটি নেওয়ার এবং এটি VB.NET এ স্থানান্তরিত করার বিষয়ে দেখুন (এবং টিভিপিগুলি। নেট এ কাজ করে যাতে এটি সুন্দরভাবে পোর্ট হবে)।
আমরা কী জানি না যা এখনও সাহায্য করতে পারে:
- "ফিল্টার" পদ্ধতি রান সঞ্চিত থাকে RowID প্রতি বা FileID প্রতি ? আমাদের কি সেই স্টোরড পদ্ধতিটির পুরো সংজ্ঞা আছে?
- টেবিলের সম্পূর্ণ স্কিমা। এই টেবিলটি কত প্রশস্ত? কতগুলি পরিবর্তনশীল দৈর্ঘ্যের ক্ষেত্র রয়েছে? কয়টি ক্ষেত্র শূন্য? যদি কোনও নুল হয় তবে কয়টিতে ন্যুয়াল থাকে?
- এই টেবিলের জন্য সূচকগুলি। এটি বিভক্ত হয়? হয় ROW বা PAGE সংক্ষেপণ ব্যবহার করা হচ্ছে?
- এমবি / জিবি এর দিক থেকে এই টেবিলটি কত বড়?
- এই টেবিলের জন্য সূচক রক্ষণাবেক্ষণ কীভাবে পরিচালিত হয়? সূচকগুলি কত খণ্ডিত? তারিখ আপডেট কিভাবে পরিসংখ্যান হয়?
- এই 7 ঘন্টা প্রক্রিয়াটি চলাকালীন কি অন্য কোনও প্রক্রিয়া এই টেবিলটিতে লিখবে? বিতর্ক সম্ভাব্য উত্স।
- এই 7 ঘন্টা প্রক্রিয়াটি চলাকালীন কি অন্য কোনও প্রক্রিয়া এই টেবিলটি থেকে পড়ে? বিতর্ক সম্ভাব্য উত্স।
আপডেট 1:
** ভিবিএ (অ্যাপ্লিকেশনগুলির জন্য ভিজ্যুয়াল বেসিক) এবং এটি দিয়ে কী করা যায় সে সম্পর্কে কিছুটা বিভ্রান্তি রয়েছে বলে মনে হয়, তাই কেবল এটি নিশ্চিত করা যায় যে আমরা সবাই একই ওয়েব পৃষ্ঠায় রয়েছি:
আপডেট 2:
আরও একটি বিষয় বিবেচনা করুন: কীভাবে সংযোগগুলি পরিচালনা করা হচ্ছে? ভিবিএ কোডটি প্রতিটি ক্রিয়াকলাপ অনুসারে সংযোগটি খোলার এবং বন্ধ করে দিচ্ছে, বা এটি প্রক্রিয়া শুরু করার পরে সংযোগটি খুলবে এবং প্রক্রিয়া শেষে (অর্থাৎ ie ঘন্টা পরে) বন্ধ করে দেবে? এমনকি সংযোগ পুলিংয়ের সাথে (যা পূর্বনির্ধারিতভাবে, ADO- এর জন্য সক্ষম করা উচিত) এমনকি 800,200 বা 1,600,000 বার খোলার এবং বন্ধ করার বিপরীতে একবার খোলার এবং বন্ধ হওয়ার মধ্যে বেশ প্রভাব থাকতে হবে। এই মানগুলি কমপক্ষে 800,000 আপডেটের প্লাস 200 বা 800 কে এক্সইসি'র উপর ভিত্তি করে তৈরি হয় (ফিল্টার সঞ্চিত পদ্ধতিটি আসলে কতবার কার্যকর করা হয় তার উপর নির্ভর করে)।
অনেক সংযোগের এই সমস্যাটি আমি উপরে উল্লিখিত সুপারিশ দ্বারা স্বয়ংক্রিয়ভাবে হ্রাস পাবে। কোনও লেনদেন তৈরি করে এবং সেই লেনদেনের মধ্যে সমস্ত আপডেটের মাধ্যমে আপনি সেই সংযোগটি খোলা রাখবেন এবং প্রতিটিটির জন্য এটি পুনরায় ব্যবহার করবেন UPDATE
। নির্দিষ্ট অনুযায়ী 4000 সারি পাওয়ার জন্য প্রাথমিক কল থেকে সংযোগটি উন্মুক্ত রাখা হবে বা না করা হবে FileID
, বা "get" ক্রিয়াকলাপের পরে বন্ধ হয়ে আপডেটের জন্য আবার খোলা হবে, সেহেতু আমরা এখন যে কোনও পার্থক্যের বিষয়ে কথা বলছি, তার থেকে কম প্রভাব পড়বে না is পুরো প্রক্রিয়া জুড়ে 200 বা 400 মোট সংযোগ।
আপডেট 3:
আমি কিছু দ্রুত পরীক্ষা করেছিলাম। দয়া করে মনে রাখবেন যে এটি একটি বরং ছোট আকারের পরীক্ষা, এবং ঠিক একই ক্রিয়াকলাপ নয় (খাঁটি INSERT বনাম এক্সেক + আপডেট)। তবে, সংযোগ এবং লেনদেন কীভাবে পরিচালিত হয় তার সাথে সম্পর্কিত সময়ের পার্থক্যগুলি এখনও প্রাসঙ্গিক, সুতরাং তথ্যগুলি এখানে তুলনামূলকভাবে একই রকম প্রভাব ফেলতে বহির্মুখী হতে পারে।
পরীক্ষার পরামিতি:
- এসকিউএল সার্ভার 2012 বিকাশকারী সংস্করণ (64-বিট), এসপি 2
টেবিল:
CREATE TABLE dbo.ManyInserts
(
RowID INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
InsertTime DATETIME NOT NULL DEFAULT (GETDATE()),
SomeValue BIGINT NULL
);
অপারেশন:
INSERT INTO dbo.ManyInserts (SomeValue) VALUES ({LoopIndex * 12});
- প্রতিটি পরীক্ষায় মোট সন্নিবেশ: 10,000
- প্রতিটি পরীক্ষার জন্য পুনরায় সেট করুন:
TRUNCATE TABLE dbo.ManyInserts;
(এই পরীক্ষার প্রকৃতি প্রদত্ত, নিখরচায়, ফ্রিসিস্টেমেকাচ এবং ড্রপক্লিয়েনবউফাররা খুব বেশি মান যুক্ত বলে মনে করেনি))
- পুনরুদ্ধার মডেল: সিম্পল (এবং লগ ফাইলে 1 জিবি বিনামূল্যে)
- লেনদেনগুলি ব্যবহার করে এমন পরীক্ষাগুলি কেবল কতগুলি লেনদেন নির্বিশেষে একটি একক সংযোগ ব্যবহার করে।
ফলাফল:
Test Milliseconds
------- ------------
10k INSERTs across 10k Connections 3968 - 4163
10k INSERTs across 1 Connection 3466 - 3654
10k INSERTs across 1 Transaction 1074 - 1086
10k INSERTs across 10 Transactions 1095 - 1169
যেমন আপনি দেখতে পাচ্ছেন, ডিবি সংস্থার ADO সংযোগটি ইতিমধ্যে সমস্ত ক্রিয়াকলাপের মধ্যে ভাগ করা থাকলেও একটি স্পষ্ট লেনদেন (এডিও অবজেক্ট এটি পরিচালনা করতে সক্ষম হওয়া উচিত) ব্যাচের মধ্যে গ্রুপিং করা উল্লেখযোগ্যভাবে গ্যারান্টিযুক্ত (অর্থাত 2x এরও বেশি উন্নতি) সামগ্রিক প্রক্রিয়া সময় হ্রাস।