এসকিউএল সার্ভারে টেম্প টেবিল এবং টেবিলের পরিবর্তনশীলগুলির মধ্যে পার্থক্য কী?


390

এসকিউএল সার্ভার 2005-এ, আমরা দুটি উপায়ের মধ্যে একটিতে টেম্প টেবিল তৈরি করতে পারি:

declare @tmp table (Col1 int, Col2 int);

অথবা

create table #tmp (Col1 int, Col2 int);

এই দুইয়ের মধ্যে পার্থক্য কী? @Tmp এখনও টেম্পডিবি ব্যবহার করে কিনা, বা মেমরিতে সবকিছু ঘটে কিনা তা নিয়ে আমি বিরোধী মতামত পড়েছি।

কোন পরিস্থিতিতে একটি অন্যটি সম্পাদন করে?



2
পিনাল ডেভের সত্যিই এখানে একটি ভাল লেখা আছে ... ব্লগ.সক্লোরটিটিটি
সাম

উত্তর:


392

অস্থায়ী টেবিলগুলি (# টিএমপি) এবং টেবিল ভেরিয়েবলগুলি (@ টিএমপি) এর মধ্যে কয়েকটি পার্থক্য রয়েছে যদিও নীচের এমএসডিএন লিঙ্কে বর্ণিত টেম্পিডবি ব্যবহার করা সেগুলির মধ্যে একটি নয়।

থাম্বের নিয়ম হিসাবে, ছোট থেকে মাঝারি পরিমাণের ডেটা এবং সাধারণ ব্যবহারের পরিস্থিতিতে আপনার টেবিলের ভেরিয়েবলগুলি ব্যবহার করা উচিত। (এটি অবশ্যই প্রচুর ব্যতিক্রম সহ একটি অত্যধিক বিস্তৃত গাইডলাইন - নীচে এবং নীচের নিবন্ধগুলি দেখুন))

