আমার বুনো অনুমান: "আরও দক্ষ" অর্থ "চেক সম্পাদন করতে কম সময় প্রয়োজন" (সময়ের সুবিধা)। এর অর্থ এটিও হতে পারে "চেক সঞ্চালনের জন্য কম মেমরির প্রয়োজন" (স্থান সুবিধা)। এর অর্থ হতে পারে "কম পার্শ্ব প্রতিক্রিয়া রয়েছে" (যেমন কোনও কিছু লক না করা বা স্বল্প সময়ের জন্য এটি লক করা) ... তবে আমার "অতিরিক্ত সুবিধা" জানতে বা পরীক্ষা করার উপায় নেই।
আমি কোনও সম্ভাব্য স্থান সুবিধার জন্য যাচাই করার সহজ উপায়টি ভাবতে পারি না (যা আমি মনে করি, আজকাল স্মৃতি যখন সস্তা হয় তখন এটি অত গুরুত্বপূর্ণ নয়)। অন্যদিকে, সম্ভাব্য সময়ের সুবিধার জন্য এটি পরীক্ষা করা এতটা কঠিন নয়: সীমাবদ্ধতার একমাত্র ব্যতিক্রম বাদ দিয়ে কেবল দুটি টেবিল তৈরি করুন 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
মানগুলির একটি গ্রাফ একটি গুরুত্বপূর্ণ পরিবর্তনশীলতা দেখায়:
সুতরাং, অনুশীলনে, চেক (কলামটি নল নয়) খুব সামান্য ধীর হয় (0.5% দ্বারা)। যাইহোক, এই ছোট পার্থক্যটি কোনও এলোমেলো কারণে হতে পারে, তবে শর্ত থাকে যে সময়ের পরিবর্তনের চেয়ে অনেক বেশি far সুতরাং, এটি পরিসংখ্যানগতভাবে তাৎপর্যপূর্ণ নয়।
ব্যবহারিক দৃষ্টিকোণ থেকে, আমি খুব বেশি "আরও দক্ষ" অগ্রাহ্য NOT NULL
করব, কারণ সত্যই আমি তা দেখতে পাচ্ছি না; যদিও আমি মনে করি যে একটি অনুপস্থিতি AccessExclusiveLock
একটি সুবিধা।