আপনার প্রশ্নটি দেখায় যে আপনি টেবিলের ভেরিয়েবল এবং অস্থায়ী টেবিলগুলির আশেপাশের কিছু সাধারণ ভুল ধারণা থেকে নিজেকে বেঁচে গেছেন।
ডিবিএ সাইটে দুটি বস্তুর ধরণের পার্থক্য দেখে আমি যথেষ্ট বিস্তৃত উত্তর লিখেছি । এটি ডিস্ক বনাম মেমরি সম্পর্কে আপনার প্রশ্নকেও সম্বোধন করে (আমি দুজনের মধ্যে আচরণে কোনও উল্লেখযোগ্য পার্থক্য দেখিনি)।
স্থানীয় অস্থায়ী টেবিল বনাম কোনও টেবিল ভেরিয়েবল কখন ব্যবহার করবেন তা শিরোনামে থাকা প্রশ্ন সম্পর্কে you ফাংশনগুলিতে, উদাহরণস্বরূপ, কেবলমাত্র একটি টেবিলের পরিবর্তনশীল ব্যবহার করা সম্ভব এবং যদি আপনার সন্তানের স্কোপে টেবিলে লেখার প্রয়োজন হয় তবে কেবল একটি #temp
টেবিলই করতে পারে (টেবিলের মূল্যবান পরামিতিগুলি কেবল পাঠ্য অ্যাক্সেসের অনুমতি দেয় )।
আপনার পছন্দের যেখানে কিছু পরামর্শ নীচে রয়েছে (যদিও সবচেয়ে নির্ভরযোগ্য পদ্ধতিটি কেবলমাত্র আপনার নির্দিষ্ট কাজের চাপের সাথে উভয়কেই পরীক্ষা করা)।
যদি আপনার এমন একটি সূচি প্রয়োজন হয় যা টেবিল ভেরিয়েবলে তৈরি করা যায় না তবে অবশ্যই আপনার একটি #temporary
টেবিলের প্রয়োজন হবে । এর বিশদটি তবে সংস্করণ নির্ভর। এসকিউএল সার্ভার ২০১২ এর জন্য এবং কেবলমাত্র সূচিগুলির নীচে যে টেবিলের ভেরিয়েবলগুলিতে তৈরি করা যেতে পারে সেগুলি স্পষ্টভাবে কোনও UNIQUE
বা PRIMARY KEY
সীমাবদ্ধতার মাধ্যমে তৈরি করা হয়েছিল । এসকিউএল সার্ভার ২০১৪ সালে উপলব্ধ বিকল্পগুলির একটি উপসেটের জন্য ইনলাইন সূচক বাক্য গঠন চালু করেছে CREATE INDEX
। ফিল্টারড সূচক শর্তগুলির অনুমতি দেওয়ার জন্য এটি বাড়ানো হয়েছে। INCLUDE
-D কলাম বা কলাম স্টোর সূচীগুলি সহ সূচিগুলি এখনও সারণী ভেরিয়েবলগুলিতে তৈরি করা সম্ভব নয়।
আপনি যদি বারবার টেবিল থেকে প্রচুর সংখ্যক সারি যুক্ত এবং মুছে ফেলতে থাকেন তবে একটি #temporary
টেবিল ব্যবহার করুন । এটি সমর্থন করে TRUNCATE
(যা DELETE
বড় টেবিলগুলির তুলনায় আরও কার্যকর ) এবং এরপরে পরবর্তী সন্নিবেশগুলিতে এখানে চিত্রিত হিসাবেTRUNCATE
অনুসরণকারীগুলির চেয়ে আরও ভাল পারফরম্যান্স থাকতে পারে ।DELETE
- আপনি যদি বৃহত সংখ্যক সারি মুছে ফেলতে বা আপডেট করতে থাকেন তবে টেম্প টেবিলটি কোনও টেবিলের পরিবর্তনশীলের চেয়ে আরও ভাল পারফরম্যান্স করতে পারে - যদি এটি রাউসেট শেয়ারিং ব্যবহার করতে সক্ষম হয় (উদাহরণের জন্য নীচে "রাউসেট শেয়ারিংয়ের প্রভাবগুলি দেখুন")।
- যদি টেবিলটি ব্যবহার করে অনুকূল পরিকল্পনাটি ডেটার উপর নির্ভর করে পরিবর্তিত হয় তবে একটি
#temporary
টেবিল ব্যবহার করুন । এটি পরিসংখ্যান তৈরিতে সমর্থন করে যা তথ্য অনুযায়ী পরিকল্পনাটিকে পুনরায় সংশ্লেষ করার অনুমতি দেয় (যদিও সঞ্চিত পদ্ধতিতে ক্যাশেড অস্থায়ী টেবিলগুলির জন্য পুনঃসংশোধনের আচরণটি পৃথকভাবে বোঝা দরকার)।
- যদি টেবিলটি ব্যবহার করে ক্যোয়ারির অনুকূল পরিকল্পনার কোনও পরিবর্তন হওয়ার সম্ভাবনা না থাকে তবে আপনি পরিসংখ্যান তৈরির ও পুনরুদ্ধারগুলির ওভারহেড এড়াতে কোনও টেবিলের পরিবর্তনশীল বিবেচনা করতে পারেন (সম্ভবত আপনি যে পরিকল্পনাটি চান তা ঠিক করার জন্য ইঙ্গিতগুলির প্রয়োজন হবে)।
- যদি টেবিলটিতে প্রবেশ করা তথ্যের উত্সটি কোনও ব্যয়বহুল
SELECT
বিবৃতি থেকে থাকে তবে বিবেচনা করুন যে টেবিলের ভেরিয়েবলটি প্যারালাল প্ল্যান ব্যবহার করে এটির সম্ভাব্যতা আটকাবে।
- আপনার যদি বাইরের ব্যবহারকারীর লেনদেনের রোলব্যাক থেকে বাঁচতে টেবিলের ডেটা দরকার হয় তবে একটি টেবিল ভেরিয়েবল ব্যবহার করুন। এর জন্য একটি সম্ভাব্য ব্যবহারের ক্ষেত্রে লম্বা এসকিউএল ব্যাচে বিভিন্ন ধাপের অগ্রগতি লগ করা হতে পারে।
- যখন
#temp
কোনও ব্যবহারকারীর লেনদেনের মধ্যে একটি সারণী ব্যবহার করা হয় তখন লকগুলি টেবিলের ভেরিয়েবলের চেয়ে বেশি সময় ধরে রাখা সম্ভব (লক এবং বিচ্ছিন্নতার ধরণের উপর নির্ভরশীল বিবৃতিটির শেষের দিকে লেনদেনের সমাপ্তির আগ পর্যন্ত) এবং এটি tempdb
লেনদেন লগের কাটা কাটা রোধ করতে পারে যতক্ষণ না ব্যবহারকারীর লেনদেন শেষ হয়। সুতরাং এটি টেবিল ভেরিয়েবলগুলির পক্ষে যেতে পারে।
- সঞ্চিত রুটিনগুলির মধ্যে, উভয় সারণী ভেরিয়েবল এবং অস্থায়ী সারণী ক্যাশে করা যায়। ক্যাশেড টেবিলের ভেরিয়েবলগুলির মেটাডেটা রক্ষণাবেক্ষণ
#temporary
টেবিলগুলির চেয়ে কম । বব ওয়ার্ড তার tempdb
উপস্থাপনায় উল্লেখ করেছেন যে এটি উচ্চ সম্মিলনের শর্তে সিস্টেম টেবিলগুলিতে অতিরিক্ত বিতর্ক সৃষ্টি করতে পারে। অতিরিক্তভাবে, অল্প পরিমাণে ডেটার সাথে কাজ করার সময় এটি পারফরম্যান্সে একটি পরিমাপযোগ্য পার্থক্য করতে পারে ।
রোসেট ভাগ করে নেওয়ার প্রভাব
DECLARE @T TABLE(id INT PRIMARY KEY, Flag BIT);
CREATE TABLE #T (id INT PRIMARY KEY, Flag BIT);
INSERT INTO @T
output inserted.* into #T
SELECT TOP 1000000 ROW_NUMBER() OVER (ORDER BY @@SPID), 0
FROM master..spt_values v1, master..spt_values v2
SET STATISTICS TIME ON
/*CPU time = 7016 ms, elapsed time = 7860 ms.*/
UPDATE @T SET Flag=1;
/*CPU time = 6234 ms, elapsed time = 7236 ms.*/
DELETE FROM @T
/* CPU time = 828 ms, elapsed time = 1120 ms.*/
UPDATE #T SET Flag=1;
/*CPU time = 672 ms, elapsed time = 980 ms.*/
DELETE FROM #T
DROP TABLE #T
tempDB
- এটি "স্মৃতিতে" একটি রূপকথার। এছাড়াও: টেবিলের ভেরিয়েবলগুলি সর্বদা ক্যুরি অপ্টিমাইজারের দ্বারা ঠিক এক সারি ধরে রাখতে বিবেচিত হবে - আপনার যদি আরও অনেক কিছু থাকে তবে এটি গুরুতরভাবে খারাপ সম্পাদন করার পরিকল্পনার দিকে নিয়ে যেতে পারে।