কখন এসকিএল সার্ভারে টেবিল ভেরিয়েবল বনাম অস্থায়ী টেবিল ব্যবহার করা উচিত?


298

আমি টেবিল ভেরিয়েবলে আরও বিশদ শিখছি। এটি বলে যে টেম্প টেবিলগুলি সর্বদা ডিস্কে থাকে এবং টেবিল ভেরিয়েবলগুলি মেমরিতে থাকে, এটি বলতে গেলে টেবিল ভেরিয়েবলের পারফরম্যান্স টেম্প টেবিলের চেয়ে ভাল কারণ টেবিল ভেরিয়েবলটি টেম্প টেবিলের চেয়ে কম আইও অপারেশন ব্যবহার করে।

তবে কখনও কখনও, যদি কোনও টেবিল ভেরিয়েবলের মধ্যে অনেকগুলি রেকর্ড থাকে যা মেমরিতে থাকতে পারে না, সারণী ভেরিয়েবলটি টেম্প টেবিলের মতো ডিস্কে স্থাপন করা হবে।

তবে "খুব বেশি রেকর্ড" কী তা আমি জানি না। 100,000 রেকর্ড? বা 1000,000 রেকর্ড? আমি কীভাবে জানতে পারি যে আমি যে টেবিলের পরিবর্তনশীলটি ব্যবহার করছি তা মেমরিতে রয়েছে বা ডিস্কে রয়েছে? টেবিল ভেরিয়েবলের স্কেল পরিমাপ করতে বা টেবিল ভেরিয়েবলটি যখন মেমরি থেকে ডিস্কে রাখা হয় তখন আমাকে জানতে দেওয়ার জন্য এসকিউএল সার্ভার 2005-এ কোনও ফাংশন বা সরঞ্জাম রয়েছে?


5
একটি সারণী ভেরিয়েবল প্রায় সর্বদা থাকে tempDB- এটি "স্মৃতিতে" একটি রূপকথার। এছাড়াও: টেবিলের ভেরিয়েবলগুলি সর্বদা ক্যুরি অপ্টিমাইজারের দ্বারা ঠিক এক সারি ধরে রাখতে বিবেচিত হবে - আপনার যদি আরও অনেক কিছু থাকে তবে এটি গুরুতরভাবে খারাপ সম্পাদন করার পরিকল্পনার দিকে নিয়ে যেতে পারে।
মার্ক_স


2
@marc_s - আপনি এই বিবৃতিতে "প্রায়" ফেলে দিতে পারেন। এটি সর্বদা থাকে tempdb(তবে পুরোপুরি স্মৃতিতেও থাকতে পারে)
মার্টিন স্মিথ

2
এসকিউএল 2014 এর সাহায্যে আপনি এখন মেমরিতে একটি টেবিল পরিবর্তনশীল তৈরি করতে পারেন
পাপারাজ্জো

উত্তর:


362

আপনার প্রশ্নটি দেখায় যে আপনি টেবিলের ভেরিয়েবল এবং অস্থায়ী টেবিলগুলির আশেপাশের কিছু সাধারণ ভুল ধারণা থেকে নিজেকে বেঁচে গেছেন।

ডিবিএ সাইটে দুটি বস্তুর ধরণের পার্থক্য দেখে আমি যথেষ্ট বিস্তৃত উত্তর লিখেছি । এটি ডিস্ক বনাম মেমরি সম্পর্কে আপনার প্রশ্নকেও সম্বোধন করে (আমি দুজনের মধ্যে আচরণে কোনও উল্লেখযোগ্য পার্থক্য দেখিনি)।

স্থানীয় অস্থায়ী টেবিল বনাম কোনও টেবিল ভেরিয়েবল কখন ব্যবহার করবেন তা শিরোনামে থাকা প্রশ্ন সম্পর্কে you ফাংশনগুলিতে, উদাহরণস্বরূপ, কেবলমাত্র একটি টেবিলের পরিবর্তনশীল ব্যবহার করা সম্ভব এবং যদি আপনার সন্তানের স্কোপে টেবিলে লেখার প্রয়োজন হয় তবে কেবল একটি #tempটেবিলই করতে পারে (টেবিলের মূল্যবান পরামিতিগুলি কেবল পাঠ্য অ্যাক্সেসের অনুমতি দেয় )।

