সমস্ত সারি আপডেট করুন


12

আমি একক কলামের জন্য অত্যন্ত বড় ওরাকল টেবিলের প্রতিটি সারি আপডেট করার সর্বাধিক দক্ষ পদ্ধতিটি জানতে চাই। উদাহরণ স্বরূপ:

update mytable set mycolumn=null;

বা:

update mytable set mycolumn=42;

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


আমি যতদূর বুঝতে পেরেছি একটি ডিফল্ট সহ একটি নতুন নয় নাল কলাম যুক্ত করা কেবল ওরাকলে একটি মেটাডেটা পরিবর্তন। আমি সন্দেহ করি যে তারা "সমস্ত মানকে একই মানতে আপডেট করুন" ক্ষেত্রে অনুকূলিত করবে। এটি কি আপনার পক্ষে একটি সাধারণ অপারেশন?
মার্টিন স্মিথ

1
উভয় পদ্ধতি এবং সময় তাদের চেষ্টা করুন। আপনাকে এটি করতে বাধা দিচ্ছে কি? দেখুন সত্য আপনি একই ফলাফল দিয়ে শেষ করতে হবে, একটি ভিন্ন ফলাফল দিয়ে নয়! অন্যথায়, তুলনাটি অবৈধ।
tvCa

@tvCa আমি উভয় উপায়ে চেষ্টা করেছি। আমি যদি কেবল একটি আপডেট করি তবে এটি প্রায় দুই ঘন্টা চালায় এবং তারপরে আমি এটি হত্যা করি। আমি যদি একটি কলামটি ড্রপ করি তবে এটি কয়েক সেকেন্ড সময় নেয়। ডিফল্ট মান ব্যতীত কলাম যুক্ত করা (যা কলামটি বাতিল করে) কেবল কয়েক সেকেন্ড সময় নেয়। ডিফল্ট মান সহ একটি কলাম যুক্ত করতে 30 মিনিট সময় লাগে। সুতরাং, যদি আমি উদাহরণস্বরূপ, একটি কলামে সমস্ত মানকে 'কিছু মান' তে সেট করতে চাই, তবে আমি বর্তমানে কলামটি ড্রপ করে যুক্ত করব। এটি করার একটি দ্রুত উপায় আছে কিনা তা আমি কেবল জানতে চাই।
কাইনাউ

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

উত্তর:


2

আপনি এই ভর আপডেটটি করার সময় এই টেবিলটির বিপরীতে চলছে অন্যান্য ক্রিয়াকলাপের উপর অনেক কিছু নির্ভর করে। আমি আশা করি আপনার এমন কিছু পরীক্ষার পরিবেশ রয়েছে যেখানে আপনি কী করতে চান তার কয়েকটি নমুনা চালাতে পারেন এবং কোন পথে সবচেয়ে ভাল তা সম্পর্কে ধারণা পেতে পারেন। আমি চেষ্টা করব:

  1. একক চালান update table set column_name = blah;
  2. টেবিলের সমস্ত প্রাথমিক কীগুলি নির্বাচন করতে এবং সেগুলির মধ্য দিয়ে লুপ তৈরি করতে updating the column=blahএবং প্রতিটি এক্স আপডেট (সম্ভবত 10000) প্রতিশ্রুতিবদ্ধ করার জন্য একটি প্লাসকিএলএল লুপ তৈরি করুন । আপনি এই কোডটি অনুলিপি করে একে অনুলিপি করতে পারেন এটি প্রাথমিক কীগুলির একটি পৃথক বিভাগ করতে।

আমাদের একটি টেবিলের সাথে খুব অনুরূপ সমস্যা ছিল যা ওলটিপি সিস্টেমে খুব সক্রিয়ভাবে ব্যবহৃত হয়েছিল এবং আমরা এটি 5x এর সমান্তরাল করতে সক্ষম হয়েছি এবং প্রতি 10000 প্রতিশ্রুতিবদ্ধ 100+ এমএম সারি টেবিলটিতে কোনও ব্যবহারকারীর লকিং প্রভাব নিয়ে দৌড়েছি You আপনি কীভাবে বলেন নি আপনার টেবিলটি বড় বা আপনি কী ধরণের অ্যাপ্লিকেশন চালাচ্ছেন, তবে এই ধরণের সমাধান আপনাকে মাপসই করতে পারে।


0

দ্রুততার জন্য UPDATE, নিশ্চিত হয়ে নিন যে আপনার কাছে এমন কোনও ট্রিগার নেই যা গুলি চালাচ্ছে।

SELECT trigger_name, status FROM user_triggers WHERE table_name = 'MYTABLE';

