কীভাবে একটি সেট ভিত্তিক অ্যালগরিদম / ইউডিএফ বাস্তবায়ন করতে হয়


13

আমার কাছে একটি অ্যালগরিদম রয়েছে যে আমার কাছে টেবিলের 800K সারি এবং 38 কলাম সহ প্রতিটি সারিটির বিরুদ্ধে চালানো দরকার। অ্যালগোরিদমটি ভিবিএতে প্রয়োগ করা হয় এবং কিছু কলাম থেকে অন্যান্য কলামগুলি ম্যানিপুলেট করতে মানগুলি ব্যবহার করে গণিতের একগুচ্ছ কাজ করে।

আমি বর্তমানে এসকিউএলকে জিজ্ঞাসা করতে এক্সেল (এডিও) ব্যবহার করছি এবং প্রতিটি সারিতে লুপ দ্বারা অ্যালগরিদম প্রয়োগ করতে ক্লায়েন্ট সাইড কার্সার সহ ভিবিএ ব্যবহার করি। এটি কাজ করে তবে চালাতে 7 ঘন্টা সময় লাগে।

ভিবিএ কোডটি যথেষ্ট জটিল যে এটি টি-এসকিউএল এ পুনরায় পুনঃনির্মাণ করতে অনেক কাজ হবে।

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

আদর্শভাবে আমি সমান্তরাল সেট ভিত্তিক উপায়ে যতগুলি সম্ভব সারি (সমস্ত?) এর বিপরীতে অ্যালগরিদম চালাতে সক্ষম হব।

এই ধরণের সমস্যার সাথে কীভাবে সেরা পারফরম্যান্স পাবেন সে সম্পর্কে কোনও সহায়তা ব্যাপকভাবে পূর্বাভাস দেওয়া হয়েছে।

--Edit

মন্তব্যের জন্য ধন্যবাদ, আমি এমএস এসকিউএল 2014 এন্টারপ্রাইজ ব্যবহার করছি, এখানে আরও কিছু বিবরণ দেওয়া হয়েছে:

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

আমার প্রশ্নটি আসল অ্যালগরিদমের চেয়ে পদ্ধতি সম্পর্কে আরও: আমি যদি এক সাথে অনেকগুলি সারিতে সমান্তরাল গণনা অর্জন করতে চাই তবে আমার বিকল্পগুলি কী।

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

টি-এসকিউএল সেট সেট ভিত্তিক ফাংশন বাস্তবায়নের একমাত্র উপায়?


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

2
আপনি যদি প্রতিটি সারি স্বাধীনভাবে প্রক্রিয়া করেন তবে আপনি 800K সারিগুলি Nব্যাচে বিভক্ত করতে পারেন এবং পৃথক প্রসেসর / কম্পিউটারগুলিতে Nআপনার অ্যালগরিদমের উদাহরণ চালাতে পারেন N। অন্যদিকে, আপনার মূল প্রতিবন্ধকতা কী - এসকিউএল সার্ভার থেকে এক্সেল বা প্রকৃত গণনে ডেটা স্থানান্তর করা? আপনি যদি কিছু ডামি ফলাফল তত্ক্ষণাত ফিরিয়ে দেওয়ার জন্য ভিবিএ ফাংশনটি পরিবর্তন করেন তবে পুরো প্রক্রিয়াটি কতক্ষণ সময় নিতে পারে? যদি এটি এখনও কয়েক ঘন্টা সময় নেয় তবে অদলবদল ডেটা স্থানান্তরে রয়েছে। যদি এটি কয়েক সেকেন্ড সময় নেয়, তবে আপনাকে ভিবিএ কোডটি অনুকূলকরণ করতে হবে যা গণনাগুলি করে।
ভ্লাদিমির বড়ানোভ

এটি সেই ফিল্টার যা একটি সঞ্চিত প্রক্রিয়া হিসাবে ডাকা হয়: SELECT AVG([AD_Sensor_Data]) OVER (ORDER BY [RowID] ROWS BETWEEN 5 PRECEDING AND 5 FOLLOWING) as 'AD_Sensor_Data' FROM [AD_Points] WHERE [FileID] = @FileID ORDER BY [RowID] ASC ম্যানেজমেন্ট স্টুডিওতে এই ফাংশনটি যা প্রতিটি সারির জন্য ডেকে
আনে 50mS