আপনার পছন্দের যেখানে কিছু পরামর্শ নীচে রয়েছে (যদিও সবচেয়ে নির্ভরযোগ্য পদ্ধতিটি কেবলমাত্র আপনার নির্দিষ্ট কাজের চাপের সাথে উভয়কেই পরীক্ষা করা)।

  1. যদি আপনার এমন একটি সূচি প্রয়োজন হয় যা টেবিল ভেরিয়েবলে তৈরি করা যায় না তবে অবশ্যই আপনার একটি #temporaryটেবিলের প্রয়োজন হবে । এর বিশদটি তবে সংস্করণ নির্ভর। এসকিউএল সার্ভার ২০১২ এর জন্য এবং কেবলমাত্র সূচিগুলির নীচে যে টেবিলের ভেরিয়েবলগুলিতে তৈরি করা যেতে পারে সেগুলি স্পষ্টভাবে কোনও UNIQUEবা PRIMARY KEYসীমাবদ্ধতার মাধ্যমে তৈরি করা হয়েছিল । এসকিউএল সার্ভার ২০১৪ সালে উপলব্ধ বিকল্পগুলির একটি উপসেটের জন্য ইনলাইন সূচক বাক্য গঠন চালু করেছে CREATE INDEX। ফিল্টারড সূচক শর্তগুলির অনুমতি দেওয়ার জন্য এটি বাড়ানো হয়েছে। INCLUDE-D কলাম বা কলাম স্টোর সূচীগুলি সহ সূচিগুলি এখনও সারণী ভেরিয়েবলগুলিতে তৈরি করা সম্ভব নয়।

  2. আপনি যদি বারবার টেবিল থেকে প্রচুর সংখ্যক সারি যুক্ত এবং মুছে ফেলতে থাকেন তবে একটি #temporaryটেবিল ব্যবহার করুন । এটি সমর্থন করে TRUNCATE(যা DELETEবড় টেবিলগুলির তুলনায় আরও কার্যকর ) এবং এরপরে পরবর্তী সন্নিবেশগুলিতে এখানে চিত্রিত হিসাবেTRUNCATE অনুসরণকারীগুলির চেয়ে আরও ভাল পারফরম্যান্স থাকতে পারে ।DELETE

  3. আপনি যদি বৃহত সংখ্যক সারি মুছে ফেলতে বা আপডেট করতে থাকেন তবে টেম্প টেবিলটি কোনও টেবিলের পরিবর্তনশীলের চেয়ে আরও ভাল পারফরম্যান্স করতে পারে - যদি এটি রাউসেট শেয়ারিং ব্যবহার করতে সক্ষম হয় (উদাহরণের জন্য নীচে "রাউসেট শেয়ারিংয়ের প্রভাবগুলি দেখুন")।
  4. যদি টেবিলটি ব্যবহার করে অনুকূল পরিকল্পনাটি ডেটার উপর নির্ভর করে পরিবর্তিত হয় তবে একটি #temporaryটেবিল ব্যবহার করুন । এটি পরিসংখ্যান তৈরিতে সমর্থন করে যা তথ্য অনুযায়ী পরিকল্পনাটিকে পুনরায় সংশ্লেষ করার অনুমতি দেয় (যদিও সঞ্চিত পদ্ধতিতে ক্যাশেড অস্থায়ী টেবিলগুলির জন্য পুনঃসংশোধনের আচরণটি পৃথকভাবে বোঝা দরকার)।
  5. যদি টেবিলটি ব্যবহার করে ক্যোয়ারির অনুকূল পরিকল্পনার কোনও পরিবর্তন হওয়ার সম্ভাবনা না থাকে তবে আপনি পরিসংখ্যান তৈরির ও পুনরুদ্ধারগুলির ওভারহেড এড়াতে কোনও টেবিলের পরিবর্তনশীল বিবেচনা করতে পারেন (সম্ভবত আপনি যে পরিকল্পনাটি চান তা ঠিক করার জন্য ইঙ্গিতগুলির প্রয়োজন হবে)।
  6. যদি টেবিলটিতে প্রবেশ করা তথ্যের উত্সটি কোনও ব্যয়বহুল SELECTবিবৃতি থেকে থাকে তবে বিবেচনা করুন যে টেবিলের ভেরিয়েবলটি প্যারালাল প্ল্যান ব্যবহার করে এটির সম্ভাব্যতা আটকাবে।
  7. আপনার যদি বাইরের ব্যবহারকারীর লেনদেনের রোলব্যাক থেকে বাঁচতে টেবিলের ডেটা দরকার হয় তবে একটি টেবিল ভেরিয়েবল ব্যবহার করুন। এর জন্য একটি সম্ভাব্য ব্যবহারের ক্ষেত্রে লম্বা এসকিউএল ব্যাচে বিভিন্ন ধাপের অগ্রগতি লগ করা হতে পারে।
  8. যখন #tempকোনও ব্যবহারকারীর লেনদেনের মধ্যে একটি সারণী ব্যবহার করা হয় তখন লকগুলি টেবিলের ভেরিয়েবলের চেয়ে বেশি সময় ধরে রাখা সম্ভব (লক এবং বিচ্ছিন্নতার ধরণের উপর নির্ভরশীল বিবৃতিটির শেষের দিকে লেনদেনের সমাপ্তির আগ পর্যন্ত) এবং এটি tempdbলেনদেন লগের কাটা কাটা রোধ করতে পারে যতক্ষণ না ব্যবহারকারীর লেনদেন শেষ হয়। সুতরাং এটি টেবিল ভেরিয়েবলগুলির পক্ষে যেতে পারে।
  9. সঞ্চিত রুটিনগুলির মধ্যে, উভয় সারণী ভেরিয়েবল এবং অস্থায়ী সারণী ক্যাশে করা যায়। ক্যাশেড টেবিলের ভেরিয়েবলগুলির মেটাডেটা রক্ষণাবেক্ষণ #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

