কোনটি আরও পারফর্মেন্ট, CTE
বা Temporary Tables
?
কোনটি আরও পারফর্মেন্ট, CTE
বা Temporary Tables
?
উত্তর:
আমি বলব এগুলি আলাদা ধারণা কিন্তু "চক এবং পনির" বলার চেয়ে আলাদা নয়।
একটি অস্থায়ী টেবিলটি পুনরায় ব্যবহারের জন্য বা একাধিক প্রসেসিং পাসগুলি ডেটা সেটে সঞ্চালনের জন্য ভাল।
একটি সিটিই পুনরাবৃত্তি করতে বা সহজভাবে পাঠযোগ্যতার উন্নত করতে ব্যবহার করা যেতে পারে।
এবং, একটি ভিউ বা ইনলাইন টেবিলের মতো মূল্যবান ফাংশনটিকেও মূল ক্যোয়ারিতে প্রসারিত করার জন্য ম্যাক্রোর মতো বিবেচনা করা যেতে পারে
একটি টেম্প টেবিল হ'ল সুযোগের চারপাশে কিছু নিয়মযুক্ত একটি সারণী
আমি যেখানে উভয় ব্যবহার করি সেখানে প্রক্সগুলি সঞ্চয় করে রেখেছি (এবং টেবিলের ভেরিয়েবলগুলিও)
cte vs temporary tables
এই উত্তরটি সিটিইর আরও ভাল দিকগুলির অপূর্ণতাগুলি হাইলাইট করতে হবে। সংযুক্ত উত্তরের টিএল; ডিআর: কোনও সিটিই কখনই পারফরম্যান্সের জন্য ব্যবহার করা উচিত নয়। । আমি সিটিইর ডাউনসাইডগুলি অনুভব করায় আমি সেই উক্তিটির সাথে একমত।
এটা নির্ভর করে.
সবার আগে
একটি সাধারণ টেবিল এক্সপ্রেশন কি?
একটি (পুনরুক্ত নন) সিটিই অন্যান্য কনস্ট্রাক্টের সাথে একই রকম আচরণ করা হয় যা এসকিউএল সার্ভারে ইনলাইন টেবিল এক্সপ্রেশন হিসাবেও ব্যবহার করা যেতে পারে। উত্সযুক্ত সারণী, দর্শন এবং ইনলাইন টেবিলের মূল্যবান ফাংশন। নোট করুন যেহেতু বিওএল বলছে যে একটি সিটিই "অস্থায়ী ফলাফল সেট হিসাবে বিবেচনা করা যেতে পারে" এটি একটি খাঁটি যৌক্তিক বিবরণ। প্রায়শই এটির নিজের থেকে বৈবাহিকভাবে প্রয়োগ করা হয় না।
অস্থায়ী টেবিল কী?
এটি টেম্পডিবিতে ডেটা পৃষ্ঠাগুলিতে সঞ্চিত সারিগুলির একটি সংগ্রহ। ডেটা পৃষ্ঠাগুলি আংশিক বা সম্পূর্ণ স্মৃতিতে থাকতে পারে। অতিরিক্তভাবে অস্থায়ী টেবিলটি সূচিকৃত হতে পারে এবং কলামের পরিসংখ্যান থাকতে পারে।
পরীক্ষার ডেটা
CREATE TABLE T(A INT IDENTITY PRIMARY KEY, B INT , F CHAR(8000) NULL);
INSERT INTO T(B)
SELECT TOP (1000000) 0 + CAST(NEWID() AS BINARY(4))
FROM master..spt_values v1,
master..spt_values v2;
উদাহরণ 1
WITH CTE1 AS
(
SELECT A,
ABS(B) AS Abs_B,
F
FROM T
)
SELECT *
FROM CTE1
WHERE A = 780
উপরের পরিকল্পনায় নোটিশে সিটিই 1 এর উল্লেখ নেই। এটি সরাসরি বেস টেবিলগুলি সরাসরি অ্যাক্সেস করে এবং একইরূপে চিকিত্সা করা হয়
SELECT A,
ABS(B) AS Abs_B,
F
FROM T
WHERE A = 780
এখানে মধ্যবর্তী অস্থায়ী টেবিলটিতে সিটিইকে বাস্তবায়িত করে পুনর্লিখনটি ব্যাপকভাবে উত্পাদনশীল হবে।
সিটিই সংজ্ঞাটির বাস্তবায়ন করা
SELECT A,
ABS(B) AS Abs_B,
F
FROM T
অস্থায়ী টেবিলের প্রায় 8GB ডেটা অনুলিপি করার সাথে জড়িত থাকে তবে এটি থেকেও নির্বাচনের ওভারহেড রয়েছে।
উদাহরণ 2
WITH CTE2
AS (SELECT *,
ROW_NUMBER() OVER (ORDER BY A) AS RN
FROM T
WHERE B % 100000 = 0)
SELECT *
FROM CTE2 T1
CROSS APPLY (SELECT TOP (1) *
FROM CTE2 T2
WHERE T2.A > T1.A
ORDER BY T2.A) CA
উপরের উদাহরণটি আমার মেশিনে প্রায় 4 মিনিট সময় নেয়।
এলোমেলোভাবে উত্পাদিত 1,000,000 টির মধ্যে কেবল 15 টি সারি প্রাকটিকের সাথে মেলে তবে ব্যয়বহুল টেবিল স্ক্যান এগুলি সনাক্ত করতে 16 বার ঘটে।
মধ্যবর্তী ফলাফল কার্যকর করার জন্য এটি ভাল প্রার্থী হবে। সমতুল্য টেম্প টেবিল পুনর্লিখন 25 সেকেন্ড সময় নিয়েছে।
INSERT INTO #T
SELECT *,
ROW_NUMBER() OVER (ORDER BY A) AS RN
FROM T
WHERE B % 100000 = 0
SELECT *
FROM #T T1
CROSS APPLY (SELECT TOP (1) *
FROM #T T2
WHERE T2.A > T1.A
ORDER BY T2.A) CA
অস্থায়ী টেবিলের একটি প্রশ্নের কোনও অংশের অন্তর্বর্তী বস্তুকরণ কখনও কখনও কার্যকর হতে পারে এমনকি যদি এটি একবারে কেবল একবার মূল্যায়ন করা হয় - যখন এটি বাকী ক্যোয়ারিকে বস্তুগত ফলাফলের পরিসংখ্যানের সুযোগ নিয়ে পুনরায় সংশ্লেষের অনুমতি দেয়। এই পদ্ধতির একটি উদাহরণ এসকিউএল ক্যাট নিবন্ধে যখন কমপ্লেক্স কোয়েরিগুলি ভেঙে ফেলা যায় ।
কিছু পরিস্থিতিতে এসকিউএল সার্ভার একটি মধ্যবর্তী ফলাফল, যেমন একটি সিটিইর মতো ক্যাশে করতে একটি স্পুল ব্যবহার করবে এবং সেই উপ গাছটিকে পুনরায় মূল্যায়ন করতে এড়াবে। এটি (মাইগ্রেটেড) সংযুক্ত আইটেমটিতে আলোচনা করা হয়েছে সিটিই বা উত্পন্ন টেবিলগুলির মধ্যবর্তী উপাদানকে জোর করার জন্য একটি ইঙ্গিত সরবরাহ করুন । তবে এ সম্পর্কে কোনও পরিসংখ্যান তৈরি করা হয়নি এবং এমনকি যদি ছড়িয়ে দেওয়া সারিগুলির সংখ্যা অনুমানের চেয়েও বিস্তৃত ছিল তবে অগ্রগতি সম্পাদনের পরিকল্পনার জন্য সাড়া জাগাতে গতিশীলভাবে মানিয়ে নেওয়া সম্ভব নয় (কমপক্ষে বর্তমান সংস্করণগুলিতে Ad ভবিষ্যৎ).
সিটিইর ব্যবহারগুলি রয়েছে - যখন সিটিইতে ডেটা ছোট থাকে এবং পুনরাবৃত্ত সারণীতে যেমন পাঠযোগ্যতার শক্তিশালী উন্নতি হয়। তবে এর পারফরম্যান্স অবশ্যই টেবিলের পরিবর্তনশীলগুলির চেয়ে ভাল নয় এবং যখন কেউ খুব বড় টেবিলগুলি নিয়ে কাজ করে তখন অস্থায়ী টেবিলগুলি সিটিইতে উল্লেখযোগ্যভাবে ছাপিয়ে যায়। এটি কারণ আপনি কোনও সিটিইতে সূচকগুলি সংজ্ঞায়িত করতে পারবেন না এবং যখন আপনার কাছে প্রচুর পরিমাণে ডেটা থাকে যা অন্য টেবিলে যোগ দিতে হয় (সিটিই কেবল ম্যাক্রোর মতো হয়)। আপনি যদি প্রত্যেকে লক্ষ লক্ষ সারি রেকর্ড সহ একাধিক টেবিলগুলিতে যোগ দিচ্ছেন তবে সিটিই অস্থায়ী টেবিলগুলির চেয়ে উল্লেখযোগ্যভাবে খারাপ সম্পাদন করবে।
টেম্প টেবিলগুলি সর্বদা ডিস্কে থাকে - যতক্ষণ না আপনার সিটিই মেমরিতে রাখা যায় ততক্ষণ এটি দ্রুততর হয় (টেবিলের পরিবর্তনশীলগুলির মতোও)।
তবে আবার, যদি আপনার সিটিই (বা টেম্প টেবিল ভেরিয়েবল) এর ডেটা লোডটি খুব বড় হয়ে যায়, তবে এটি ডিস্কেও সংরক্ষণ করা হবে, সুতরাং কোনও বড় সুবিধা নেই।
সাধারণভাবে, আমি কোনও টেম্প টেবিলের উপরে সিটিই পছন্দ করি যেহেতু এটি ব্যবহার করার পরে এটি চলে যায়। এটিকে স্পষ্টভাবে বা কিছু বাদ দেওয়ার বিষয়ে আমার ভাবার দরকার নেই।
সুতরাং, শেষ পর্যন্ত কোনও স্পষ্ট উত্তর নেই, তবে ব্যক্তিগতভাবে আমি টেম্প টেবিলের চেয়ে সিটিই পছন্দ করব।
সুতরাং আমাকে যে ক্যোয়ারীটি অপ্টিমাইজ করার জন্য নির্ধারিত হয়েছিল তা এসকিউএল সার্ভারে দুটি সিটিই দিয়ে লেখা হয়েছিল। এটি 28 সেকেন্ড লাগছিল।
আমি এগুলিকে টেম্প টেবিলগুলিতে রূপান্তর করতে দুই মিনিট ব্যয় করেছি এবং ক্যোয়ারীতে 3 সেকেন্ড সময় লেগেছে
আমি যে ফিল্ডটিতে যোগ দিচ্ছিলাম তাতে টেম্প টেবিলের সাথে আমি একটি সূচক যুক্ত করেছি এবং এটি 2 সেকেন্ডে নামিয়ে আছি
তিন মিনিটের কাজ এবং এখন এটি চলমান 12x দ্রুত সমস্তই সিটিই অপসারণ করে। আমি ব্যক্তিগতভাবে সিটিই ব্যবহার করব না যখনই তারা ডিবাগ করতে আরও কঠোর হয়।
উন্মাদ বিষয়টি হ'ল সিটিই দু'টিই একবার ব্যবহার করা হয়েছিল এবং এখনও তাদের উপর একটি সূচক রাখা 50% দ্রুত প্রমাণিত হয়েছে।
সিটিই কোনও শারীরিক স্থান নেবে না। এটি কেবলমাত্র একটি ফলাফল সেট যা আমরা যোগদান ব্যবহার করতে পারি।
টেম্প টেবিলগুলি অস্থায়ী। আমরা সাধারণ টেবিলের মতো সূচি তৈরি করতে পারি, সীমাবদ্ধতাগুলির জন্য আমাদের সকল ভেরিয়েবলগুলি সংজ্ঞায়িত করতে হবে।
টেম্প টেবিলের সুযোগটি কেবল সেশনের মধ্যে। EX: দুটি এসকিউএল কোয়েরি উইন্ডো খুলুন
create table #temp(empid int,empname varchar)
insert into #temp
select 101,'xxx'
select * from #temp
এই উইন্ডোটি প্রথম উইন্ডোতে চালান তারপর নীচের ক্যোয়ারীটি দ্বিতীয় উইন্ডোটিতে চালান আপনি পার্থক্যটি দেখতে পারেন can
select * from #temp
আমি উভয়ই ব্যবহার করেছি তবে বিশাল জটিল পদ্ধতিগুলিতে সর্বদা টেম্প সারণিগুলির সাথে আরও ভাল এবং আরও পদ্ধতিগতভাবে কাজ করার সন্ধান পেয়েছি। সিটিইগুলির ব্যবহার রয়েছে তবে সাধারণত ছোট ডেটা থাকে।
উদাহরণস্বরূপ আমি স্প্রোকস তৈরি করেছি যা 15 সেকেন্ডে বড় গণনার ফলাফলের সাথে ফিরে আসে তবে এই কোডটি সিটিইতে চালানোর জন্য রূপান্তর করে এবং একই ফলাফল অর্জনের জন্য এটি 8 মিনিটেরও বেশি দৌড়তে দেখেছিল।
পার্টিতে দেরিতে, কিন্তু ...
আমি যে পরিবেশে কাজ করি তা অত্যন্ত সীমাবদ্ধ, কিছু বিক্রেতা পণ্যকে সমর্থন করে এবং "মূল্য সংযোজন" পরিষেবাদির মতো পরিষেবা সরবরাহ করে। নীতি এবং চুক্তির সীমাবদ্ধতার কারণে, আমি সাধারণত আলাদা টেবিল / ডেটা স্পেস এবং / বা স্থায়ী কোড তৈরির সক্ষমতা [প্রয়োগের উপর নির্ভর করে কিছুটা আরও ভাল হয়ে যায়] রাখার অনুমতি পাই না।
আইওডাব্লু, আমি সাধারণত কোনও সঞ্চিত প্রক্রিয়া বা ইউডিএফ বা টেম্প টেবিল ইত্যাদি বিকাশ করতে পারি না I )। একটি ছোট সঞ্চয় অনুগ্রহ হ'ল ক্রিস্টাল আমাকে কম্যান্ডস (পাশাপাশি এসকিউএল এক্সপ্রেশন) ব্যবহার করতে দেয়। কিছু জিনিস যা নিয়মিত অ্যাড / লিংক সারণীর সক্ষমতা অর্জনের মাধ্যমে দক্ষ হয় না সেগুলি এসকিউএল আদেশের সংজ্ঞা দিয়ে করা যেতে পারে। আমি এর মাধ্যমে সিটিই ব্যবহার করি এবং "দূরবর্তীভাবে" খুব ভাল ফলাফল পেয়েছি। সিটিই হ'ল ডাব্লু / রিপোর্ট রক্ষণাবেক্ষণে সহায়তা করে, কোডটি বিকাশ করার প্রয়োজন হয় না, সংকলন, এনক্রিপ্ট, স্থানান্তর, ইনস্টল, এবং তারপরে একাধিক স্তরের পরীক্ষার প্রয়োজন হয় ডিবিএর হাতে। আমি স্থানীয় ইন্টারফেসের মাধ্যমে সিটিই করতে পারি।
সিটিই ডাব্লু / সিআর ব্যবহারের নীচের দিকটি, প্রতিটি প্রতিবেদন পৃথক। প্রতিটি প্রতিবেদনের জন্য প্রতিটি সিটিই বজায় রাখতে হবে। যেখানে আমি এসপি এবং ইউডিএফগুলি করতে পারি, আমি এমন কিছু বিকাশ করতে পারি যা একাধিক প্রতিবেদনের সাহায্যে ব্যবহার করা যেতে পারে, কেবল এসপির সাথে সংযুক্ত হওয়া এবং পরামিতিগুলি পাস করার প্রয়োজন হয় যেন আপনি কোনও নিয়মিত টেবিলে কাজ করছেন। এসকিউএল কমান্ডগুলিতে প্যারামিটারগুলি পরিচালনা করতে সিআর সত্যই ভাল নয়, যাতে সিআর / সিটিই দিকটির দিকটি অভাবের হতে পারে। এই ক্ষেত্রে, আমি সাধারণত পর্যাপ্ত ডেটা (তবে সমস্ত ডেটা নয়) ফেরত দেওয়ার জন্য সিটিইকে সংজ্ঞায়িত করার চেষ্টা করি এবং তারপরে সিআর-র মধ্যে রেকর্ড নির্বাচন ক্ষমতাগুলি টুকরো টুকরো করে দেখতে চাই।
সুতরাং ... আমার ভোটটি সিটিই-র জন্য (যতক্ষণ না আমি আমার ডেটার স্পেস পাব)।
আমি যেখানে সিটিইর দুর্দান্ত পারফরম্যান্স বুদ্ধিমান খুঁজে পেয়েছি তার একটি ব্যবহার হ'ল যেখানে কয়েকটি সারণীতে কয়েক মিলিয়ন সারি ছিল এমন তুলনামূলক জটিল কোয়েরিতে আমাকে যোগ দিতে হবে।
আমি প্রথমে এই টেবিলগুলি কেটে কয়েক হাজার প্রাসঙ্গিক সারি কেটে প্রথমে ইনডেক্সড কলামগুলির ভিত্তিতে সাবসেটটি নির্বাচন করতে সিটিই ব্যবহার করেছি এবং তারপরে সিটিইতে আমার মূল প্রশ্নের সাথে যোগ দিলাম। এটি আমার ক্যোয়ারির রানটাইমটিকে তাত্পর্যপূর্ণভাবে হ্রাস করেছে।
যদিও সিটিইর জন্য ফলাফলগুলি ক্যাশে করা হয় না এবং টেবিলের ভেরিয়েবলগুলি আরও ভাল পছন্দ হতে পারে আমি সত্যিই তাদের চেষ্টা করে দেখতে চেয়েছিলাম এবং উপরের দৃশ্যের মাপসই খুঁজে পেয়েছি।
এটি একটি সত্যই উন্মুক্ত সমাপ্ত প্রশ্ন, এবং এটি সমস্ত কীভাবে এটি ব্যবহৃত হচ্ছে এবং টেম্প টেবিলের ধরণের (টেবিলের পরিবর্তনশীল বা traditionalতিহ্যবাহী সারণী) নির্ভর করে।
একটি traditionalতিহ্যবাহী টেম্প টেবিল অস্থায়ী ডিবিতে ডেটা সঞ্চয় করে, যা টেম্প টেবিলগুলিকে ধীর করে দেয়; টেবিল ভেরিয়েবলগুলি না।
আমি কেবল এটি পরীক্ষা করেছি- সিটিই এবং নন-সিটিই উভয়ই (যেখানে প্রতি ইউনিয়নের উদাহরণের জন্য ক্যোয়ারী টাইপ করা হয়েছিল) উভয়ই ~ 31 সেকেন্ড নিয়েছিল। সিটিই কোডটিকে আরও বেশি পঠনযোগ্য করে তোলে - এটি 241 থেকে 130 টি লাইন কেটে ফেলুন যা খুব সুন্দর। অন্যদিকে টেম্প টেবিলটি এটি 132 লাইনে কেটে ফেলেছে এবং চালাতে পাঁচ সেকেন্ড নিয়েছে। মজা করছি না. এই পরীক্ষার সমস্তটি ক্যাশে করা হয়েছিল - কোয়েরিগুলি সমস্ত আগে বহুবার চালানো হয়েছিল।
এসকিউএল সার্ভারে আমার অভিজ্ঞতা থেকে আমি এমন একটি দৃশ্যের সন্ধান পেয়েছি যেখানে সিটিই টেম্প টেবিলকে ছাড়িয়ে গেছে
আমার সঞ্চিত পদ্ধতিতে কেবলমাত্র একটি জটিল কোয়েরি থেকে আমার একটি ডেটাসেট (000 100000) ব্যবহার করা দরকার।
টেম্প টেবিলটি এসকিউএল-তে একটি ওভারহেডের কারণ হচ্ছিল যেখানে আমার পদ্ধতিটি ধীরে ধীরে সঞ্চালন করছে (টেম্প টেবিলগুলি প্রকৃত উপাদানযুক্ত টেবিল যা টেম্পডিবিতে বিদ্যমান এবং আমার বর্তমান পদ্ধতির জীবনের জন্য টিকে থাকে)
অন্যদিকে, সিটিই সহ, সিটিই কেবল নিম্নলিখিত কোয়েরি চালিত না হওয়া অবধি স্থির রাখুন। সুতরাং, সিটিই হ'ল সীমিত স্কোপ সহ একটি সহজ ইন মেমরি কাঠামো। সিটিই ডিফল্টরূপে টেম্পিডবি ব্যবহার করে না।
এটি এমন একটি দৃশ্য যেখানে সিটিইরা আপনার কোড এবং আউটপারফর্ম টেম্প টেবিলটিকে সহজতর করতে সত্যিই সহায়তা করতে পারে। আমি 2 টি সিটিই ব্যবহার করেছি, এরকম কিছু
WITH CTE1(ID, Name, Display)
AS (SELECT ID,Name,Display from Table1 where <Some Condition>),
CTE2(ID,Name,<col3>) AS (SELECT ID, Name,<> FROM CTE1 INNER JOIN Table2 <Some Condition>)
SELECT CTE2.ID,CTE2.<col3>
FROM CTE2
GO