আমি জানি যে আপনি বেশিরভাগ ক্ষেত্রে UPDATE
এবং প্রায়শই পারফরম্যান্স সম্পর্কে উদ্বিগ্ন , তবে সহযোগী "ওআরএম" রক্ষণকারী হিসাবে, আমাকে "পরিবর্তিত" , "নাল" এবং "ডিফল্ট" মানগুলির মধ্যে পার্থক্য করার সমস্যা সম্পর্কে আরও একটি দৃষ্টিভঙ্গি দেই এসকিউএলে তিনটি ভিন্ন জিনিস, তবে সম্ভবত জাভা এবং বেশিরভাগ ওআরএম-তে কেবল একটি জিনিস:
আপনার যুক্তি INSERT
বিবৃতিতে অনুবাদ করা
ব্যাচ্যাবিলিটি এবং স্টেটমেন্ট ক্যাশেবিলিটির পক্ষে আপনার যুক্তিগুলি একইভাবে সত্য hold INSERT
বিবৃতি হিসাবে তারা জন্য কি UPDATE
বিবৃতি। তবে INSERT
বিবৃতিগুলির ক্ষেত্রে, বিবৃতি থেকে একটি কলাম বাদ দেওয়া এর চেয়ে আলাদা শব্দার্থবিজ্ঞান রয়েছে UPDATE
। এর অর্থ প্রয়োগ করা DEFAULT
। নিম্নলিখিত দুটি শব্দার্থগতভাবে সমতুল্য:
INSERT INTO t (a, b) VALUES (1, 2);
INSERT INTO t (a, b, c) VALUES (1, 2, DEFAULT);
এটি সত্য নয় UPDATE
যেখানে প্রথম দুটি শব্দার্থগত সমতুল্য এবং তৃতীয়টির সম্পূর্ণ ভিন্ন অর্থ রয়েছে:
-- These are the same
UPDATE t SET a = 1, b = 2;
UPDATE t SET a = 1, b = 2, c = c;
-- This is different!
UPDATE t SET a = 1, b = 2, c = DEFAULT;
জেডিবিসি সহ বেশিরভাগ ডাটাবেস ক্লায়েন্টের এপিআই, এবং এর ফলস্বরূপ, জেপিএ একটি বাঁধাইয়ের অনুমতি দেয় না DEFAULT
একটি বাইন্ড ভেরিয়েবলের সাথে এক্সপ্রেশনকে আবদ্ধ করার - বেশিরভাগ কারণ দেয় না। আপনি যদি পূর্বোক্ত ব্যাচিবিলিটি এবং স্টেটমেন্ট ক্যাশেযোগ্যতার কারণে একই এসকিউএল স্টেটমেন্টটি আবার ব্যবহার করতে চান তবে আপনি উভয় ক্ষেত্রে নিম্নলিখিত বিবৃতিটি ব্যবহার করবেন (ধরে নিবেন (a, b, c)
যে সমস্ত কলাম এতে রয়েছে t
):
INSERT INTO t (a, b, c) VALUES (?, ?, ?);
এবং যেহেতু c
সেট করা নেই, আপনি সম্ভবত জাভাটিকেnull
তৃতীয় বাইন্ড ভেরিয়েবলের সাথে বাঁধতে পারবেন, কারণ অনেকগুলি ওআরএম এছাড়াও NULL
এবং DEFAULT
( জোকিউকিউ , উদাহরণস্বরূপ এখানে ব্যতিক্রম হিসাবে) এর মধ্যে পার্থক্য করতে পারে না । তারা কেবল জাভা দেখেন null
এবং জানেন না যে এর অর্থ NULL
(অজানা মান DEFAULT
হিসাবে ) বা ( অজানা মান হিসাবে ) রয়েছে কিনা ।
অনেক ক্ষেত্রে, এই পার্থক্যটি কোনও বিষয় নয়, তবে আপনার কলাম সি সি নিম্নলিখিত বৈশিষ্ট্যগুলির কোনওটি ব্যবহার করছে যদি বিবৃতিটি কেবল ভুল হয় :
- এটির একটি
DEFAULT
ধারা রয়েছে
- এটি একটি ট্রিগার দ্বারা উত্পাদিত হতে পারে
UPDATE
বিবৃতি ফিরে
উপরের সমস্ত ডাটাবেসের ক্ষেত্রে সত্য হলেও, আমি আপনাকে নিশ্চিত করতে পারি যে ট্রিগার সমস্যাটি ওরাকল ডাটাবেসের ক্ষেত্রেও সত্য। নিম্নলিখিত এসকিউএল বিবেচনা করুন:
CREATE TABLE x (a INT PRIMARY KEY, b INT, c INT, d INT);
INSERT INTO x VALUES (1, 1, 1, 1);
CREATE OR REPLACE TRIGGER t
BEFORE UPDATE OF c, d
ON x
BEGIN
IF updating('c') THEN
dbms_output.put_line('Updating c');
END IF;
IF updating('d') THEN
dbms_output.put_line('Updating d');
END IF;
END;
/
SET SERVEROUTPUT ON
UPDATE x SET b = 1 WHERE a = 1;
UPDATE x SET c = 1 WHERE a = 1;
UPDATE x SET d = 1 WHERE a = 1;
UPDATE x SET b = 1, c = 1, d = 1 WHERE a = 1;
আপনি উপরের রান করার সময়, আপনি নিম্নলিখিত আউটপুট দেখতে পাবেন:
table X created.
1 rows inserted.
TRIGGER T compiled
1 rows updated.
1 rows updated.
Updating c
1 rows updated.
Updating d
1 rows updated.
Updating c
Updating d
যেমন আপনি দেখতে পাচ্ছেন, যে বিবৃতি সর্বদা সমস্ত কলামকে আপডেট করে তা সবসময় সমস্ত কলামের জন্য ট্রিগারকে আগুন ধরিয়ে দেবে, অন্যদিকে কেবল যে কলামগুলি পরিবর্তিত হয়েছে তা আপডেট করে এমন বিবৃতি কেবলমাত্র সেই ট্রিগারগুলিকেই আগুন ধরিয়ে দেবে যারা এই জাতীয় পরিবর্তনের জন্য শোনেন।
অন্য কথায়:
হাইবারনেটের বর্তমান আচরণ যা আপনি বর্ণনা করছেন তা অসম্পূর্ণ এবং এটি ট্রিগার (এবং সম্ভবত অন্যান্য সরঞ্জাম) এর উপস্থিতিতেও ভুল হিসাবে বিবেচিত হতে পারে।
আমি ব্যক্তিগতভাবে মনে করি যে আপনার ক্যোয়ারী ক্যাশে অপ্টিমাইজেশান যুক্তিটি গতিশীল এসকিউএল এর ক্ষেত্রে ওভাররেটেড হয়েছে। নিশ্চিত, যেমন একটি ক্যাশের মধ্যে আরো কয়েকটি প্রশ্নের হবে, এবং একটি বিট আরো পার্স কাজ সম্পন্ন করা হবে, কিন্তু এই সাধারণত গতিশীল জন্য একটা সমস্যা হয় না UPDATE
বিবৃতির তুলনায় অনেক কম, SELECT
।
ব্যাচিং অবশ্যই একটি সমস্যা, তবে আমার মতে, সমস্ত কলামগুলিকে আপডেট করার জন্য একটি একক আপডেটকে স্বাভাবিক করা উচিত নয় কারণ এই বিবৃতিটি ব্যাচিয়াযোগ্য হওয়ার সামান্য সম্ভাবনা রয়েছে। সম্ভাবনাগুলি হ'ল, ওআরএম পরপর অভিন্ন বিবৃতিগুলির সাব-ব্যাচগুলি সংগ্রহ করতে পারে এবং "পুরো ব্যাচের" পরিবর্তে সেগুলি ব্যাচ করতে পারে (যদি ওআরএম এমনকি "পরিবর্তিত" , "নাল" এবং "ডিফল্ট" এর মধ্যে পার্থক্য সন্ধান করতে সক্ষম হয়)
UPDATE
এটি কার্যতঃ একটিDELETE
+ এর সমতুল্যINSERT
(কারণ আপনি প্রকৃতপক্ষে সারিটির একটি নতুন ভি ersion তৈরি করেন)। ওভারহেড উচ্চ, এবং সূচকের সংখ্যা সহ বৃদ্ধি পায় , বিশেষত যদি তাদের সমন্বিত অনেকগুলি কলামগুলি আসলে আপডেট হয় এবং সূচকে উপস্থাপন করতে ব্যবহৃত গাছ (বা যাই হোক না কেন) একটি উল্লেখযোগ্য পরিবর্তন প্রয়োজন। এটি প্রাসঙ্গিক কী তা আপডেট হওয়া কলামগুলির সংখ্যা নয় তবে আপনি কোনও সূচকের কলামের অংশ আপডেট করেন কিনা।