جدولهای موقت: فضای کاری برای پرسوجوهای چندمرحلهای
مبتدی
۱۱ دقیقه مطالعه
در درسهای CTE و متغیرها دیدیم چطور نتایج میانی را نگه داریم. جدول موقت (Temporary Table) یک قدم فراتر میرود: یک جدول واقعی میسازد که میتوان چند بار در آن INSERT/UPDATE کرد و رویش ایندکس هم گذاشت — اما بهمحض پایان یافتن اتصال، خودش را خودکار پاک میکند.
جدول موقت در SQL Server: # و ##
| نحو | دامنه |
|---|---|
CREATE TABLE #Temp (...) | فقط در همان اتصال (Session) فعلی قابلدیدن است |
CREATE TABLE ##GlobalTemp (...) | بین همهی اتصالها به SQL Server مشترک است، تا وقتی همه بسته شوند |
جدول موقت در SQLite: TEMP
SQLite (موتور همین Playground) هم از جدول موقت پشتیبانی میکند، فقط با کلمهی کلیدی TEMP بهجای علامت #:
sql
CREATE TEMP TABLE HighValueSales ( product TEXT, revenue INTEGER ); INSERT INTO HighValueSales SELECT product, price * quantity FROM sales WHERE price * quantity > 200000; SELECT * FROM HighValueSales ORDER BY revenue DESC;
بیا این را واقعاً اجرا کنیم:
امتحانش کن — ساخت و پرکردن یک جدول موقت
فقط محصولاتی که درآمدشان از ۲۰۰٬۰۰۰ بیشتر بود، در جدول موقت ذخیره شدند. حالا میتوانستیم چندین پرسوجوی دیگر هم روی همین
HighValueSales بزنیم — بدون اینکه هر بار محاسبهی price * quantity را تکرار کنیم.جدول موقت در برابر CTE — کِی کدام؟
| CTE | جدول موقت | |
|---|---|---|
| طول عمر | فقط همان یک پرسوجو | کل اتصال (Session) |
| قابل تغییر (INSERT/UPDATE)؟ | خیر | بله |
| قابل ایندکسگذاری؟ | خیر | بله |
| مناسب برای | خواناسازی یک پرسوجوی پیچیده | فرآیندهای چندمرحلهای که باید چند بار به همان دادهی میانی مراجعه کنند |
حذف صریح (اختیاری)
جدول موقت خودش با پایان اتصال پاک میشود، اما میتوان زودتر هم آن را حذف کرد:
sql
DROP TABLE HighValueSales;
جمعبندی این درس (و کل فصل ۸)
- جدول موقت، جدولی واقعی و قابلتغییر است که خودکار پاک میشود — در SQL Server با
#/##، در SQLite باTEMP. - بر خلاف CTE، میتوان چند بار به یک جدول موقت مراجعه کرد، رویش
INSERTزد، و حتی ایندکس گذاشت. - برای فرآیندهای چندمرحلهای با دادهی میانی حجیم، جدول موقت از CTE مناسبتر است.
با این درس، فصل ۸ (برنامهنویسی در SQL Server) کامل شد! در فصل بعدی، وارد یکی از مهمترین مباحث پایگاهدادههای واقعی میشویم: تراکنشها — چطور چند دستور را بهعنوان یک واحد غیرقابلتقسیم اجرا کنیم.