তাদের মধ্যে নির্বাচন করার সময় কিছু বিষয় বিবেচনা করতে হবে:

  • অস্থায়ী টেবিলগুলি হ'ল টেবিলগুলি তাই আপনি তৈরি করুন সূচক ইত্যাদির মতো কাজগুলি করতে পারেন ইত্যাদি etc. যদি আপনার কাছে প্রচুর পরিমাণে ডেটা থাকে যার জন্য সূচী দ্বারা অ্যাক্সেস করা দ্রুততর হয় তবে অস্থায়ী টেবিলগুলি একটি ভাল বিকল্প।

  • সারণী ভেরিয়েবলগুলির প্রাথমিক কী বা অনন্য বাধা ব্যবহার করে সূচি থাকতে পারে have (আপনি যদি একটি অনন্য-অনন্য সূচক চান তবে প্রাথমিক কী কলামটি অনন্য সীমাবদ্ধতায় সর্বশেষ কলাম হিসাবে অন্তর্ভুক্ত করুন you আপনার যদি অনন্য কলাম না থাকে তবে আপনি একটি পরিচয় কলাম ব্যবহার করতে পারেন)) এসকিউএল ২০১৪-তেও অ-অনন্য সূচী রয়েছে

  • সারণী ভেরিয়েবলগুলি লেনদেনগুলিতে অংশ নেয় না এবং SELECTএর স্পষ্টতই NOLOCK। লেনদেনের আচরণটি খুব সহায়ক হতে পারে, উদাহরণস্বরূপ আপনি যদি কোনও প্রক্রিয়ার মধ্য দিয়ে রোলব্যাক করতে চান তবে সেই লেনদেনের সময় সারণী ভেরিয়েবলগুলি এখনও পপুলেটেড হবে!

  • টেম্প টেবিলগুলির ফলে সঞ্চিত প্রক্রিয়াগুলি পুনরায় সংমিশ্রিত হতে পারে, সম্ভবত প্রায়শই। সারণী ভেরিয়েবলগুলি তা করবে না।

  • আপনি SELECT INTO ব্যবহার করে একটি টেম্প টেবিল তৈরি করতে পারেন, যা লেখার জন্য দ্রুত হতে পারে (অ্যাড-হক জিজ্ঞাসার জন্য ভাল) এবং আপনাকে সময়ের সাথে সাথে ডেটাটাইপগুলি পরিবর্তন করার সুযোগ দিতে পারে, যেহেতু আপনাকে আপনার টেম্প টেবিল কাঠামোটি সম্মুখভাগে সংজ্ঞায়নের প্রয়োজন হবে না।

  • আপনি ফাংশন থেকে টেবিলের ভেরিয়েবলগুলি পাস করতে পারেন, লজিককে আরও সহজভাবে আবদ্ধ করতে এবং পুনরায় ব্যবহার করতে সক্ষম করে (উদাহরণস্বরূপ কিছু স্বেচ্ছাসেবক ডিলিমিটারের মানগুলির টেবিলে একটি স্ট্রিংকে বিভক্ত করার জন্য একটি ফাংশন তৈরি করুন)।

  • ব্যবহারকারী-সংজ্ঞায়িত ফাংশনগুলির মধ্যে সারণী ভেরিয়েবলগুলি ব্যবহার করা সেই ফাংশনগুলিকে আরও বিস্তৃতভাবে ব্যবহার করতে সক্ষম করে (বিশদটির জন্য ফাংশন তৈরি করুন ডকুমেন্টেশন দেখুন)। যদি আপনি কোনও ফাংশন লিখছেন তবে অন্যথায় বাধ্যতামূলক প্রয়োজন না হলে টেম্প টেবিলের উপরে টেবিলের ভেরিয়েবলগুলি ব্যবহার করা উচিত।

  • টেবিল ভেরিয়েবল এবং টেম্প টেবিল উভয়ই টেম্পডিবায় সংরক্ষণ করা হয়। তবে টেবিল ভেরিয়েবলগুলি (২০০৫ সাল থেকে) বর্তমান ডাটাবেস বনাম টেম্প টেবিলগুলির বিপরীতে ডিফল্ট যা টেম্পডবি ( রেফ ) এর ডিফল্ট কোলেশন নেয় । এর অর্থ যদি আপনি টেম্প টেবিলগুলি ব্যবহার করেন এবং আপনার ডিবি কোলেশনটি টেম্পডিবির চেয়ে পৃথক হয় তবে আপনার কোলেশন সম্পর্কিত সমস্যা সম্পর্কে সচেতন হওয়া উচিত, যদি আপনি আপনার ডাটাবেসের ডেটার সাথে টেম্প টেবিলের ডেটা তুলনা করতে চান তবে সমস্যা দেখা দেয়।

  • গ্লোবাল টেম্প টেবিল (## tmp) হ'ল অন্য ধরণের টেম্প টেবিল যা সমস্ত সেশন এবং ব্যবহারকারীদের জন্য উপলব্ধ।

আরও কিছু পড়া:


26
সারণী ভেরিয়েবলের সূচক থাকতে পারে। কেবল একটি অনন্য বাধা তৈরি করুন এবং আপনি স্বয়ংক্রিয়ভাবে একটি সূচক পান get একটি বিশাল পারফরম্যান্স পার্থক্য। (আপনি যদি কোনও অনন্য সূচক না চান, তবে আপনি যে ক্ষেত্রগুলি চান তার শেষের দিকে আসল প্রাথমিক কী যুক্ত করুন you যদি আপনি একটি না পান তবে একটি পরিচয় কলাম তৈরি করুন)।
বেন

7
@ বেন এবং এসকিউএল সার্ভার 2014 অ টেল ভেরিয়েবলগুলিতে
মার্টিন স্মিথ

4
সারণী ভেরিয়েবলগুলি লেনদেন দ্বারা প্রভাবিত হচ্ছে না কখনও কখনও সহজ হয়। আপনার যদি রোলব্যাকের পরে কিছু রাখতে চান তবে আপনি এটি একটি টেবিল ভেরিয়েবলে রাখতে পারেন।
কুইলব্রেকার

3
পরিসংখ্যানগুলি টেম্প টেবিলগুলির জন্য তৈরি করা হয় যা কোয়েরি পরিকল্পনাগুলি আরও ভাল করে তুলতে পারে তবে টেবিলের ভেরিয়েবলগুলির জন্য নয়। টেম্প টেবিলটি ফেলে দেওয়ার পরে টেম্প টেবিলের পৃষ্ঠাগুলির সাথে এই পরিসংখ্যানগুলি কিছু সময়ের জন্য ক্যাশে করা হয় এবং ক্যাশেড টেবিলটি পুনরায় সক্রিয় করার পরে ভুল হতে পারে।
মাইকেল গ্রিন

সারণী ভেরিয়েবলগুলি ডিফল্টরূপে হয় ব্যবহারকারী-সংজ্ঞায়িত ডেটা টাইপের কোলেশন (যদি কলামটি কোনও ব্যবহারকারী-সংজ্ঞায়িত ডেটা প্রকারের হয়) বা বর্তমান ডাটাবেসের কোলেশন নয় এবং টেম্পডিবির ডিফল্ট কোলেশন নয়। টেম্প টেবিলগুলি টেম্পডিবি ডিফল্ট কোলেশন ব্যবহার করবে। দেখুন: টেকনিকট.মাইক্রোসফট.ইন- ইউএস
এমস

25

কেবলমাত্র গৃহীত উত্তরের দাবির দিকে তাকানো যে টেবিলের ভেরিয়েবলগুলি লগিংয়ে অংশ নেয় না।

এটি সাধারণত অসত্য বলে মনে হয় যে লগিংয়ের পরিমাণের মধ্যে কোনও পার্থক্য রয়েছে (কমপক্ষে টেবিলে insert/ update/ deleteঅপারেশনগুলির জন্য কমপক্ষে যদিও আমি খুঁজে পেয়েছি যে অতিরিক্ত সিস্টেম সারণীর কারণে সঞ্চিত পদ্ধতিতে ক্যাশেড অস্থায়ী বস্তুর ক্ষেত্রে এই সম্মানের মধ্যে কিছুটা ছোট পার্থক্য রয়েছে) আপডেট)।

আমি নিম্নলিখিত ক্রিয়াকলাপগুলির জন্য একটি @table_variableএবং একটি #tempটেবিল উভয়ের বিরুদ্ধে লগিং আচরণের দিকে লক্ষ্য করেছি ।

  1. সফল সন্নিবেশ
  2. একাধিক সারি সন্নিবেশ করান যেখানে সীমাবদ্ধতা লঙ্ঘনের কারণে বিবৃতিটি আবার ঘুরিয়ে দেয়।
  3. হালনাগাদ
  4. মুছে ফেলা
  5. ডি-এলোকেট

লেনদেন লগ রেকর্ডগুলি সমস্ত ক্রিয়াকলাপের জন্য প্রায় অভিন্ন ছিল।

