Rajendra Gupta
Configure TempDB data files size

Overview of the Shrink TempDB database in SQL Server

August 15, 2019 by

This article explores the usage of TempDB and different ways to shrink the TempDB database in SQL Server

Each instance of Microsoft SQL Server has a system database TempDB. It is a backbone for the SQL Server instance. Let’s review the TempDB database and its usage with ways to shrink the TempDB database in the further sections of this article.

Few important points about TempDB

  • TempDB is a global resource (available for all connected user) system database
  • SQL Server recreates the TempDB database each time SQL Service restarts. During restart, it takes a copy of MDF and LDF from the model database. The size and number of MDF and LDF files reset to preconfigured size
  • SQL Server does not perform recovery on the TempDB, and previous data is lost
  • TempDB database is always in the Simple recovery model, and we cannot take database backup for it
  • We cannot roll back transactions in the TempDB because it minimally logs the transactions

TempDB Usage Summary

  • Usually, we create local temporary tables (# naming conventions) and global temporary tables (## naming conventions) to prepare intermediate tables. SQL Server creates those temporary tables in the TempDB database
  • We can create or rebuild an index in TempDB using the SORT_IN_TEMPDB= ON clause. SQL Server performs all sorting calculations in the TempDB instead of the database on which the object belongs
  • SQL Server uses the TempDB for the Read COMMITTED SNAPSHOT isolation level. SQL Server uses the row versioning for each record. The old version also gets an additional 14 bytes in the TempDB to track the row versioning
  • Internal objects such as Cursor work tables, Spool operations, Intermediate sorts operations such as GROUP BY, ORDER BY, UNION, DBCC CHECKDB, Temporary large object storage, Service broker event notification
  • In the Multiple Active Result Sets (using MultipleActiveResultSets=True), SQL Server uses the versioning and stores that in the TempDB

You can go through these articles, Configuration, operations and restrictions of the TempDB SQL Server system database and How to monitor the SQL Server TempDB database to get more details on the TempDB database.

Overview of Shrink TempDB activity

Starting from SQL Server 2016, the installation wizard automatically detects the CPU cores and creates the necessary number of database files for the TempDB. It also sets the maximum growth of individual files to 64 MB.

In the following screenshot, you can see the TempDB configuration for my demo SQL instance.

TempDB database configuration

For this demonstration, I will disable the Autogrowth for the TempDB database.

  • Note: Please do not ever do this on the production instance; I am doing it on my test instance for demo purposes only

Disable TempDB database autogrowth

Execute the following query to create a local temporary table and insert data into it.

It gives the following error message. SQL Server could not increase the size of the TempDB log file and unable to perform the transaction. You might think that we disabled the autogrowth, and if we enable autogrowth to resolve the issue. Consider this situation like the TempDB log file grown to the size of the disk, and you do not have sufficient free space in the disk for the log file to grow.

Transaction log full message for the TempDB due to active transactions

Let’s enable the autogrowth for data files with a maximum size of 20MB for each data file. We can see that log file growth for the TempDB is enabled, and it does not have maximum file size.

Configure TempDB data files size

Let’s rerun the query to fill up TempDB and see the error message. SQL Server primary filegroup does not have free space.

TempDB primary filegroup full message

At this point, if you try to refresh SQL instance as well, you get a similar error message.

TempDB error message in SSMS

Different ways to shrink TempDB database

You can look at the disk usage by top tables report to check what are the objects consuming space in the TempDB. Right-click on the TempDB-> go to Reports-> Standard Reports-> Disk Usage by Top Tables.

In this screenshot, we can see #TempTable is consuming the space in the TempDB.

Disk Usage by Top Tables Report

You can drop the existing object in the TempDB, and it should release the space for you. It is not possible every time to drop objects, especially in the production instance. We could lose all previous work due to this.

Shrink TEMPDB using DBCC SHRINKFILE

We can use the DBCC SHRINKFILE command to shrink the data or log file for the TempDB. We do not need a restart of SQL Service in this case.

Execute the following query to get individual file size in TempDB.

Shrink TEMPDB using DBCC SHRINKFILE

Let’s try to shrink TempDev data file using the DBCC SHRINKFILE command.

It performs the shrink, and you get the following output.

Output of DBCC SHRINKFILE

You can further try to shrink the file.

In this way, we need to shrink the individual data or log files.

Shrink TEMPDB using DBCC SHRINKDATABASE command

We can also shrink the TempDB database using the DBCC SHRINKDATABASE command. The Syntax for the command is as follows.

Let’s use this command to shrink TempDB and leave 10 percent free space.

It performs the database level shrink, and you get the following output.

Shrink TEMPDB using DBCC SHRINKDATABASE command

You can check the size of the data and log files for the database using tempdb.sys.database_files.

Output of DBCC SHRINKDATABASE

Resize TempDB using ALTER DATABASE command

We can use the Alter command to resize the tempdb files. Suppose the initial size of the data and log is 1 GB, we can use this command to set it at a lower level.

The following command resizes the TempDEV and TempLog file initial size to 100 MB.

We need to restart SQL Services for this setting to take effect.

Shrink TempDB using SSMS

We can use the SSMS GUI method to shrink the TempDB as well. Right-click on the TempDB and go to Tasks. In the tasks list, click on Shrink, and you can select Database or files.

Shrink TempDB using Management Studio

Both Database and Files options are similar to the DBCC SHRINKDATABASE and DBCC SHRINKFILE command we explained earlier.

Restart SQL Services to Shrink TempDB database

It should be the last option to recycle the TempDB database and resolve the disk space-related issues due to the TempDB data or log file space. In the production instance, it is difficult to find the downtime to restart the SQL Service. Therefore, you should consider the other options first and do it as a last option.

What if you try to shrink Tempdb, but it does not release space?

Sometimes you try to shrink the TempDB database and the command shows successful, but you do not see any free space in the database. It might be due to active transactions, versioning or objects required for the SQL Server in the TempDB as per the current workload.

Referencing to Microsoft article, we should shrink the TempDB when the SQL Server is in idle mode or the single-user mode.

Microsoft article reference for the TempDB

We can still try to shrink the TempDB using the following method.

  • Execute the DBCC DROPCLEANBUFFERS command to flush cached indexes and data pages

  • Execute the DBCC FREEPROCCACHE command to clear the procedural cache

Now, try to shrink the database using the earlier methods. You should give preference to DBCC SHRINKFILE instead of the DBCC SHRINKDATABASE command.

Shrink TempDB in Single user mode

Sometimes you cannot start the SQL Services due to TempDB size, and you require to reset the initial size using the alter database command. Suppose you executed the alter database command to resize the tempdb data file, but accidentally you specified the initial size of the file that is not feasible as per your free disk space. You tried to restart SQL Service, but it could not start because there is not sufficient free space in the drive to create the TempDB files.

You need to start SQL Services in minimal configuration mode and resize the TempDB files.

SQL Services should be in the stopped state to use the minimal configuration mode.

  • Open a command prompt with administrative privilege
  • Go to the SQL Server Binary folder. In my SQL instance, the path for the BINN folder is as follows

    C:\Program Files\Microsoft SQL Server\MSSQL15.SQL2019CTP\MSSQL\Binn

    If you are not sure about the path, right-click on SQL Service in SQL Server Configuration Manager and the properties page, you can look at Binary path

    SQL Service Properties

  • Execute the following command in administrative prompt ( for my SQL2019CTP instance)

    sqlservr.exe -s SQL2019CTP -c -f

    It starts SQL Services in minimal configuration mode, and you can see it as a warning message as well

    Start SQL Service in single user mode

  • Open another command prompt and connect to the SQL server using the SQLCMD

    Connect SQL Service using SQLCMD

    • Note: Only one administrator can connect to SQL Server at this time. If you try to connect, you get the following error message

      Error while connecting database in single user mode

    Now, we can run the alter database command to resize the TempDB. You need to run the alter database command for eachtempdb file

    Alter database command to resize the TempDB

  • Return the administrative command prompt in which we started SQL Service in minimal configuration mode and press CTRL+C to exit

    Exist the single user mode

  • Start the SQL Services using the SQL Server Configuration Manager and verify the changes using the following query

    In the screenshot, we can see that initial size for the TempDev and TempLog file is 100 MB

    Verify TempDB resize

Conclusion

In this article, we explored the importance of the TempDB database in SQL Server and various methods to shrink the TempDB database. You should be aware of all these methods and take appropriate actions if required.

Rajendra Gupta
Latest posts by Rajendra Gupta (see all)
168 Views