দ্রুত নাল কলামটি নট নূলে পরিবর্তন করুন


11

আমার কাছে কয়েক মিলিয়ন সারি এবং একটি কলাম রয়েছে যা নাল মানগুলিতে অনুমতি দেয় table তবে বর্তমানে কোনও সারিতে column কলামটির জন্য একটি নুল মান নেই (আমি এটি কোনও প্রশ্নের সাথে মোটামুটি দ্রুত যাচাই করতে পারি)। তবে আমি যখন কমান্ডটি কার্যকর করি

ALTER TABLE MyTable ALTER COLUMN MyColumn BIGINT NOT NULL;

জিজ্ঞাসাটি চিরকাল তুলনামূলকভাবে কথা বলে takes এটি 10 ​​থেকে 20 মিনিটের মধ্যে সময় নেয় যা চেক সীমাবদ্ধতার চেয়ে দ্বিগুণেরও বেশি দীর্ঘ। সেই কলামটির জন্য টেবিলের মেটাডেটা তাত্ক্ষণিকভাবে আপডেট করার কোনও উপায় আছে, বিশেষত যেহেতু আমি জানি যে কোনও কাতারে that কলামটির জন্য নুল মান নেই?


2
না (বা অন্তত নথিভুক্ত / সমর্থিত পদ্ধতি ব্যবহার না করা)। দেখুন কেন ALTER COLUMN নুল না করার কারণে বৃহত্তর লগ ফাইলের বৃদ্ধির কারণ হয়?
মার্টিন স্মিথ

2
এটি সম্ভবত Sch-M"চিরদিনের" জন্য লাগলে কোনও লকের জন্য অপেক্ষা করতে পারে । আপনি অপেক্ষা বা ব্যস্ত ছিল কিনা তা দেখতে চেয়েছিলেন?
মার্টিন স্মিথ

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

উত্তর:


12

@ ইয়ারকিউবের উত্তরগুলি আংশিকভাবে মেটাডেটা পরিবর্তন হিসাবে পরিচালনা করে।

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

সীমাবদ্ধতা যোগ করার পরেও সাম্প্রতিক লেনদেনগুলিতে প্রভাব পড়তে পারে। ALTER TABLEএকটি অর্জন করতে হবে Sch-Mপ্রথম লক। যদিও এটির জন্য এটি অপেক্ষা করছে অন্য বর্ণনীয় টেবিল অ্যাক্সেসগুলি এখানে বর্ণিত হিসাবে অবরুদ্ধ করা হবে ।

একবার Sch-Mলক অর্জিত হয় অপারেশন প্রশংসনীয় দ্রুত কিন্তু হওয়া উচিত।

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

CREATE TABLE T (X INT NULL)

INSERT INTO T 
SELECT ROW_NUMBER() OVER (ORDER BY @@SPID)
FROM master..spt_values

ALTER TABLE T WITH NOCHECK
  ADD  CONSTRAINT X_NOT_NULL 
    CHECK (X IS NOT NULL) ; 

SELECT *
FROM T 
WHERE X NOT IN (SELECT X FROM T)

পরিকল্পনা

সহজ সঙ্গে এটি তুলনা করুন

ALTER TABLE T ALTER COLUMN X INT NOT NULL

SELECT *
FROM T 
WHERE X NOT IN (SELECT X FROM T)

পরিকল্পনা

এইভাবে কলাম সংজ্ঞা পরিবর্তন করার সাথে আপনি সম্ভবত যে একটি সমস্যার মুখোমুখি হতে পারেন তা হ'ল এটির শর্তটি পূরণ করে তা যাচাই করার জন্য কেবল সমস্ত সারিটি পড়ার প্রয়োজন নেই, তবে সারিগুলিতে লগইড আপডেটগুলি সম্পাদন করে শেষ করতে পারে

একটি সম্ভব হাফ ওয়ে হাউস চেক সীমাবদ্ধতা যুক্ত করা যেতে পারে WITH CHECK। এটি WITH NOCHECKসমস্ত সারি পড়ার প্রয়োজনের তুলনায় ধীর হবে তবে এটি কোয়েরি অপটিমাইজারকে উপরের ক্যোয়ারিতে সহজ পরিকল্পনা দেওয়ার অনুমতি দেয় এবং এটি লগড আপডেটের সম্ভাব্য সমস্যাটি এড়ানো উচিত।


7

আপনি কলামটি পরিবর্তন করার পরিবর্তে বিকল্পের CHECKসাহায্যে একটি সারণি সীমাবদ্ধ করতে পারেন NOCHECK:

ALTER TABLE MyTable WITH NOCHECK
  ADD  CONSTRAINT MyColumn_NOT_NULL 
    CHECK (MyColumn IS NOT NULL) ;

1
এটি ভবিষ্যতে আপডেটগুলি বা কলামটি তৈরি করে এমন সন্নিবেশগুলিকে আটকাতে NULLপারে তবে ক্যোয়ারী অপটিমাইজারের সাহায্যে ব্যবহার করতে সক্ষম হবে না।
মার্টিন স্মিথ

@ মার্টিনস্মিত ওহ হ্যাঁ, আমি ঠিক একই প্রশ্নের উত্তর এবং মন্তব্যগুলি পড়েছি: আপনি কীভাবে একটি এসকিউএল সার্ভারের একটি বৃহত টেবিলের সাথে একটি নল কলাম যুক্ত করবেন না? দয়া করে সমস্যাগুলি বা আরও ভাল সমাধানের সাথে একটি উত্তর যুক্ত করুন এবং আমি আমারটি সরিয়ে দেব।
ypercubeᵀᴹ

2
আমার এর চেয়ে ভাল সমাধান আর নেই। আমি এটি উত্সাহিত করেছি কারণ এটি একটি আংশিক সমাধান সরবরাহ করে। সমস্ত ওপি যদি এটি অবৈধ ডেটা প্রতিরোধ করতে চায় তবে এটি কাজ করবে (এবং ALTER COLUMNএকবার Sch-Mলকটি অর্জন করার পরে দ্রুত হওয়া উচিত এটির সারিগুলি মোটেও স্ক্যান করার দরকার নেই)। কেবল দেখানো যে এটি একেবারে এক নয় (উদাহরণস্বরূপ যদি কোনও NOT INজিজ্ঞাসায় ব্যবহার করা হয় তবে পরিকল্পনাটি আরও জটিল হবে)
মার্টিন স্মিথ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.