পোস্টগ্রিস: চেক সীমাবদ্ধতার তুলনায় কীভাবে সেটকে "আরও দক্ষ" করা যায় না


17

ইন সীমাবদ্ধতাসমূহ জন্য পোস্টগ্রি ডক্স , এটা বলছেন

একটি নন-নাল সীমাবদ্ধতা একটি চেক সীমাবদ্ধতা তৈরির জন্য কার্যত সমতুল্য CHECK (column_name IS NOT NULL), তবে পোস্টগ্রেএসকিউএলে একটি স্পষ্ট নয় নাল সীমাবদ্ধতা তৈরি করা আরও কার্যকর।

আমি আশ্চর্য হচ্ছি

  • "আরও দক্ষ" বলতে কী বোঝায়?
  • CHECK (column_name IS NOT NULL)পরিবর্তে ব্যবহারের ক্ষয়ক্ষতিগুলি কী কী SET NOT NULL?

আমি একটি NOT VALID CHECKসীমাবদ্ধতা যুক্ত করতে এবং এটি পৃথকভাবে বৈধ করতে চাই (যাতে AccessExclusiveLockকেবল সীমাবদ্ধতা যুক্ত করার জন্য অল্প সময়ের জন্য রাখা হয় এবং তারপরে ShareUpdateExclusiveLockদীর্ঘতর বৈধতা পদক্ষেপের জন্য একটি অনুষ্ঠিত হয়):

ALTER TABLE table_name
  ADD CONSTRAINT column_constraint
  CHECK (column_name IS NOT NULL)
  NOT VALID;
ALTER TABLE table_name
  VALIDATE CONSTRAINT column_constraint;

পরিবর্তে:

ALTER TABLE table_name
  ALTER COLUMN column_name
  SET NOT NULL;


যদি আপনি not inউভয় রূপের সাথে কিছু করেন তবে কার্যকর করার পরিকল্পনাগুলি দেখতে কেমন ? তারা কি একই বা তারা পৃথক হয়?
মার্টিন স্মিথ

উত্তর:


12

আমার বুনো অনুমান: "আরও দক্ষ" অর্থ "চেক সম্পাদন করতে কম সময় প্রয়োজন" (সময়ের সুবিধা)। এর অর্থ এটিও হতে পারে "চেক সঞ্চালনের জন্য কম মেমরির প্রয়োজন" (স্থান সুবিধা)। এর অর্থ হতে পারে "কম পার্শ্ব প্রতিক্রিয়া রয়েছে" (যেমন কোনও কিছু লক না করা বা স্বল্প সময়ের জন্য এটি লক করা) ... তবে আমার "অতিরিক্ত সুবিধা" জানতে বা পরীক্ষা করার উপায় নেই।

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

এটি টেবিল সেটআপ:

CREATE TABLE t1
(
   id serial PRIMARY KEY, 
   value integer NOT NULL
) ;

CREATE TABLE t2
(
  id serial PRIMARY KEY,
  value integer
) ;

ALTER TABLE t2
  ADD CONSTRAINT explicit_check_not_null
  CHECK (value IS NOT NULL);

এটি একটি অতিরিক্ত সারণী, সময় সংরক্ষণের জন্য ব্যবহৃত হয়:

CREATE TABLE timings
(
   test_number integer, 
   table_tested integer /* 1 or 2 */, 
   start_time timestamp without time zone,
   end_time timestamp without time zone,
   PRIMARY KEY(test_number, table_tested)
) ;

এবং এটি পিজিএডমিন তৃতীয় এবং পিজি স্ক্রিপ্ট বৈশিষ্ট্যটি ব্যবহার করে পরীক্ষা করা হয় ।

declare @trial_number;
set @trial_number = 0;

BEGIN TRANSACTION;
while @trial_number <= 100
begin
    -- TEST FOR TABLE t1
    -- Insert start time
    INSERT INTO timings(test_number, table_tested, start_time) 
    VALUES (@trial_number, 1, clock_timestamp());

    -- Do the trial
    INSERT INTO t1(value) 
    SELECT 1.0
      FROM generate_series(1, 200000) ;

    -- Insert end time
    UPDATE timings 
       SET end_time=clock_timestamp() 
     WHERE test_number=@trial_number and table_tested = 1;

    -- TEST FOR TABLE t2
    -- Insert start time
    INSERT INTO timings(test_number, table_tested, start_time) 
    VALUES (@trial_number, 2, clock_timestamp());

        -- Do the trial
    INSERT INTO t2(value) 
    SELECT 1.0
    FROM generate_series(1, 200000) ;

    -- Insert end time
    UPDATE timings 
       SET end_time=clock_timestamp() 
     WHERE test_number=@trial_number and table_tested = 2;

    -- Increase loop counter
    set @trial_number = @trial_number + 1;
end 
COMMIT TRANSACTION;

ফলাফলটি নিম্নলিখিত প্রশ্নের সাথে সংক্ষিপ্তসারিত হয়েছে:

SELECT
    table_tested, 
    sum(delta_time), 
    avg(delta_time), 
    min(delta_time), 
    max(delta_time), 
    stddev_pop(delta_time) 
FROM
    (
    SELECT
        table_tested, extract(epoch from (end_time - start_time)) AS delta_time
    FROM
        timings
    ) AS delta_times
GROUP BY
    table_tested 
ORDER BY
    table_tested ;

নিম্নলিখিত ফলাফল সহ:

table_tested | sum     | min   | max   | avg   | stddev_pop
-------------+---------+-------+-------+-------+-----------
           1 | 176.740 | 1.592 | 2.280 | 1.767 | 0.08913
           2 | 177.548 | 1.593 | 2.289 | 1.775 | 0.09159

মানগুলির একটি গ্রাফ একটি গুরুত্বপূর্ণ পরিবর্তনশীলতা দেখায়:

প্রতি 200000 সারি সন্নিবেশ করার জন্য সময় ব্যয় হয় (সেকেন্ডে)

সুতরাং, অনুশীলনে, চেক (কলামটি নল নয়) খুব সামান্য ধীর হয় (0.5% দ্বারা)। যাইহোক, এই ছোট পার্থক্যটি কোনও এলোমেলো কারণে হতে পারে, তবে শর্ত থাকে যে সময়ের পরিবর্তনের চেয়ে অনেক বেশি far সুতরাং, এটি পরিসংখ্যানগতভাবে তাৎপর্যপূর্ণ নয়।

ব্যবহারিক দৃষ্টিকোণ থেকে, আমি খুব বেশি "আরও দক্ষ" অগ্রাহ্য NOT NULLকরব, কারণ সত্যই আমি তা দেখতে পাচ্ছি না; যদিও আমি মনে করি যে একটি অনুপস্থিতি AccessExclusiveLockএকটি সুবিধা।

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