ALTER TABLE mytable DISABLE ALL TRIGGERS;

আপনার কাজটি শেষ হওয়ার পরে কেবল যা চান তা পুনরায় সক্ষম করার বিষয়ে নিশ্চিত হন।

ALTER TRIGGER mytrigger ENABLE;

আপনি সূচক রক্ষণাবেক্ষণের ওভারহেডেও ছুটে যাচ্ছেন। আপনার সূচিগুলি পৃথকভাবে পুনর্নির্মাণের চেষ্টা করুন। এটি করার জন্য, প্যাপস দ্বারা এখানে উত্তরটি সহায়ক হওয়া উচিত: /programming/129046/disable-and-later-enable-all-table-indexes-in-oracle

রেফারেন্সের জন্য আমি এখানে প্যাপসের উত্তর পুনরাবৃত্তি করছি। (নোট করুন যে এই SPOOL কমান্ডটি আপনার প্ল্যাটফর্ম এবং পরিবেশ সম্পর্কে অনুমান করে))

set pagesize 0    
alter session set skip_unusable_indexes = true;
spool c:\temp\disable_indexes.sql
select 'alter index ' || u.index_name || ' unusable;' from user_indexes u;
spool off
@c:\temp\disable_indexes.sql

আমদানি করুন ...

select 'alter index ' || u.index_name || ' rebuild online;'
  from user_indexes u;

-1

সূচক অপসারণ। কলামটি আপডেট করুন। সূচকটি ফিরিয়ে দিন। তবে কলামে যদি সমস্ত সারিগুলির জন্য এক এবং একই মান থাকে তবে আপনি সূচকটি ফেলে দিতে পারেন।


-2

আপনার যদি জায়গার সীমাবদ্ধতা না থাকে, আপনি একটি নতুন টেবিল তৈরি করতে পারেন, আপনার টেবিলের মতোই আপনার নতুন কলামটি সেই টেবিলটিতে যুক্ত করতে হবে এবং পুরানো টেবিলটি মুছুন:

create new_table as
select old_table.*, (with or without default_Value) as new_column
from old_table;

1
এটি আরও দক্ষ হবে? কেন? এবং যদি এমন কোনও এফকে থাকে যা বিদ্যমান সারণীটি উল্লেখ করে?
ypercubeᵀᴹ

হ্যাঁ, আপনি এটি অন্যান্য নমুনা টেবিলটিতে চেষ্টা করে দেখতে পারেন এবং ফলাফল নিজেই দেখতে পারেন। যদি এফকে থাকে তবে আমি ঠিক জানি না তবে আপনি যদি এটি দক্ষ হয় তবে তা অক্ষম করতে এবং সক্ষম করতে পারেন।
ই_সালমন

-3

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

কোনও টেবিলে পুরো ডেটা মুছার জন্য, এর truncate table xচেয়ে ভাল delete from x। এছাড়াও শুদ্ধকরণ আরও একটি প্রক্রিয়া কাজের চাপ তৈরি করে।

সম্পাদনা করুন: আপনি inmemoryবিকল্পটি ব্যবহার করতে পারেন , কলামার ফর্ম্যাটে মেমরিটিতে টেবিল লোড করতে পারেন এবং তারপরে আপডেটটি করতে পারেন। এটি সত্যই আপনার ডিবির সম্পর্ক এবং কাঠামোর উপর নির্ভর করে। এই নিবন্ধটি দেখুন


3
তারা টেবিলের একটি কলাম আপডেট করতে চায়। কীভাবে truncateবা deleteকোনও সাহায্য হবে তা আমি দেখছি না ।
ypercubeᵀᴹ

@ সাইপারকিউ আমি কেবল ব্যাখ্যা করেছি যে প্রতিশ্রুতি ব্যতিরেকে একাধিক ডেটা ম্যানিপুলেশন কীভাবে অযাচিত আইও লোডের দিকে নিয়ে যায়; হয় আপডেট বা অন্য ওএলটিপি গুলি হতে পারে।
চালক

3
আপনি কী ব্যাখ্যা করতে পারবেন যে ঘন ঘন কমিটগুলি I / O হ্রাস করে ? চেকপয়েন্টগুলির কারণে তারা কি I / O বৃদ্ধি করবে না ?
mustaccio

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

4
"ঘন ঘন প্রতিশ্রুতি" সম্পর্কে টম কিটের কী বক্তব্য রয়েছে তা আপনি পড়তে চাইতে পারেন: Asktom.oracle.com/pls/apex/… " ভুল, ভুল, ভুল। তাই ভুল .... খুব খুব ভুল "
a_horse_with_no_name
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.