আমি কীভাবে স্মরণশক্তি হারিয়ে না ফেলে অনেকগুলি সন্নিবেশ নিয়ে একটি বড় স্ক্রিপ্ট চালাব?


28

প্রশ্ন:

সিলেক্ট স্টেটমেন্ট থেকে প্রায় 45 হাজার withোকানো সহ আমার স্ক্রিপ্ট রয়েছে। আমি যখন এটি চেষ্টা করে চালিত করি তখন আমি একটি ত্রুটি বার্তা পাই যা জানিয়েছিল যে আমার স্মৃতিশক্তি শেষ হয়ে গেছে। আমি কীভাবে এই স্ক্রিপ্টটি চালাতে পারি?

প্রসঙ্গ:

  1. ক্লায়েন্টটি ব্যবহার করে এমন একটি অ্যাপের সাথে অ্যাপ্লিকেশনটিকে সুন্দর করে তুলতে কিছু নতুন ডেটা ফিল্ড যুক্ত করেছে।
  2. ক্লায়েন্টের পূর্ণ ডেটা-র একটি স্প্রেডশিট পেয়েছে যা এই নতুন ক্ষেত্রগুলির জন্য মানগুলিতে বর্তমান ডেটা আইটেমগুলিকে ম্যাপ করেছে।
  3. বিবৃতি sertোকাতে স্প্রেডশিট রূপান্তরিত।
  4. আমি যদি কিছু বিবৃতি চালিত করি তবে এটি কার্যকর হয় তবে পুরো স্ক্রিপ্টটি এটি করে না।
  5. কোন টাইপস নেই।

যদি অন্য কোনও উপায়ে থাকে তবে আমার এই ডেটা লোড করা উচিত আমাকে নির্দ্বিধায় নির্দ্বিধায় এবং আমাকে জানান।


তাই একই প্রশ্ন: ( stackoverflow.com/questions/222442/... ) নিশ্চিত যদি উত্তর দিতে সাহায্য করে না
jumpdart

উত্তর:


17

এসকিউএল সার্ভার ২০০৫-এর সর্বাধিক ব্যাচের আকার হ'ল 65,536 * নেটওয়ার্ক প্যাকেট আকার (এনপিএস), যেখানে এনপিএস সাধারণত 4KB থাকে। এটি 256 মেগাবাইটে কাজ করে। এর অর্থ হ'ল আপনার sertোকানো বিবৃতিগুলির গড় প্রতিটি 5.8 কেবি হবে। এটি সঠিক বলে মনে হচ্ছে না তবে সেখানে বহিরাগত স্থান বা কিছু অস্বাভাবিক রয়েছে।

আমার প্রথম পরামর্শ হ'ল প্রতিটি INSERT বিবৃতি শেষে "GO" বিবৃতি দেওয়া। এটি আপনার একক ব্যাচের 45,000 INSERT বিবৃতি 4545 টি পৃথক ব্যাচে বিভক্ত করবে। এটি হজম করা সহজ হওয়া উচিত। সাবধানতা অবলম্বন করুন, যদি এই সন্নিবেশগুলির মধ্যে একটি ব্যর্থ হয় তবে আপনাকে অপরাধীকে সন্ধান করতে খুব কষ্ট হতে পারে। আপনি কোনও লেনদেন দিয়ে নিজেকে রক্ষা করতে চাইতে পারেন। আপনার সম্পাদকের যদি ভাল অনুসন্ধান-এবং-প্রতিস্থাপন (যা আপনাকে অনুসন্ধান করতে এবং return r \ n এর মতো রিটার্ন অক্ষরগুলি প্রতিস্থাপন করতে দেবে) বা ম্যাক্রো সুবিধার সাথে সাথে তাড়াতাড়ি এই বিবৃতিগুলি যুক্ত করতে পারেন।

