SQL Server tempDB问题

时间:2010-06-26 05:49:11

标签: sql-server-2008 windows-server

我在Windows Server 2008上使用SQL Server 2008.我发现临时数据库mdf和temp ldf非常大(大约13G),并且几乎与所有其他实际应用程序数据库文件(mdf + ldf)的大小相同

我的问题,

  1. 使用什么临时数据库?
  2. 临时数据库这么大是正常的情况吗?如果没有,有什么方法可以在不影响系统性能和可靠性的情况下清理临时数据库?
  3. 提前谢谢, 乔治

2 个答案:

答案 0 :(得分:2)

您可以使用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的范围在“来自CTETABLE的SELECT ColumnList”行之后到期。这样它更有效。编写有效的查询也会有所帮助。

答案 1 :(得分:1)

1:TempDb用于排序等事情。任何暂时的。不必要地使用DISTINCT语句的愚蠢开发人员正在使用它。加临时表。

2:不会。在极少数情况下可能会出现这种情况,但这些都是不寻常的边缘情况。 Tempdb清理....重启服务器。 Tempdb在每次启动时都会完全重新生成。然后开始寻找转到tempdb的查询。这将需要一些手动工作。检查不必要的DISTINCT子句。