انجمن وب سایت مشاوره در زمینه پروژه های برنامه نویسی و طراحی وب سایتهای تجاری
Temp Table تمپ تیبل یا جدول تمپ در SQL Server - نسخه‌ی قابل چاپ

+- انجمن وب سایت مشاوره در زمینه پروژه های برنامه نویسی و طراحی وب سایتهای تجاری (http://forum.a00b.com)
+-- انجمن: سوالها و مقاله های آموزشی (/forumdisplay.php?fid=1)
+--- انجمن: مقاله های آموزشی (/forumdisplay.php?fid=3)
+--- موضوع: Temp Table تمپ تیبل یا جدول تمپ در SQL Server (/showthread.php?tid=32)



Temp Table تمپ تیبل یا جدول تمپ در SQL Server - ali - 05-10-2015 10:25 PM

Temp Table
در SQL server یک پایگاه داده از پیش تعریف شده با نام Temp db وجود دارد، در بعضی مواقع شما به یک جدول موقت نیاز دارید این جداول در این پایگاه داده ذخیره می شود و Temp Table نام دارد.
برای استفاده از جداول موقت دو حالت وجود دارد اگر قبل از این جداول از یک # استفاده شود این جدول Local بوده مثلا اگر در Stored Procedure دستور ساخت این جدول نوشته شده باشد به ازای هر کاربر شما این جدول ساخته می شود و در صورتی که کانکشن این کاربر از بین برود جدول وی نیز از بین می رود.
در حالت دوم اگر قبل از نام جدول از دو علامت ## استفاده شود این جدول Global خواهد بود. در این صورت سایر کاربران از همین جدول استفاده می کنند اگر کاربر به وجود آورنده جدول، جدول را حذف کند طبیعتا جدول دیگر توسط هیچ کاربری قابل دسترس نخواهد بود.
نمونه دستورات :
کد:
CREATE TABLE #Table (id INT , name NVARCHAR(MAX))
DECLARE @i INT =0
WHILE (@i <20)
BEGIN
INSERT INTO #Table ([id],[name]) VALUES (@i,'ESH')
SET @i+=1;
END
SELECT * FROM #Table
DROP TABLE #Table
استفاده از جدول موقت به طور کلی برای پردازش مقدار زیادی از اطلاعات است زیرا می تواند کار ها را به صورت موازی انجام دهد . در حالی که جدول متغیرها بهترین راه حل برای مقدار کمی از داده ها است .
موارد استفاده از temp table ها :
حتی الامکان می بایست از temp table ها استفاده نشود. زیرا علاوه بر این که سر بار زیادی بر روی sql می گذارند . performance را نیز پایین می اورند . تنها در برخی استفاده از temp table ها مانعی ندارد . برخی از این استثنا ها عبارتند از :
الف) هنگامی که بخواهیم نتیجه یک Query را از یک nested stored procedure به stored procedure دیگری منتقل کنیم که در این صورت تنها راه حل ممکن استفاده از temp table ها است .
ب) در صورتی که بخواهیم در stored procedure از cursor استفاده کنیم . با توجه به سرعت پایین cursor ها می توان از Temp Table ها به عنوان راه حل استفاده نمود .
ج) سعی کنید فقط فیلد هایی را که نیاز دارید در Temp Table درج نمایید.
د) از دستور Select Into برای ایجاد Temp Table استفاده نکنید بلکه ابتدا با استفاده از دستور Create Table جدول مجازی را ایجاد کنید و سپس با استفاده از دستور Insert Into رکورد های مورد نظر را در آن درج نمایید .
ه) حتما سعی کنید از clustered و non-clustered Index ها در Temp Table ها استفاده نمایید . ( مخصوصا هنگامی که تعداد رکوردهای موجود در Temp Table ها بسیار زیاد باشد)
و) حتما پس از استفاده از Temp Table ها ان را حذف کنید ( در این صورت فضای Tempdb ازاد می شود) و هرگز منتظر نباشید تا با قطع شدن connection بطور اتوماتیک tempdb حذف شود .
ز) در صورتی که استفاده از Temp Table ها در برنامه هایتان زیاد است بهتر است با تنظیمات sql server مسیر ان را به یک دیسک مجزا منتقل کنید تا فضای اصلی کمتر اشغال گردد.
ح) هرگز Temp Table ها را در Transaction ها ایجاد نکنید چرا که در این صورت برخی از جداول سیستمی (sysindex , syscolumn , syscomments) در حالت Lock باقی می مانند و عملا تا پایان Transaction ازاد نمی شوند و بنابراین بسیاری از دستورات که توسط کاربران دیگر صادر می شود تا پایان Transaction غیر قابل اجرا خواهد بود . برای جلوگیری از این مشکل بهتر است قبل از Transaction ان را ایجاد کنید تا جداول سیستمی Lock نشوند .

منابع و مآخذ :
http://ably.ir/tag/Temp
http://stackoverflow.com/questions/6595781/whats-the-benefit-of-doing-temporary-tables-table-instead-of-persistent-tabl
اموزش دستورات مختصر و مفید اس کیو ال نوشته بهزاد خالقی
جمع آموری و ترجمه: سرکار خانم مهندس شیرانی