我在 Windows Server 2008 上使用 SQL Server 2008。我发现 temp DB mdf 和 temp ldf 非常大(大约 13G),并且几乎与所有其他实际应用程序数据库文件(mdf+ldf)的大小相同。
我的问题,
- 什么临时数据库用于?
- 临时数据库这么大是正常情况吗?如果没有,有什么方法可以在不影响系统性能和可靠性的情况下清理临时数据库?
提前谢谢,乔治
我在 Windows Server 2008 上使用 SQL Server 2008。我发现 temp DB mdf 和 temp ldf 非常大(大约 13G),并且几乎与所有其他实际应用程序数据库文件(mdf+ldf)的大小相同。
我的问题,
提前谢谢,乔治
您可以使用 shrinkfile、shrinkdatabase DBCC 命令收缩 tempdb mdf/ldf 文件。
use tempdb
go
dbcc shrinkfile (tempdev, 'target size in MB')
go
dbcc shrinkfile (templog, 'target size in MB')
go
以高效的方式编写代码可以避免 tempdb 的增长。避免在代码中使用“游标”,这是性能的主要杀手,游标的数据集越大,tempdb 的大小就越大。在不需要时避免使用临时表。在不需要时对整个范围使用#temptable、##temptable 将再次导致性能问题。
SQL 2005/2008 具有 CTE,您可以在其中查询临时表上的数据,并且范围只是在那之后的一行。
;With CTETable as
(
SELECT <Columnlist> FROM <TableName> {Joins} WHERE <Condition> GROUP BY <Column List> ORDER BY <COlumn> ASC
)
SELECT ColumnList from CTETABLE
....
Statements
该 CTEtable 的范围在“SELECT ColumnList from CTETABLE”行之后到期。这种方式更有效。编写有效的查询也会有所帮助。
1:TempDb 用于排序之类的事情。任何暂时的。不必要地使用 DISTINCT 语句的愚蠢开发人员正在达到目的。加上临时表。
2:不。在极少数情况下可能会出现这种情况,但这些是不寻常的边缘情况。Tempdb 清理.... 重新启动服务器。每次启动时都会完全重新生成 Tempdb。然后开始寻找到 tempdb 的查询。这将需要一些手工工作。检查不必要的 DISTINCT 子句。