দ্বিতীয় পরামর্শটি হ'ল এক্সেল থেকে সরাসরি ডেটা আমদানি করার জন্য একটি উইজার্ড ব্যবহার করা। উইজার্ড পর্দার আড়ালে আপনার জন্য একটু এসএসআইএস প্যাকেজ তৈরি করে এবং এটি চালায়। এটিতে এই সমস্যা হবে না।


2
একটি প্রতি বিবৃতি GOপরে ? ঠিক আছে, আমি অনুমান করি আপনি যদি অন্য কোনও স্ক্রিপ্ট ব্যবহার করে ঠিকঠাক ব্যবহার করে সেগুলি তৈরি করে থাকেন। অন্যথায়, আমি প্রতি 1000 সেকেন্ডের পরে একটি করে রাখি । লেনদেনকে পারমাণবিক করা এবং লেনদেনের আকারকে হ্রাস করার ক্ষেত্রে, কেন সমস্ত সারিগুলি একটি টেম্প টেবিল বা টেবিলের ভেরিয়েবলের মধ্যে লোড করা হবে না এবং সেগুলি সেখান থেকে একটি শটে লোড করে টেবিলের দিকে রেখে দেওয়া হবে না? INSERT
নিক চামাস

একটি 1000 ঠিক 1 হিসাবে ভাল, তবে এটি গণনা করা শক্ত। সত্যি কথা বলতে কি, তিনি কেবলমাত্র একটি জিও স্টেটমেন্ট দিয়ে হাফওয়ে মার্কে, 21,500 এর নিকট বিবৃতি দিয়ে পালাতে পারেন। আমি যেতে ঠিক করেছি কারণ এটির জন্য বর্তমান স্ক্রিপ্টটির জটিল সম্পাদনা বা ইনসার্টের স্টেটমেন্টগুলি গণনা করা (যা সরাসরি লাইন সংখ্যায় ম্যাপ না করে) প্রয়োজন হয় না।
ডারিন স্ট্রেইট

2
অবশ্যই, 1000 টি স্টেটমেন্টের একটি খারাপ অনুমানও যথেষ্ট ভাল। :)
নিক চাম্মাস

1
জিওএস যুক্ত করা ছিল একটি দ্রুত এবং সহজ সমাধান .. 25 এমবি স্ক্রিপ্ট 9 মিনিটের তুলনায় কিছুটা কম সমস্যা নিয়ে চলে। স্ক্রিপ্ট হিসাবে এটি আমাদের স্ট্যান্ডার্ড প্যাচ ডিপ্লোয়মেন্ট প্রক্রিয়াটি কখন বাইরে যায় তার জন্য রাখার জন্য এটি চেয়েছিল।
স্প্যাগেটিকোয়বয়

14

BULK INSERTবা bcp45,000 statementsোকানো বিবৃতি চেয়ে আরও উপযুক্ত বিকল্প বলে মনে হচ্ছে।

যদি আপনার সন্নিবেশ বিবৃতিতে আটকে থাকা প্রয়োজন, আমি কয়েকটি বিকল্প বিবেচনা করব:

উত্তর: লগ এবং ব্যাচের উপর প্রভাব কমাতে প্রত্যেকটিতে 100 বা 500 বা 1000 স্টেটমেন্টের লেনদেন এবং মোড়ানো ব্যাচগুলি ব্যবহার করুন। যেমন

BEGIN TRANSACTION;
INSERT dbo.table(a, ...) SELECT 1, ...
INSERT dbo.table(a, ...) SELECT 2, ...
...
INSERT dbo.table(a, ...) SELECT 500, ...
COMMIT TRANSACTION;
GO

BEGIN TRANSACTION;
INSERT dbo.table(a, ...) SELECT 1, ...
INSERT dbo.table(a, ...) SELECT 2, ...
...
INSERT dbo.table(a, ...) SELECT 500, ...
COMMIT TRANSACTION;
GO

বি: স্বতন্ত্র সন্নিবেশ বিবৃতিগুলির পরিবর্তে UNION ALLএকবারে 100 বা 500 টি স্টেটমেন্টের জন্য ব্যবহার করুন , যেমন

