SQL Server 临时数据库问题
我在Windows Server 2008上使用SQL Server 2008。我发现临时DB mdf和temp ldf非常大(大约13G),并且它几乎与所有其他实际应用程序数据库文件(mdf + ldf)的大小相同。
我的问题是,
- 临时数据库的用途是什么?
- 临时数据库这么大是正常情况吗?如果没有,有什么方法可以清理临时数据库而不影响系统性能和可靠性?
提前致谢, 乔治
I am using SQL Server 2008 on Windows Server 2008. I find the temp DB mdf and temp ldf is very big (about 13G), and it is almost the same size of all other real application database files (mdf+ldf).
My questions,
- What temp DB is used for?
- Is it normal situation that temp DB is so big? If not, any ways to clean-up temp DB without impacting system performance and reliability?
thanks in advance,
George
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
1:TempDb 用于排序之类的事情。任何临时的。愚蠢的开发人员不必要地使用 DISTINCT 语句,这就是它的一部分。加上临时表。
2:不会。在极少数情况下可能会出现这种情况,但这些都是不寻常的边缘情况。 Tempdb 清理...重新启动服务器。 Tempdb 在每次启动时都会完全重新生成。然后开始寻找前往 tempdb 的查询。这将需要一些手动工作。检查是否有不必要使用的 DISTINCT 子句。
1: TempDb is used for things like sort. Anythin temporary. Stupid developers needlessly using the DISTINCT statement are hitting it part. Plus temporary tables.
2: No. There are rare cases this may be the case, but these are unusual edge cases. Tempdb cleanup.... restart server. Tempdb is totally regenerated on every start. Then start looking for queries going to tempdb. This will require some manual work. Check for DISTINCT clauses used needlessly.
您可以使用shrinkfile、shrinkdatabase DBCC 命令收缩tempdb mdf/ldf 文件。
以高效的方式编写代码可以避免 tempdb 的增长。避免在代码中使用“游标”,这是性能的主要杀手,游标的数据集越大,tempdb 的大小就越大。不必要时避免使用临时表。在不需要时在整个范围内使用 #temptable、##temptable 将再次导致性能问题。
SQL 2005/2008 具有 CTE,您可以在其中查询临时表上的数据,范围仅限于该表之后的一行。
该 CTEtable 的范围在“SELECT ColumnList from CTETABLE”行之后到期。这样一来,效果就更加明显了。编写有效的查询也会有所帮助。
You can shrink the tempdb mdf/ldf files using the shrinkfile, shrinkdatabase DBCC commands.
Writing code in an efficient manner can avoid the growth of the tempdb. Avoid using "cursors" in your code which are major killers of performance and the larger the dataset of the cursor the larger the size of the tempdb. Avoid using temp tables when its not necassary. using #temptable, ##temptable for the entire scope when its not required will cause performance issues again.
SQL 2005/2008 has CTEs where in you can query data on a temp table and the scope is just one line after that.
The scope of that CTEtable expires after "SELECT ColumnList from CTETABLE" Line. This way it is more effective. Writing effective queries would also help.