1
সুতরাং যে কোয়েরিটি 50 এমএস লাগে এবং 800000 বার (11 ঘন্টা) চালায় সেটিই সময় নিচ্ছে। প্রতিটি ফাইলের জন্য @ ফায়ালআইডিআইডি কি অনন্য বা সেখানে নকল রয়েছে যাতে আপনি কোয়েরিটি সম্পাদন করার জন্য যে পরিমাণ প্রয়োজন তা হ্রাস করতে পারবেন? আপনি একবারে সমস্ত ফাইলিডের স্টেজিং টেবিলের জন্য রোলিং গড়ের গণনা করতে পারেন (ফাইলআইডিতে পার্টিশন ব্যবহার করুন) এবং তারপরে প্রতিটি সারিটির জন্য উইন্ডোংয়ের ক্রিয়াকলাপ ছাড়াই সেই টেবিলটি জিজ্ঞাসা করতে পারেন। স্টেজিং টেবিলের জন্য সেরা সেটআপটি দেখতে ক্লাস্টারড ইনডেক্সের মতো হওয়া উচিত (FileID, RowID)
মিকারেল এরিকসন

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

উত্তর:


8

পদ্ধতিটির ক্ষেত্রে, আমি বিশ্বাস করি আপনি ভুল বি-ট্রিটি ছাঁটাই করছেন ;-)।

আমরা যা জানি:

প্রথমে আসুন আমরা একত্রীকরণ করি এবং পরিস্থিতি সম্পর্কে আমরা কী জানি তা পর্যালোচনা করি:

  • কিছুটা জটিল গণনা সম্পাদন করা দরকার:
    • এই টেবিলের প্রতিটি সারিতে এটি হওয়া দরকার।
    • অ্যালগোরিদম ঘন ঘন পরিবর্তিত হয়।
    • অন্যান্য কলামগুলি ম্যানিপুলেট করতে অ্যালগরিদম ... [ব্যবহার করে] কিছু কলাম থেকে মান
    • বর্তমান প্রসেসিং সময়: 7 ঘন্টা
  • টেবিল:
    • 800,000 সারি রয়েছে।
    • 38 টি কলাম রয়েছে।
  • অ্যাপ্লিকেশন ব্যাক-এন্ড:
  • ডাটাবেসটি এসকিউএল সার্ভার 2014, এন্টারপ্রাইজ সংস্করণ।
  • এখানে একটি সঞ্চিত পদ্ধতি রয়েছে যা প্রতিটি সারির জন্য ডাকা হয়:

    • এটি চালাতে 50 এমএস লাগে (গড় হিসাবে, আমি ধরে নিই)।
    • এটি প্রায় 4000 সারি প্রত্যাবর্তন করে।
    • সংজ্ঞা (অন্তত অংশে) হ'ল:

      SELECT AVG([AD_Sensor_Data])
                 OVER (ORDER BY [RowID] ROWS BETWEEN 5 PRECEDING AND 5 FOLLOWING)
                 as 'AD_Sensor_Data'
      FROM   [AD_Points]
      WHERE  [FileID] = @FileID
      ORDER BY [RowID] ASC

আমরা কী লক্ষ্য করতে পারি:

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

মন্তব্যে চিন্তার বর্তমান দিকনির্দেশটি হ'ল প্রধান সমস্যাটি এসকিউএল সার্ভার এবং এক্সেলের মধ্যে ডেটা স্থানান্তর। আসলেই কি তাই হয়? যদি স্টোরড পদ্ধতিটি 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 পৃথক লেনদেন।