2
হাই, মিস্টার মার্টিন স্মিথ আমার ক্ষেত্রে আমি আইডির মানগুলির একটি সেট স্টোর পদ্ধতির অন্যদের ক্যোয়ারিতে এটি ব্যবহার করতে সঞ্চয় করতে চাই। তাহলে আপনি আমাকে কি সুপারিশ করবেন?
জিনকার্লো ফন্টোলেভো

@ জিনকার্লোফোনটোভো - একটি প্রাথমিক কী idএবং তার ব্যবহারের সাথে একটি টেবিল ভেরিয়েবল OPTION (RECOMPILE)সম্ভবত এটির জন্য ভাল হবে - তবে উভয়ই পরীক্ষা করুন।
মার্টিন স্মিথ

টেম্প টেবিল এবং টেবিল ভেরিয়েবল উভয়ের জন্য কী মেটাডেটা কনটেন্ট একই?
সৈয়দ আকিল আশিক

@Syed। সাধারণত টিভিতে কম। কোনও ব্যবহারকারীর লেনদেনের মধ্যে থাকলে লকগুলি আগে প্রকাশ করা যেতে পারে। বব ওয়ার্ডের লিঙ্কটিও দেখুন।
মার্টিন স্মিথ

73

খুব অল্প পরিমাণে ডেটা (হাজার হাজার বাইট) জন্য টেবিলের পরিবর্তনশীল ব্যবহার করুন

একটি ব্যবহার করুন অস্থায়ী টেবিল ডাটা অনেক জন্য

এটি নিয়ে চিন্তা করার আর একটি উপায়: আপনি যদি ভাবেন যে আপনি কোনও সূচক, স্বয়ংক্রিয় পরিসংখ্যান বা কোনও এসকিউএল অপ্টিমাইজার সদ্ব্যবহার থেকে উপকৃত হতে পারেন তবে কোনও টেবিলের পরিবর্তনশীলের জন্য আপনার ডেটা সেটটি সম্ভবত খুব বড়।

আমার উদাহরণস্বরূপ, আমি স্থায়ী টেবিল আপডেট / সন্নিবেশ করানোর আগে কেবলমাত্র 20 টি সারি বিন্যাসে রেখে একটি গোষ্ঠী হিসাবে তাদের সংশোধন করতে চেয়েছিলাম। সুতরাং একটি টেবিল পরিবর্তনশীল নিখুঁত।

তবে আমি একসাথে কয়েক হাজার সারি ব্যাক-ফিল করার জন্য এসকিউএল চালাচ্ছি এবং আমি অবশ্যই বলতে পারি যে অস্থায়ী টেবিলগুলি টেবিলের ভেরিয়েবলের চেয়ে আরও ভাল পারফর্ম করে ।

এটি একই ধরণের কারণে সিটিইর উদ্বেগের মতো নয় - যদি সিটিইতে ডেটা খুব ছোট হয় তবে আমি সিটিই অপ্টিমাইজারটি যা নিয়ে আসে তার থেকে ভাল বা আরও ভাল পারফর্ম করে, তবে এটি যদি বেশ বড় হয় তবে এটি আপনাকে খারাপ লাগছে

আমার বোধগম্যতা বেশিরভাগ http://www.developerfusion.com/article/84397/table-variables-v-temporary-tables-in-sql-server/ এর উপর ভিত্তি করে রয়েছে , যার আরও অনেক বিশদ রয়েছে।


