我在Windows Server 2008上使用SQL Server 2008.我发现临时数据库mdf和temp ldf非常大(大约13G),并且几乎与所有其他实际应用程序数据库文件(mdf + ldf)的大小相同
我的问题,
答案 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子句。