আমার প্রস্তাবনা (বর্তমানে উপলব্ধ তথ্যের ভিত্তিতে):

  1. আপনার উন্নতির বৃহত্তম ক্ষেত্রটি হ'ল একাধিক সারি আপডেট করা (যেমন এক লেনদেনে)। আপনার FileIDপরিবর্তে প্রত্যেকের পরিবর্তে প্রতিটি পদে কাজ করার জন্য আপনার প্রক্রিয়াটি আপডেট করা উচিত RowID। তাই:

    1. FileIDএকটি অ্যারের মধ্যে একটি নির্দিষ্ট সমস্ত 4000 সারি পড়ুন
    2. অ্যারেতে ক্ষেত্রগুলি ম্যানিপুলেট করা হচ্ছে এমন প্রতিনিধিত্বকারী উপাদান থাকা উচিত
    3. অ্যারে জুড়ে চক্র, প্রতিটি সারিটি বর্তমানে আপনি যেমন করছেন তেমন প্রক্রিয়াজাতকরণ
    4. অ্যারেতে সমস্ত সারি একবার (যেমন এই নির্দিষ্ট জন্য FileID) গণনা করা হয়েছে:
      1. একটি লেনদেন শুরু
      2. প্রতি প্রতিটি আপডেট কল RowID
      3. যদি কোনও ত্রুটি না থাকে তবে লেনদেন করুন
      4. যদি কোনও ত্রুটি ঘটে থাকে তবে রোলব্যাক করুন এবং যথাযথভাবে পরিচালনা করুন
  2. যদি আপনার ক্লাস্টারড সূচকটি ইতিমধ্যে সংজ্ঞায়িত না হয় (FileID, RowID)তবে আপনার এটি বিবেচনা করা উচিত (@ মিকায়েল এরিকসন প্রশ্নের উপর একটি মন্তব্যে প্রস্তাবিত হিসাবে)। এটি এই সিঙ্গলটন আপডেটের ক্ষেত্রে সহায়তা করবে না, তবে এটি সামগ্রিক ক্রিয়াকলাপকে কমপক্ষে কিছুটা উন্নত করবে যেমন আপনি যে "ফিল্টার" সঞ্চিত পদ্ধতিতে যা করছেন সেগুলি সমস্ত ভিত্তিতে তৈরি হওয়ার কারণে FileID

  3. আপনার যুক্তিটি একটি সংকলিত ভাষায় সরানো বিবেচনা করা উচিত। আমি একটি নেট নেটফর্ম অ্যাপস এমনকি কনসোল অ্যাপ্লিকেশন তৈরির পরামর্শ দেব। এসকিউএল এজেন্ট বা উইন্ডোজ নির্ধারিত টাস্কগুলির মাধ্যমে সময় নির্ধারণ করা সহজ বলে আমি কনসোল অ্যাপটিকে পছন্দ করি। এটি ভিবি.এনইটি বা সি # তে সম্পন্ন হয়েছে কিনা তা বিবেচ্য নয়। VB.NET আপনার বিকাশকারীদের জন্য আরও প্রাকৃতিক ফিট হতে পারে তবে কিছু শিখনের বক্ররেখা থাকবে।

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

    আমি মনে করি না যে প্রসেসিংটিকে পুরোপুরি টি-এসকিউএলে স্থানান্তরিত করলে সমস্যাটি যদি আমার সন্দেহ হয় এবং আপনি একবারে কেবলমাত্র একটি আপডেট করছেন help

  4. যদি প্রক্রিয়াকরণটি .NET এ সরানো হয় তবে আপনি টেবিল-মূল্যবান প্যারামিটারগুলি (টিভিপি) ব্যবহার করতে পারেন যেমন আপনি অ্যারেটিকে একটি সঞ্চিত পদ্ধতিতে UPDATEউত্তীর্ণ করতে পারেন যা একটি টিভিপি টেবিলের ভেরিয়েবলের সাথে যুক্ত হয় এবং তাই একক লেনদেন হয় । INSERTএকক লেনদেনের জন্য 4000 টি গোষ্ঠীভুক্ত করার চেয়ে টিভিপি দ্রুত হওয়া উচিত । কিন্তু INSERT1 লেনদেনের 4000 এস-এর বেশি টিভিপি ব্যবহার করে প্রাপ্ত লাভ সম্ভবত ৮০০,০০০ পৃথক লেনদেন থেকে প্রত্যেকে ৪০০০ সারি মাত্র ২০০ লেনদেনে স্থানান্তরিত হওয়া উন্নতির মতো ততটা তাৎপর্যপূর্ণ হবে না।

    টিভিপি বিকল্পটি স্থানীয়ভাবে ভিবিএ পক্ষের জন্য উপলভ্য নয়, তবে কেউ এমন একটি কাজ নিয়ে এসেছিল যা পরীক্ষার জন্য মূল্যবান হতে পারে:

    ভিবিএ থেকে এসকিউএল সার্ভার ২০০৮ আর 2 এ যাওয়ার সময় আমি কীভাবে ডাটাবেস কর্মক্ষমতা উন্নত করব?

  5. যদি ফিল্টার প্রোকটি কেবলমাত্র ধারাটিতে ব্যবহার করা FileIDহয় WHEREএবং যদি প্রতিটি প্রকৃত অর্থে প্রক্টকে ডাকা হয়, তবে আপনি প্রথম রানের ফলাফলগুলি ক্যাশে করে এবং প্রতি সারিটির বাকি অংশে ব্যবহার করে কিছু প্রক্রিয়াকরণের সময় বাঁচাতে পারেন FileID, ঠিক আছে?

  6. একবার আপনি প্রক্রিয়াকরণ সম্পন্ন 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 এরও বেশি উন্নতি) সামগ্রিক প্রক্রিয়া সময় হ্রাস।