টেবিল ভেরিয়েবল সংস্করণটিতে আসলে কয়েকটি অতিরিক্ত লগ এন্ট্রি থাকে কারণ এটি sys.syssingleobjrefsবেস টেবিলের সাথে যুক্ত (এবং পরে সরিয়ে দেওয়া) এন্ট্রি পায় তবে সামগ্রিকভাবে কয়েকটি কম বাইট থাকায় টেবিলের পরিবর্তে অভ্যন্তরীণ নামটি 236 কম বাইট গ্রহণ #tempকরে (১১৮ টিরও কম nvarcharঅক্ষর)।

পুনরুত্পাদন করার জন্য পূর্ণ স্ক্রিপ্ট (একক ব্যবহারকারী মোডে এবং sqlcmdমোড ব্যবহার করে একটি উদাহরণে সেরা রান )

:setvar tablename "@T" 
:setvar tablescript "DECLARE @T TABLE"

/*
 --Uncomment this section to test a #temp table
:setvar tablename "#T" 
:setvar tablescript "CREATE TABLE #T"
*/

USE tempdb 
GO    
CHECKPOINT

DECLARE @LSN NVARCHAR(25)

SELECT @LSN = MAX([Current LSN])
FROM fn_dblog(null, null) 


EXEC(N'BEGIN TRAN StartBatch
SAVE TRAN StartBatch
COMMIT

$(tablescript)
(
[4CA996AC-C7E1-48B5-B48A-E721E7A435F0] INT PRIMARY KEY DEFAULT 0,
InRowFiller char(7000) DEFAULT ''A'',
OffRowFiller varchar(8000) DEFAULT REPLICATE(''B'',8000),
LOBFiller varchar(max) DEFAULT REPLICATE(cast(''C'' as varchar(max)),10000)
)


BEGIN TRAN InsertFirstRow
SAVE TRAN InsertFirstRow
COMMIT

INSERT INTO $(tablename)
DEFAULT VALUES

BEGIN TRAN Insert9Rows
SAVE TRAN Insert9Rows
COMMIT


INSERT INTO $(tablename) ([4CA996AC-C7E1-48B5-B48A-E721E7A435F0])
SELECT TOP 9 ROW_NUMBER() OVER (ORDER BY (SELECT 0))
FROM sys.all_columns

BEGIN TRAN InsertFailure
SAVE TRAN InsertFailure
COMMIT


/*Try and Insert 10 rows, the 10th one will cause a constraint violation*/
BEGIN TRY
INSERT INTO $(tablename) ([4CA996AC-C7E1-48B5-B48A-E721E7A435F0])
SELECT TOP (10) (10 + ROW_NUMBER() OVER (ORDER BY (SELECT 0))) % 20
FROM sys.all_columns
END TRY
BEGIN CATCH
PRINT ERROR_MESSAGE()
END CATCH

BEGIN TRAN Update10Rows
SAVE TRAN Update10Rows
COMMIT

UPDATE $(tablename)
SET InRowFiller = LOWER(InRowFiller),
    OffRowFiller  =LOWER(OffRowFiller),
    LOBFiller  =LOWER(LOBFiller)


BEGIN TRAN Delete10Rows
SAVE TRAN Delete10Rows
COMMIT

DELETE FROM  $(tablename)
BEGIN TRAN AfterDelete
SAVE TRAN AfterDelete
COMMIT

BEGIN TRAN EndBatch
SAVE TRAN EndBatch
COMMIT')


DECLARE @LSN_HEX NVARCHAR(25) = 
        CAST(CAST(CONVERT(varbinary,SUBSTRING(@LSN, 1, 8),2) AS INT) AS VARCHAR) + ':' +
        CAST(CAST(CONVERT(varbinary,SUBSTRING(@LSN, 10, 8),2) AS INT) AS VARCHAR) + ':' +
        CAST(CAST(CONVERT(varbinary,SUBSTRING(@LSN, 19, 4),2) AS INT) AS VARCHAR)        

SELECT 
    [Operation],
    [Context],
    [AllocUnitName],
    [Transaction Name],
    [Description]
FROM   fn_dblog(@LSN_HEX, null) AS D
WHERE  [Current LSN] > @LSN  

SELECT CASE
         WHEN GROUPING(Operation) = 1 THEN 'Total'
         ELSE Operation
       END AS Operation,
       Context,
       AllocUnitName,
       COALESCE(SUM([Log Record Length]), 0) AS [Size in Bytes],
       COUNT(*)                              AS Cnt
FROM   fn_dblog(@LSN_HEX, null) AS D
WHERE  [Current LSN] > @LSN  
GROUP BY GROUPING SETS((Operation, Context, AllocUnitName),())

ফলাফল

+-----------------------+--------------------+---------------------------+---------------+------+---------------+------+------------------+
|                       |                    |                           |             @TV      |             #TV      |                  |
+-----------------------+--------------------+---------------------------+---------------+------+---------------+------+------------------+
| Operation             | Context            | AllocUnitName             | Size in Bytes | Cnt  | Size in Bytes | Cnt  | Difference Bytes |
+-----------------------+--------------------+---------------------------+---------------+------+---------------+------+------------------+
| LOP_ABORT_XACT        | LCX_NULL           |                           | 52            | 1    | 52            | 1    |                  |
| LOP_BEGIN_XACT        | LCX_NULL           |                           | 6056          | 50   | 6056          | 50   |                  |
| LOP_COMMIT_XACT       | LCX_NULL           |                           | 2548          | 49   | 2548          | 49   |                  |
| LOP_COUNT_DELTA       | LCX_CLUSTERED      | sys.sysallocunits.clust   | 624           | 3    | 624           | 3    |                  |
| LOP_COUNT_DELTA       | LCX_CLUSTERED      | sys.sysrowsets.clust      | 208           | 1    | 208           | 1    |                  |
| LOP_COUNT_DELTA       | LCX_CLUSTERED      | sys.sysrscols.clst        | 832           | 4    | 832           | 4    |                  |
| LOP_CREATE_ALLOCCHAIN | LCX_NULL           |                           | 120           | 3    | 120           | 3    |                  |
| LOP_DELETE_ROWS       | LCX_INDEX_INTERIOR | Unknown Alloc Unit        | 720           | 9    | 720           | 9    |                  |
| LOP_DELETE_ROWS       | LCX_MARK_AS_GHOST  | sys.sysallocunits.clust   | 444           | 3    | 444           | 3    |                  |
| LOP_DELETE_ROWS       | LCX_MARK_AS_GHOST  | sys.sysallocunits.nc      | 276           | 3    | 276           | 3    |                  |
| LOP_DELETE_ROWS       | LCX_MARK_AS_GHOST  | sys.syscolpars.clst       | 628           | 4    | 628           | 4    |                  |
| LOP_DELETE_ROWS       | LCX_MARK_AS_GHOST  | sys.syscolpars.nc         | 484           | 4    | 484           | 4    |                  |
| LOP_DELETE_ROWS       | LCX_MARK_AS_GHOST  | sys.sysidxstats.clst      | 176           | 1    | 176           | 1    |                  |
| LOP_DELETE_ROWS       | LCX_MARK_AS_GHOST  | sys.sysidxstats.nc        | 144           | 1    | 144           | 1    |                  |
| LOP_DELETE_ROWS       | LCX_MARK_AS_GHOST  | sys.sysiscols.clst        | 100           | 1    | 100           | 1    |                  |
| LOP_DELETE_ROWS       | LCX_MARK_AS_GHOST  | sys.sysiscols.nc1         | 88            | 1    | 88            | 1    |                  |
| LOP_DELETE_ROWS       | LCX_MARK_AS_GHOST  | sys.sysobjvalues.clst     | 596           | 5    | 596           | 5    |                  |
| LOP_DELETE_ROWS       | LCX_MARK_AS_GHOST  | sys.sysrowsets.clust      | 132           | 1    | 132           | 1    |                  |
| LOP_DELETE_ROWS       | LCX_MARK_AS_GHOST  | sys.sysrscols.clst        | 528           | 4    | 528           | 4    |                  |
| LOP_DELETE_ROWS       | LCX_MARK_AS_GHOST  | sys.sysschobjs.clst       | 1040          | 6    | 1276          | 6    | 236              |
| LOP_DELETE_ROWS       | LCX_MARK_AS_GHOST  | sys.sysschobjs.nc1        | 820           | 6    | 1060          | 6    | 240              |
| LOP_DELETE_ROWS       | LCX_MARK_AS_GHOST  | sys.sysschobjs.nc2        | 820           | 6    | 1060          | 6    | 240              |
| LOP_DELETE_ROWS       | LCX_MARK_AS_GHOST  | sys.sysschobjs.nc3        | 480           | 6    | 480           | 6    |                  |
| LOP_DELETE_ROWS       | LCX_MARK_AS_GHOST  | sys.syssingleobjrefs.clst | 96            | 1    |               |      | -96              |
| LOP_DELETE_ROWS       | LCX_MARK_AS_GHOST  | sys.syssingleobjrefs.nc1  | 88            | 1    |               |      | -88              |
| LOP_DELETE_ROWS       | LCX_MARK_AS_GHOST  | Unknown Alloc Unit        | 72092         | 19   | 72092         | 19   |                  |
| LOP_DELETE_ROWS       | LCX_TEXT_MIX       | Unknown Alloc Unit        | 16348         | 37   | 16348         | 37   |                  |
| LOP_FORMAT_PAGE       | LCX_HEAP           | Unknown Alloc Unit        | 1596          | 19   | 1596          | 19   |                  |
| LOP_FORMAT_PAGE       | LCX_IAM            | Unknown Alloc Unit        | 252           | 3    | 252           | 3    |                  |
| LOP_FORMAT_PAGE       | LCX_INDEX_INTERIOR | Unknown Alloc Unit        | 84            | 1    | 84            | 1    |                  |
| LOP_FORMAT_PAGE       | LCX_TEXT_MIX       | Unknown Alloc Unit        | 4788          | 57   | 4788          | 57   |                  |
| LOP_HOBT_DDL          | LCX_NULL           |                           | 108           | 3    | 108           | 3    |                  |
| LOP_HOBT_DELTA        | LCX_NULL           |                           | 9600          | 150  | 9600          | 150  |                  |
| LOP_INSERT_ROWS       | LCX_CLUSTERED      | sys.sysallocunits.clust   | 456           | 3    | 456           | 3    |                  |
| LOP_INSERT_ROWS       | LCX_CLUSTERED      | sys.syscolpars.clst       | 644           | 4    | 644           | 4    |                  |
| LOP_INSERT_ROWS       | LCX_CLUSTERED      | sys.sysidxstats.clst      | 180           | 1    | 180           | 1    |                  |
| LOP_INSERT_ROWS       | LCX_CLUSTERED      | sys.sysiscols.clst        | 104           | 1    | 104           | 1    |                  |
| LOP_INSERT_ROWS       | LCX_CLUSTERED      | sys.sysobjvalues.clst     | 616           | 5    | 616           | 5    |                  |
| LOP_INSERT_ROWS       | LCX_CLUSTERED      | sys.sysrowsets.clust      | 136           | 1    | 136           | 1    |                  |
| LOP_INSERT_ROWS       | LCX_CLUSTERED      | sys.sysrscols.clst        | 544           | 4    | 544           | 4    |                  |
| LOP_INSERT_ROWS       | LCX_CLUSTERED      | sys.sysschobjs.clst       | 1064          | 6    | 1300          | 6    | 236              |
| LOP_INSERT_ROWS       | LCX_CLUSTERED      | sys.syssingleobjrefs.clst | 100           | 1    |               |      | -100             |
| LOP_INSERT_ROWS       | LCX_CLUSTERED      | Unknown Alloc Unit        | 135888        | 19   | 135888        | 19   |                  |
| LOP_INSERT_ROWS       | LCX_INDEX_INTERIOR | Unknown Alloc Unit        | 1596          | 19   | 1596          | 19   |                  |
| LOP_INSERT_ROWS       | LCX_INDEX_LEAF     | sys.sysallocunits.nc      | 288           | 3    | 288           | 3    |                  |
| LOP_INSERT_ROWS       | LCX_INDEX_LEAF     | sys.syscolpars.nc         | 500           | 4    | 500           | 4    |                  |
| LOP_INSERT_ROWS       | LCX_INDEX_LEAF     | sys.sysidxstats.nc        | 148           | 1    | 148           | 1    |                  |
| LOP_INSERT_ROWS       | LCX_INDEX_LEAF     | sys.sysiscols.nc1         | 92            | 1    | 92            | 1    |                  |
| LOP_INSERT_ROWS       | LCX_INDEX_LEAF     | sys.sysschobjs.nc1        | 844           | 6    | 1084          | 6    | 240              |
| LOP_INSERT_ROWS       | LCX_INDEX_LEAF     | sys.sysschobjs.nc2        | 844           | 6    | 1084          | 6    | 240              |
| LOP_INSERT_ROWS       | LCX_INDEX_LEAF     | sys.sysschobjs.nc3        | 504           | 6    | 504           | 6    |                  |
| LOP_INSERT_ROWS       | LCX_INDEX_LEAF     | sys.syssingleobjrefs.nc1  | 92            | 1    |               |      | -92              |
| LOP_INSERT_ROWS       | LCX_TEXT_MIX       | Unknown Alloc Unit        | 5112          | 71   | 5112          | 71   |                  |
| LOP_MARK_SAVEPOINT    | LCX_NULL           |                           | 508           | 8    | 508           | 8    |                  |
| LOP_MODIFY_COLUMNS    | LCX_CLUSTERED      | Unknown Alloc Unit        | 1560          | 10   | 1560          | 10   |                  |
| LOP_MODIFY_HEADER     | LCX_HEAP           | Unknown Alloc Unit        | 3780          | 45   | 3780          | 45   |                  |
| LOP_MODIFY_ROW        | LCX_CLUSTERED      | sys.syscolpars.clst       | 384           | 4    | 384           | 4    |                  |
| LOP_MODIFY_ROW        | LCX_CLUSTERED      | sys.sysidxstats.clst      | 100           | 1    | 100           | 1    |                  |
| LOP_MODIFY_ROW        | LCX_CLUSTERED      | sys.sysrowsets.clust      | 92            | 1    | 92            | 1    |                  |
| LOP_MODIFY_ROW        | LCX_CLUSTERED      | sys.sysschobjs.clst       | 1144          | 13   | 1144          | 13   |                  |
| LOP_MODIFY_ROW        | LCX_IAM            | Unknown Alloc Unit        | 4224          | 48   | 4224          | 48   |                  |
| LOP_MODIFY_ROW        | LCX_PFS            | Unknown Alloc Unit        | 13632         | 169  | 13632         | 169  |                  |
| LOP_MODIFY_ROW        | LCX_TEXT_MIX       | Unknown Alloc Unit        | 108640        | 120  | 108640        | 120  |                  |
| LOP_ROOT_CHANGE       | LCX_CLUSTERED      | sys.sysallocunits.clust   | 960           | 10   | 960           | 10   |                  |
| LOP_SET_BITS          | LCX_GAM            | Unknown Alloc Unit        | 1200          | 20   | 1200          | 20   |                  |
| LOP_SET_BITS          | LCX_IAM            | Unknown Alloc Unit        | 1080          | 18   | 1080          | 18   |                  |
| LOP_SET_BITS          | LCX_SGAM           | Unknown Alloc Unit        | 120           | 2    | 120           | 2    |                  |
| LOP_SHRINK_NOOP       | LCX_NULL           |                           |               |      | 32            | 1    | 32               |
+-----------------------+--------------------+---------------------------+---------------+------+---------------+------+------------------+
| Total                 |                    |                           | 410144        | 1095 | 411232        | 1092 | 1088             |
+-----------------------+--------------------+---------------------------+---------------+------+---------------+------+------------------+

1
+1 কৌতূহলের বাইরে (এবং কিছুটা পেডেন্টিক হতে হবে)। প্রশ্নটি বেশ পুরানো (আগস্ট ২০০৮), সুতরাং এটি এসকিউএল ২০০৫ সম্পর্কে ছিল Now আপনি কোন সংস্করণ ব্যবহার করেছেন?
xanatos

2
@ এক্সানাটোস - ২০০৮. ২০০৫-এ টেবিলের ভেরিয়েবলগুলি আসলে অসুবিধায় থাকবে কারণ ন্যূনতমভাবে INSERT ... SELECTলগ করা হয়নি এবং আপনি SELECT INTO ... কোনও টেবিল পরিবর্তনশীল করতে পারবেন না ।
মার্টিন স্মিথ

1
লগিং সম্পর্কে দাবি সরাতে আমার উত্তর আপডেট করেছেন মার্টিনস্মিথ ধন্যবাদ Thanks
ররি

18

কোন পরিস্থিতিতে একটি অন্যটি সম্পাদন করে?

ছোট টেবিলগুলির জন্য (1000 টির কম সারি) একটি টেম্প ভেরিয়েবল ব্যবহার করুন, অন্যথায় একটি টেম্প টেবিল ব্যবহার করুন।


17
কোন সমর্থনকারী তথ্য? এটি কেবল নিজের পক্ষে একটি দৃser়তা হিসাবে খুব সহায়ক নয়।
মাইকেল মায়ার্স

8
মাইক্রোসফ্ট 100 টি সারি সীমা প্রস্তাব করেছে: এমএসডিএন.মাইক্রোসফট.ইন- ইউএস / লাইব্রেরি / এমএস 175010.aspx (সেরা অনুশীলন বিভাগটি দেখুন)।
আর্টিমিক্স

একটি ব্যাখ্যা জন্য নীচে আমার উত্তর দেখুন ।
ওয়েইহুই গুও

17

@ ডাব্লুসিএম - আসলে টেবিলের পরিবর্তনশীলটিকে বাছাই করা কেবলমাত্র রাম নয় - এটি আংশিকভাবে ডিস্কে সংরক্ষণ করা যেতে পারে।

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

ভাল ব্যাকগ্রাউন্ড নিবন্ধ


2
ভাল ব্যাকগ্রাউন্ড নিবন্ধ +1। আমি আমার উত্তরটি মুছে ফেলব যেহেতু পরিবর্তনের ফলে এটি খুব বেশি ছাড়বে না এবং ইতিমধ্যে অনেকগুলি ভাল উত্তর রয়েছে
wcm

12
  1. টেম্প টেবিল: একটি টেম্প টেবিল ডেটা তৈরি এবং ব্যাক আপ করা সহজ।

    সারণীর ভেরিয়েবল: তবে যখন আমরা সাধারণত সাধারণ টেবিলগুলি তৈরি করি তখন টেবিলের পরিবর্তনশীলটির সাথে প্রচেষ্টাটি জড়িত।

  2. টেম্প টেবিল: টেম্প টেবিলের ফলাফলটি একাধিক ব্যবহারকারী ব্যবহার করতে পারেন।

    সারণী ভেরিয়েবল: তবে সারণী ভেরিয়েবলটি কেবলমাত্র বর্তমান ব্যবহারকারী দ্বারা ব্যবহার করা যেতে পারে। 

  3. টেম্প টেবিল: টেম্প টেবিলটি টেম্পডিবায় সংরক্ষণ করা হবে। এটি নেটওয়ার্ক ট্র্যাফিক করবে। যখন টেম্প টেবিলটিতে আমাদের বড় ডেটা থাকে তখন এটি ডাটাবেস জুড়ে কাজ করতে হয়। একটি পারফরম্যান্স সমস্যা উপস্থিত থাকবে।

    সারণী ভেরিয়েবল: তবে একটি টেবিল ভেরিয়েবল কিছু ডেটার জন্য শারীরিক স্মৃতিতে সঞ্চয় করবে, তারপরে যখন আকার বাড়বে তখন তা টেম্পডবিতে স্থানান্তরিত হবে।

  4. টেম্প টেবিল: টেম্প টেবিল সমস্ত ডিডিএল ক্রিয়াকলাপ করতে পারে। এটি সূচী তৈরি করতে, নামানো, পরিবর্তন করা ইত্যাদি etc

    সারণী ভেরিয়েবল: অন্যদিকে টেবিল ভেরিয়েবল DDL ক্রিয়াকলাপগুলি করতে দেয় না। তবে টেবিলের ভেরিয়েবল আমাদের কেবল ক্লাস্টারড ইনডেক্স তৈরি করতে দেয়।

  5. টেম্প টেবিল: টেম্প টেবিল বর্তমান সেশন বা গ্লোবালের জন্য ব্যবহার করা যেতে পারে। যাতে একাধিক ব্যবহারকারীর সেশনটি ফলাফলটি টেবিলের মধ্যে ব্যবহার করতে পারে।

    সারণী ভেরিয়েবল: তবে সারণী ভেরিয়েবলটি সেই প্রোগ্রাম পর্যন্ত ব্যবহার করা যায়। (সংরক্ষিত নীতিমালা)

  6. টেম্প টেবিল: টেম্প ভেরিয়েবল লেনদেন ব্যবহার করতে পারে না। আমরা যখন টেম্প টেবিল দিয়ে ডিএমএল অপারেশন করি তখন তা রোলব্যাক বা লেনদেনের প্রতিশ্রুতিবদ্ধ হতে পারে।

    সারণী ভেরিয়েবল: তবে আমরা এটি টেবিল ভেরিয়েবলের জন্য করতে পারি না।

  7. টেম্প টেবিল: ফাংশনগুলি টেম্প ভেরিয়েবল ব্যবহার করতে পারে না। আরও বেশিভাবে আমরা কার্যগুলিতে ডিএমএল অপারেশন করতে পারি না।

    সারণী ভেরিয়েবল: তবে ফাংশনটি আমাদের টেবিল ভেরিয়েবলটি ব্যবহার করতে দেয়। টেবিল ভেরিয়েবল ব্যবহার করে আমরা এটি করতে পারি।

  8. টেম্প টেবিল: যখন আমরা প্রতিটি উপ-পরবর্তী কলগুলির জন্য টেম্প ভেরিয়েবল ব্যবহার করি তখন সঞ্চিত পদ্ধতিটি পুনরায় সংশ্লেষ করতে পারে (একই কার্যকর প্রয়োগ পরিকল্পনা ব্যবহার করতে পারে না)।

    সারণী ভেরিয়েবল: যদিও সারণী ভেরিয়েবল এর মতো হবে না।


8

আপনারা যারা এই মিথটি বিশ্বাস করেন তাদের পক্ষে কেবলমাত্র টেম্পের ভেরিয়েবলগুলি স্মৃতিতে থাকে

প্রথমত, টেবিলের পরিবর্তনশীল মেমরির বাসিন্দা নয়। মেমরির চাপের অধীনে, একটি টেবিল ভেরিয়েবলের পৃষ্ঠাগুলিকে টেম্পডিবির বাইরে ঠেলে দেওয়া যায়।

নিবন্ধটি এখানে পড়ুন: টেম্পডিবি :: টেবিল ভেরিয়েবল বনাম স্থানীয় অস্থায়ী সারণী


3
আপনি কি দুটি উত্তরকে সম্বোধন করে আপনার উত্তরগুলি একক উত্তরে সম্পাদনা করতে পারবেন?
জোশুয়া ড্রেক

7

অন্যান্য প্রধান পার্থক্য হ'ল টেবিল ভেরিয়েবলগুলির কলামের পরিসংখ্যান নেই, যেখানে অস্থায়ী টেবিলগুলি থাকে। এর অর্থ হল যে টেবিলের চলকটিতে সারিটি কত সারি রয়েছে তা কোয়েরি অপটিমাইজার (এটি অনুমান 1) করে, যা সারণী ভেরিয়েবলটিতে সারি সংখ্যক সারি থাকলে অত্যন্ত অনুকূল-অনুকূল পরিকল্পনা তৈরি করতে পারে।


2
rowsকলাম sys.partitionsটেবিল ভেরিয়েবলের জন্য বজায় তাই এটি আসলে জানে কত সারি টেবিল রয়েছে হয়। এটি ব্যবহার করে দেখা যায় OPTION (RECOMPILE)। তবে কলামের পরিসংখ্যানের অভাব মানে এটি নির্দিষ্ট কলামের পূর্বাভাস অনুমান করতে পারে না।
মার্টিন স্মিথ

7

থেকে উদ্ধৃতি নেওয়া; পেশাদার এসকিউএল সার্ভার 2012 অভ্যন্তরীণ এবং সমস্যা সমাধান

পরিসংখ্যান টেম্প টেবিল এবং সারণী ভেরিয়েবলের মধ্যে প্রধান পার্থক্য হ'ল টেবিলের ভেরিয়েবলগুলিতে পরিসংখ্যান তৈরি হয় না। এটির দুটি বড় পরিণতি রয়েছে যার মধ্যে প্রথমটি হল কোয়েরি অপ্টিমাইজার এতে কোনও তথ্য নির্বিশেষে কোনও সারণী ভেরিয়েবলের সারিগুলির সংখ্যার জন্য ফাই xed অনুমান ব্যবহার করে। তদ্ব্যতীত, ডেটা যুক্ত বা অপসারণ অনুমান পরিবর্তন করে না।

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

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

অস্থায়ী টেবিল বনাম সারণী ভেরিয়েবলগুলি

টেবিল বৈচিত্রগুলি স্মৃতিতে তৈরি হয় না

একটি সাধারণ ভুল ধারণা রয়েছে যে টেবিলের ভেরিয়েবলগুলি মেমরি স্ট্রাকচার এবং এগুলি অস্থায়ী টেবিলের চেয়ে দ্রুত সম্পাদন করবে । সিএস নামে একটি ডিএমভিকে ধন্যবাদ। ডিএম _ ডিবি _ সেশন _ স্পেস _ ব্যবহার, যা অধিবেশন দ্বারা টেম্পডিবি ব্যবহার দেখায়, আপনি প্রমাণ করতে পারেন যে এটি নয় । ডিএমভি সাফ করার জন্য এসকিউএল সার্ভারটি পুনঃসূচনা করার পরে, আপনার সেশন _ আইডি ব্যবহারকারীর _ বস্তু _ বরাদ্দ _ পৃষ্ঠা _ গণনার জন্য 0 প্রদান করে তা নিশ্চিত করতে নিম্নলিখিত স্ক্রিপ্টটি চালান:

SELECT session_id,
database_id,
user_objects_alloc_page_count
FROM sys.dm_db_session_space_usage
WHERE session_id > 50 ;

একটি কলাম সহ অস্থায়ী টেবিল তৈরি করতে নীচের স্ক্রিপ্টটি চালিয়ে একটি অস্থায়ী টেবিলটি কতটা স্থান ব্যবহার করে তা পরীক্ষা করতে পারেন এবং এটি একটি সারি দিয়ে পপুলেট করতে পারেন:

CREATE TABLE #TempTable ( ID INT ) ;
INSERT INTO #TempTable ( ID )
VALUES ( 1 ) ;
GO
SELECT session_id,
database_id,
user_objects_alloc_page_count
FROM sys.dm_db_session_space_usage
WHERE session_id > 50 ;

আমার সার্ভারের ফলাফলগুলি ইঙ্গিত দেয় যে টেবিলটি টেম্পিডবিতে একটি পৃষ্ঠা বরাদ্দ করা হয়েছিল। এখন একই স্ক্রিপ্টটি চালান তবে এবার একটি টেবিল ভেরিয়েবল ব্যবহার করুন:

DECLARE @TempTable TABLE ( ID INT ) ;
INSERT INTO @TempTable ( ID )
VALUES ( 1 ) ;
GO
SELECT session_id,
database_id,
user_objects_alloc_page_count
FROM sys.dm_db_session_space_usage
WHERE session_id > 50 ;

কোনটি ব্যবহার করবেন?

আপনি অস্থায়ী টেবিল বা সারণী ভেরিয়েবলগুলি ব্যবহার করেন বা না তা পুরোপুরি পরীক্ষার মাধ্যমে সিদ্ধান্ত নেওয়া উচিত, তবে অস্থায়ী টেবিলগুলির দিকে ডিফল্ট হিসাবে ঝুঁকানো ভাল কারণ সেখানে খুব কম জিনিসই ভুল হতে পারে

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


বস্তুতপক্ষে পরিসংখ্যান টেবিল ভেরিয়েবল উপর নির্মিত দেখতে stackoverflow.com/questions/42824366/...
YuFeng সেন

4

আর একটি পার্থক্য:

একটি সারণী ভের কেবলমাত্র এটি তৈরি করে এমন পদ্ধতির মধ্যে থাকা স্টেটমেন্ট থেকে অ্যাক্সেস করা যায়, সেই পদ্ধতি বা নেস্টেড ডায়নামিক এসকিউএল (এক্সিকিউটিউট বা এসপি_সেক্সিউটসকিএল এর মাধ্যমে) দ্বারা ডাকা অন্য পদ্ধতি থেকে নয়।

অন্যদিকে একটি টেম্প টেবিলের স্কোপগুলিতে কল করা পদ্ধতি এবং নেস্টেড ডায়নামিক এসকিউএল কোড অন্তর্ভুক্ত।

যদি আপনার পদ্ধতি দ্বারা তৈরি করা টেবিলটি অবশ্যই অন্য ব্যবহৃত পদ্ধতিগুলি বা গতিশীল এসকিউএল থেকে অ্যাক্সেসযোগ্য হয় তবে আপনাকে অবশ্যই একটি টেম্প টেবিল ব্যবহার করতে হবে। জটিল পরিস্থিতিতে এটি খুব সহজ হতে পারে।


2

মধ্যে পার্থক্য Temporary Tables (##temp/#temp)এবং Table Variables (@table)হিসাবে:

  1. Table variable (@table)মধ্যে নির্মিত হয় memory। যেখানে একটিতে Temporary table (##temp/#temp)তৈরি করা হয় tempdb database। যাইহোক, যদি কোনও মেমরি চাপ থাকে তবে টেবিল ভেরিয়েবলের পৃষ্ঠাগুলিকে টেম্পডবিতে ঠেলাঠেলি করা যেতে পারে।

  2. Table variablesজড়িত হতে পারে না transactions, logging or locking। এটি তোলে @table faster then #temp। সুতরাং টেবিল পরিবর্তনশীল অস্থায়ী টেবিল দ্রুত হয়।

  3. Temporary tableস্কিমা পরিবর্তন অসদৃশ পারবেন Table variables

  4. Temporary tablesতৈরি রুটিনে এবং শিশুদের রুটিনগুলিতেও দৃশ্যমান। অন্যদিকে, সারণী ভেরিয়েবলগুলি কেবল তৈরি রুটিনে দৃশ্যমান।

  5. Temporary tablesঅনুমতি দেওয়া CREATE INDEXesহয়, পরিবর্তে তারা ব্যবহার করে সূচি থাকতে পারে Table variablesঅনুমতি দেওয়া হয় না ।CREATE INDEXPrimary Key or Unique Constraint


1

আপনি প্রায়শই দুটি তাত্পর্যযুক্ত টেবিলগুলির সাথে প্রতিস্থাপন করতে পারেন যা আরও দ্রুততর হতে পারে তাও বিবেচনা করুন। সমস্ত পারফরম্যান্স টিউনিংয়ের মতো, যদিও কেবলমাত্র আপনার আসল ডেটার বিপরীতে প্রকৃত পরীক্ষাগুলি আপনাকে আপনার নির্দিষ্ট প্রশ্নের জন্য সেরা পন্থা বলতে পারে।


1

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

এটি আরও ব্যাখ্যা করে যে ছোট টেবিলগুলির জন্য আপনার কেন একটি টেম্প ভেরিয়েবল ব্যবহার করা উচিত, অন্যথায় একটি টেম্প টেবিল ব্যবহার করুন, যেমন এসকিউএলমেন্যাস আগে উত্তর দিয়েছিল।

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