Use a table variable if for a very small quantity of data (thousands of bytes)
DECLARE @T TABLE(id INT PRIMARY KEY, Flag BIT);
Use a temporary table for a lot of data
CREATE TABLE #T (id INT PRIMARY KEY, Flag BIT); Temp tables are better in performance. If you use a Table Variable and the Data in the Variable gets too big, the SQL Server converts the Variable automatically into a temp table.
- Temporary Tables are real tables so you can do things like CREATE INDEXes, etc. If you have large amounts of data for which accessing by index will be faster then temporary tables are a good option.
- Table variables can have indexes by using PRIMARY KEY or UNIQUE constraints. (If you want a non-unique index just include the primary key column as the last column in the unique constraint. If you don’t have a unique column, you can use an identity column.) SQL 2014 has non-unique indexes too.
- Table variables don’t participate in transactions and
SELECTs are implicitly with
NOLOCK. The transaction behaviour can be very helpful, for instance if you want to ROLLBACK midway through a procedure then table variables populated during that transaction will still be populated!
- Temp tables might result in stored procedures being recompiled, perhaps often. Table variables will not.
- You can create a temp table using SELECT INTO, which can be quicker to write (good for ad-hoc querying) and may allow you to deal with changing datatypes over time, since you don’t need to define your temp table structure upfront.
- You can pass table variables back from functions, enabling you to encapsulate and reuse logic much easier (eg make a function to split a string into a table of values on some arbitrary delimiter).
- Using Table Variables within user-defined functions enables those functions to be used more widely (see CREATE FUNCTION documentation for details). If you’re writing a function you should use table variables over temp tables unless there’s a compelling need otherwise.
- Both table variables and temp tables are stored in tempdb. But table variables (since 2005) default to the collation of the current database versus temp tables which take the default collation of tempdb (ref). This means you should be aware of collation issues if using temp tables and your db collation is different to tempdb’s, causing problems if you want to compare data in the temp table with data in your database.
- Global Temp Tables (##tmp) are another type of temp table available to all sessions and users.
⇒ Table variable (@table) is created in the memory. Whereas, a Temporary table (#temp) is created in the tempdb database. However, if there is a memory pressure the pages belonging to a table variable may be pushed to tempdb.
⇒ Table variables cannot be involved in transactions, logging or locking. This makes @table faster then #temp. So table variable is faster then temporary table.
⇒ Temporary tables are allowed CREATE INDEXes whereas, Table variables aren’t allowed CREATE INDEX instead they can have index by using Primary Key or Unique Constraint.
⇒ Table variable can be passed as a parameter to functions and stored procedures while the same cannot be done with Temporary tables.
⇒ Temporary tables are visible in the created routine and also in the child routines. Whereas, Table variables are only visible in the created routine.
⇒ Temporary table allows Schema modifications unlike Table variables.