INSERT dbo.table(a, ...)
SELECT 1, ...
UNION ALL SELECT 2, ...
...
UNION ALL SELECT 500, ...
GO

INSERT dbo.table(a, ...)
SELECT 501, ...
UNION ALL SELECT 502, ...
...
UNION ALL SELECT 1000, ...
GO

আমি সংক্ষিপ্তকরণের জন্য পরিচালনা করতে ত্রুটি রেখেছি, তবে মূল কথাটি হ'ল আমি কখনই এসকিউএল সার্ভারে ৪৫,০০০ পৃথক স্টেটমেন্টের একটি ব্যাচ প্রেরণের চেষ্টা করব না।


1
খুব খারাপ, ওপি টেবিল-মান নির্মাতারা ব্যবহার করতে পারে না , এটি ২০০++ বৈশিষ্ট্যযুক্ত। তাকে এখনও 1000 সারিগুলির গ্রুপগুলিতে সন্নিবেশগুলি ব্যাচ করতে হবে, এটি সর্বাধিক আপনি একটি টিভিসির সাথে একত্রে গ্রুপ করতে পারেন।
নিক চামাস

আমি সংস্করণ ট্যাগ না হওয়া পর্যন্ত এটি আমার প্রথম পরামর্শ হতে চলেছে।
অ্যারন বারট্র্যান্ড

2
@ নিকচ্যামাস - এই শ্রেণীর বিটিডব্লিউর সংখ্যার সাথে এইসবের কার্যকারিতা অখাদ্যভাবে হ্রাস করে । আমি ২০০৮ এর দশমিক ১০ মিনিটের সংকলন সহ ২০০৮ সালে ১০ টি কলাম সহ ১০০০ সারি সন্নিবেশ করানোর প্রতিচ্ছবি সহ একটি সংযোগ আইটেমটি জমা দিয়েছিলাম কারণ এটি কেবলমাত্র সন্নিবেশ করা ছাড়া মূল্যবোধের তুলনায় অনেক অপ্রয়োজনীয় কাজ করে (অনেক বেশি পারফর্ম করে) প্যারামিটারাইজড হয়ে গেলে তাত্পর্যপূর্ণ এবং দেখার জন্য কোনও মান নেই)। যদিও 2012 সালে অনেক উন্নত হয়েছে তবে অ লিনিয়ার প্যাটার্নটি এখনও বিদ্যমান রয়েছে এবং এর পরে সংস্করণে ঠিক করা উচিত। VARCHAR(800)
মার্টিন স্মিথ

9

আপনি কেন স্মৃতি ত্রুটি থেকে বেরিয়ে আসছেন তা আমি নিশ্চিত নই, তবে আরও সহজ পদ্ধতির উপায় রয়েছে।

যদি আপনি স্প্রেডশিট থেকে সীমিত আকারে (যেমন সিএসভি) ডেটা রফতানি করতে পারেন তবে এসএসএমএসে ডেটা আমদানি উইজার্ডটি আপনার জন্য ডেটা toোকাতে ব্যবহার করতে পারেন:

এসএসএমএস আমদানি ডেটা টাস্ক।


এটি সহায়ক তবে ক্লায়েন্টের ডাটাবেসে আমার অ্যাক্সেস নেই। আমাকে স্ক্রিপ্টগুলিতে প্যাচ এবং ড্যাটালোডগুলি প্রস্তুত করতে হবে
স্প্যাগেটিকোবয়

0

একাধিক স্কেলবুলকপি ব্যবহার করে একটি টেম্প টেবিল তৈরি করুন। টেম্প টেবিলটিতে নতুন ডেটা sertোকান, তারপরে টেম্প টেবিলের ডেটাটি বিদ্যমান একটিতে মার্জ করুন। সি # স্কেলবুল্ককপি ব্যবহার করে উদাহরণ। রাইট্রোটটো সার্ভার পদ্ধতি (ডেটা টেবিল) । আশা করি এটা সাহায্য করবে


