বড় টেবিলের গতি পরিবর্তনকারী কলামটি নন নুলিতে বাড়ান


12

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

আমি বিট কলামটি অ-শুরুর করতে চাই তবে আমি যখন ALTER TABLE t1 ALTER COLUMN c1 bit not nullএটি করার চেষ্টা করেছি তখন এটি 3 মিনিটের জন্য চলতে শুরু করে এবং আমি এটি বন্ধ করে দিয়েছিলাম কারণ এটি টেবিলে সমস্ত পাঠকে বাধা দিচ্ছিল এবং আমার সন্দেহ হয়েছিল যে এটি সম্পূর্ণ হতে বেশ দীর্ঘ সময় নিবে । এটি খুব বেশি সময় নিবে না এটি সম্ভব তবে আমি খুব বেশি অপ্রাপ্যতার ঝুঁকি নিতে পারি না। রোলব্যাক নিজেই 6 মিনিট সময় নিয়েছিল।

সম্ভাব্য ঘন্টাগুলি ব্যয় না করে আমি কীভাবে কলামটি অযোগ্য করতে পারি সে সম্পর্কে আপনার কোনও পরামর্শ আছে? অতিরিক্তভাবে অনুমান করার কোনও উপায় আছে যে ALTER TABLE ALTER COLUMNআমি যে বিবৃতিটি শুরু করেছিলাম এবং তারপরে বাতিল হয়েছিল তা শেষ হতে কত সময় লাগবে?

আমি এসকিউএল সার্ভার 2017 ওয়েব সংস্করণ ব্যবহার করছি।

উত্তর:


12

কলাম সংজ্ঞা পরিবর্তনের পরিবর্তে আপনি এমন একটি যুক্ত করতে পারেন CHECK CONSTRAINTযা সেই কলামটির জন্য ন্যূনসকে অনুমতি দেয় না। টেবিলটি এখনও স্ক্যান করা প্রয়োজন তবে এটি প্রতিটি একক ডেটা পৃষ্ঠাতে পরিবর্তন করার প্রয়োজন হবে না, তাই এটি আরও দ্রুত অপারেশন হওয়া উচিত। আফসোস, অপারেশন চলাকালীন এখনও একটি Sch-M লক রাখা হবে। একটি কৌশল হ'ল সীমাবদ্ধতা যুক্ত করার চেষ্টা করার আগে যতটা সম্ভব টেবিলের বেশি পরিমাণে বাফার পুলে প্রবেশ করার চেষ্টা করা। এটি স্ক-এম লকটি ধারণের পরিমাণ হ্রাস করতে পারে।

তারপরে আপনি আপনার পরবর্তী রক্ষণাবেক্ষণ উইন্ডোর সময় সীমাবদ্ধতাটি সরাতে এবং কলাম সংজ্ঞা পরিবর্তন করতে পারেন।


ধারণার জন্য ধন্যবাদ জো। আমি প্রায় একটি চেক সীমাবদ্ধতা যোগ করতে গিয়েছিলাম কিন্তু সপ্তাহান্তে রক্ষণাবেক্ষণ উইন্ডো ছিল এবং কলামটি অ-শুল্ক পরিবর্তন করতে সক্ষম হয়েছিল। এটি নিশ্চিত কিনা আমি নিশ্চিত নই, তবে কলামটি শুল্কবিহীন করার আগে, বাফার পুলে টেবিলের ডেটা চেষ্টা করে দেখার জন্য, আমি দৌড়ে এসেছি SELECT c1, count(*) FROM t1 GROUP BY c1যা চালাতে প্রায় 9 মিনিট সময় নিয়েছিল। এর ALTER TABLE ALTER COLUMNপরে আসল বিবৃতিটি শেষ হতে 25 মিনিট সময় নিয়েছে। এতোটা খারাপ না.
বেন আমদা

11

আপনি যদি এন্টারপ্রাইজ সংস্করণে (ইই) থাকেন তবে এটির NOT NULLএকটি ডিফল্ট 0বা 1(যেটি সবচেয়ে সাধারণ) এর সাথে যুক্ত করার চেয়ে আরও ভাল কৌশল হতে পারে ।

এটি ইই-তে কেবলমাত্র মেটাডেটা পরিবর্তন । তারপরে উল্টাতে হবে এমনগুলি আপডেট করুন। এর অর্থ কম আপডেট এবং শেষ হয়ে গেলে কলামটি বাতিল করতে হবে না। - মার্টিন-স্মিথ


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

-3

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

অনুলিপি করার সময়, উত্স সারণীতে পঠিত অ্যাক্সেস কোনও সমস্যা নয়, তবে কোনও লেখালেখি থাকলে সেগুলি বিচ্ছিন্নতা স্তরের উপর নির্ভর করে অবরুদ্ধ করা বা অনুলিপি করা হতে পারে।

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