টেকওয়েটি টেবিল ভেরিয়েবল ছোট ডেটাসেটের জন্য ঠিক আছে তবে বড় ডেটাসেটের জন্য টেম্প টেবিল ব্যবহার করুন। কয়েক হাজার সারি নিয়ে আমার একটি প্রশ্ন রয়েছে। টেবিল ভেরিয়েবল থেকে টেম্প টেবিলে স্যুইচ করার মাধ্যমে, ক্যোয়ারির সময় 40 এর থেকে নেমে মাত্র 5 এস হয়ে যায় এবং সমস্ত কিছুর সমান হয়।
লিয়াং

42

মাইক্রোসফ্ট এখানে বলেছে

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


14

আমি অ্যাবাকাসের সাথে পুরোপুরি একমত (দুঃখিত - মন্তব্য করার মতো পর্যাপ্ত পয়েন্ট নেই)।

এছাড়াও, মনে রাখবেন এটি আপনার কতগুলি রেকর্ড রয়েছে তা অগত্যা নেমে আসে না তবে আপনার রেকর্ডগুলির আকার

উদাহরণস্বরূপ, আপনি কি প্রতিটি 5 টি কলামের সাথে 50 টি কলামের সাথে 100,000 রেকর্ডের সাথে 5 টি মাত্র 5 টি কলামের পারফরম্যান্সের পার্থক্যটি বিবেচনা করেছেন?

শেষ অবধি, আপনি আপনার প্রয়োজনের চেয়ে আরও বেশি ডেটা অনুসন্ধান / সঞ্চয় করছেন? এসকিউএল অপটিমাইজেশন কৌশলগুলি সম্পর্কে এখানে ভাল পঠন । আপনি যে পরিমাণ ডেটা টানছেন তা সীমাবদ্ধ করুন, বিশেষত আপনি যদি এটি সমস্ত ব্যবহার না করেন (কিছু এসকিউএল প্রোগ্রামার অলস হয়ে ওঠে এবং কেবলমাত্র একটি ক্ষুদ্র উপসেট ব্যবহার করা সত্ত্বেও সবকিছুই নির্বাচন করে)। এসকিউএল ক্যোয়ারী বিশ্লেষকটি আপনার সেরা বন্ধুও হয়ে উঠতে ভুলবেন না।


4

পরিবর্তনশীল টেবিলটি কেবলমাত্র বর্তমান অধিবেশনে উপলভ্য, উদাহরণস্বরূপ, বর্তমানের মধ্যে যদি আপনার EXECঅন্য কোনও সঞ্চিত পদ্ধতি প্রয়োজন হয় তবে আপনাকে Table Valued Parameterঅবশ্যই টেবিলটি পাস করতে হবে এবং অস্থায়ী টেবিলগুলির সাথে, এটি কার্য সম্পাদনকে প্রভাবিত করবে আপনি কেবল এটি দিয়েই এটি করতে পারবেন অস্থায়ী টেবিলের নামটি পাস করা

একটি অস্থায়ী টেবিল পরীক্ষা করতে:

  • ওপেন ম্যানেজমেন্ট স্টুডিও ক্যোয়ারী সম্পাদক
  • অস্থায়ী টেবিল তৈরি করুন
  • অন্য একটি ক্যোয়ারী সম্পাদক উইন্ডো খুলুন
  • এই টেবিলটি "উপলব্ধ" থেকে নির্বাচন করুন

একটি চলক টেবিল পরীক্ষা করতে:

  • ওপেন ম্যানেজমেন্ট স্টুডিও ক্যোয়ারী সম্পাদক
  • একটি চলক টেবিল তৈরি করুন
  • অন্য একটি ক্যোয়ারী সম্পাদক উইন্ডো খুলুন
  • এই টেবিলটি "উপলভ্য নয়" থেকে নির্বাচন করুন

আমি অন্য কিছু অভিজ্ঞতা পেয়েছি: আপনার স্কিমাতে যদি GRANTটেবিলগুলি তৈরি করার সুযোগ না থাকে তবে ভেরিয়েবল টেবিলগুলি ব্যবহার করুন।


3

টেবিলগুলিতে ডেটা লেখার ঘোষণা declare @tbএবং অন্যান্য টেবিলের সাথে যোগদানের পরে, আমি বুঝতে পারি যে অস্থায়ী সারণীর তুলনায় প্রতিক্রিয়া সময়টি tempdb .. # tbঅনেক বেশি।

আমি যখন @tb এর সাথে তাদের যোগ দিই তখন ফলাফলটি ফিরে আসতে অনেক বেশি সময় হয়, # টিএম এর বিপরীতে, রিটার্নটি প্রায় তাত্ক্ষণিক হয়।

আমি 10,000 টি সারিতে যোগদান করেছি এবং 5 টি অন্যান্য টেবিলের সাথে যোগদান করেছি did


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