SQL Server 临时数据库问题

发布于 2024-09-07 11:38:47 字数 239 浏览 5 评论 0原文

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

我的问题是,

  1. 临时数据库的用途是什么?
  2. 临时数据库这么大是正常情况吗?如果没有,有什么方法可以清理临时数据库而不影响系统性能和可靠性?

提前致谢, 乔治

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,

  1. What temp DB is used for?
  2. 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

才能让你更想念 2024-09-14 11:39:00

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.

你是年少的欢喜 2024-09-14 11:38:56

您可以使用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”行之后到期。这样一来,效果就更加明显了。编写有效的查询也会有所帮助。

You can shrink the tempdb mdf/ldf files using the shrinkfile, shrinkdatabase DBCC commands.

use tempdb
go

dbcc shrinkfile (tempdev, 'target size in MB')
go

dbcc shrinkfile (templog, 'target size in MB')
go

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.

;With CTETable as
(
  SELECT <Columnlist> FROM <TableName> {Joins} WHERE <Condition> GROUP BY <Column List> ORDER BY <COlumn> ASC
)

SELECT ColumnList from CTETABLE
....
Statements

The scope of that CTEtable expires after "SELECT ColumnList from CTETABLE" Line. This way it is more effective. Writing effective queries would also help.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文