0

হ্যাঁ আমরা এটি করতে পেরেছিলাম, আউটআফমিউরি সমস্যাটি এড়াতে আমি একটি বিসিপি (বাল্ক কপি প্রোগ্রাম) পদ্ধতির সাথে চেষ্টা করেছি ।

দ্রষ্টব্য : এসকিউএল সার্ভার 2014 এ চেষ্টা করা হয়েছে।

BCP সালে প্রথম আমরা উত্স ডাটাবেসের ডেটা রপ্তানি করতে প্রয়োজন BCP (স্থানীয় ডিরেক্টরি ফোল্ডারে) ফাইল এবং তারপর যে আমদানি করতে প্রয়োজন BCP গন্তব্য ডাটাবেসের সাথে ফাইল।

এখানে চিত্র বর্ণনা লিখুন

নীচে কেক হাঁটার পদক্ষেপ রয়েছে:

বিঃদ্রঃ:

ক) গন্তব্য ডেটাবেসে খালি টেবিল উপস্থিত রয়েছে তা নিশ্চিত করুন

খ) নিশ্চিত করুন যে টেম্প ফোল্ডারটি সি ড্রাইভে উপস্থিত রয়েছে

  1. নীচে প্রদর্শিত কমান্ড সহ এক্সপোর্ট_ডাটা.ব্যাট নামে একটি ব্যাট ফাইল তৈরি করুন :

    bcp.exe [Source_DataBase_Name].[dbo].[TableName] OUT "C:\Temp\TableName.bcp" -S "Computer Name" -U "SQL Server UserName" -P "SQL Server Password" -n -q 

    বিরতি

  2. সেই ব্যাট ফাইলটি চালান, ফলস্বরূপ একটি বিসিপি ফাইল টেম্প ফোল্ডারে উত্পন্ন হবে

  3. তারপরে নিম্নলিখিত কমান্ড সহ Import_Data.bat নামে একটি নতুন ব্যাট ফাইল তৈরি করুন :

    bcp.exe [Destination_DataBase_Name].[dbo].[TableName] IN "C:\Temp\TableName.bcp" -S "Computer Name" -U "SQL Server UserName" -P "SQL Server Password" -n -q 

    বিরতি

এবং এখানে আমরা যেতে!


ত্রুটি পাওয়া "ইন-আউট, বা ফর্ম্যাট বিকল্পগুলির জন্য একটি বৈধ সারণীর নাম প্রয়োজন" " যখন তথ্য রফতানি করার চেষ্টা করা হয়।
সেন জ্যাকব

1
সমস্ত বৈশিষ্ট্য মান দিয়ে আপনি যে আদেশটি দিয়েছিলেন তা পেস্ট করতে পারলেন P অনুগ্রহ করে নীচের উদাহরণটি অনুসরণ করুন: বিসিপি.এক্সি এক্সপোর্টডিবি.ডাবো।এড্রেসকন্ট্রি আউট "সি: \ টেম্পের \ অ্যাড্রেসকাউন্ট্রি.বিসিপি" -এস "আইএন-ল ২০০৫৪" -উ "সা" -P "SA" -n -q যে [ExportDB - উত্স ডিবি, ইন-L20054 মধ্যে> উত্স ডিবি, AddressCountry-> ছক বর্তমান -> মেশিন নাম, "SA" ব্যবহারকারীর নাম / ডিবি এর PWD হয়]
Kms

আমার এখন নেই। আমি এসএসএমএসে আমদানি ডেটা বৈশিষ্ট্যটি ব্যবহার করে শেষ করেছি। তারপরে MS OLE DB সংযোগটি ব্যবহার করে উত্স ডিবি (v.15.0) সাথে টার্গেট ডিবি (v14.0) সংযুক্ত হয়েছে এবং বহু মিলিয়ন-সারি ডেটা আমদানি করার জন্য এটি বেশ দ্রুত ছিল। ধন্যবাদ!
সেন জ্যাকব
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.