শ্রুতজকি কী পরামর্শ দিচ্ছেন তার জন্য একটি দুর্দান্ত "মিডল ম্যান" পদ্ধতি রয়েছে এবং এটি হ'ল এসকিউএল সার্ভার থেকে আপনার প্রয়োজনীয় ডেটা পাওয়ার জন্য পাওয়ারশেল ব্যবহার করা, ডেটা কাজ করতে আপনার ভিবিএ স্ক্রিপ্টটি কল করুন এবং তারপরে এসকিউএল সার্ভারে একটি আপডেট এসপি কল করুন , কী এবং আপডেট হওয়া মানগুলি এসকিউএল সার্ভারে ফিরে যাওয়া। এইভাবে আপনি ইতিমধ্যে যা আছে তার সাথে একটি সেট ভিত্তিক পদ্ধতির সমন্বয় করুন।
স্টিভ মঙ্গিয়ামালী

@ স্টিভ মঙ্গেমাইলি হাই স্টিভ এবং মন্তব্যের জন্য ধন্যবাদ। আমি তাড়াতাড়ি জবাব দিতাম তবে অসুস্থ ছিলাম। আমি কৌতূহলী যে আমি কী পরামর্শ দিচ্ছি তার চেয়ে আপনার ধারণাটি এর থেকে অনেক আলাদা। সমস্ত ইঙ্গিতগুলি হ'ল এক্সেলকে এখনও ভিবিএ চালানোর প্রয়োজন। বা আপনি কি পরামর্শ দিচ্ছেন যে পাওয়ারশেল ADO কে প্রতিস্থাপন করবে, এবং I / O তে আরও দ্রুত হলে, কেবলমাত্র I / O প্রতিস্থাপন করা হলেও এটি মূল্যবান হবে?
সলোমন রুটজকি

1
কোনও উদ্বেগ নেই, আপনার অনুভূতি আরও ভাল লাগছে glad আমি জানি না যে এটি আরও ভাল হবে। আমরা যা জানি না আমরা তা জানি না এবং আপনি দুর্দান্ত বিশ্লেষণ করেছেন তবে এখনও কিছু অনুমান করতে হবে। I / O এর নিজস্ব প্রতিস্থাপনের জন্য যথেষ্ট তাৎপর্যপূর্ণ হতে পারে; আমরা শুধু জানি না। আমি কেবলমাত্র একটি অন্য পদ্ধতি উপস্থাপন করতে চেয়েছিলাম যা আপনার প্রস্তাবিত জিনিসগুলির সাথে সহায়ক হতে পারে।
স্টিভ ম্যাঙ্গামেলি

ধন্যবাদ এবং এটি পরিষ্কার করার জন্য আপনাকে ধন্যবাদ। আমি আপনার সঠিক দিক সম্পর্কে নিশ্চিত ছিলাম না এবং অনুমান না করাই সেরা ured হ্যাঁ, আমি সম্মত হই যে আরও বিকল্প থাকা আরও ভাল কারণ আমরা জানি না কী কী পরিবর্তন করা যেতে পারে তাতে কোন সীমাবদ্ধতা রয়েছে :)।
সলোমন রুটজকি

আরে শ্রুতজকি, বিস্তারিত চিন্তাভাবনার জন্য ধন্যবাদ! আমি এসকিউএল পাশের সূচী এবং ক্যোয়ারীগুলি অনুকূলিত করে এবং বাধাগুলি সন্ধান করার চেষ্টা করেছি। আমি এখন যথাযথ সার্ভারে বিনিয়োগ করেছি, ৩core স্কোর, ১ টিবি আইসি বগি হওয়ার সাথে সাথে পিসিআই এসএসডি কেড়ে ফেলেছে। এখন এসএসআইএসে সরাসরি ভিবি কোড কল করার সময় এটি সমান্তরাল মৃত্যুদণ্ডের জন্য একাধিক থ্রেড খুলতে দেখা যায়।
medwar19

2

আইএমএইচও এবং এই ধারণা থেকে কাজ করে যে ভিবিএ সাবকে এসকিউএলে পুনরায় কোড করা সম্ভব নয়, আপনি কি ভিসিএ স্ক্রিপ্টকে এক্সেল ফাইলে মূল্যায়ন শেষ করতে এবং তারপরে এসএসআইএল এর মাধ্যমে ফলাফল এসএসআইএল-এর মাধ্যমে আবার লেখার অনুমতি দেওয়ার কথা বিবেচনা করেছেন?

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

অতিরিক্তভাবে, আপনি ভিবিএ স্ক্রিপ্টটি প্রোগ্রামগতভাবে শুরু করতে পারেন (কিছুটা ঝুঁকিপূর্ণ, তবে আমি workbook_open()অতীতে এই প্রকৃতির কাজগুলিকে "ফায়ার এবং ভুলে যেতে" ট্রিগার করতে সম্পত্তিটি ব্যবহার করেছি )।

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

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