AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 94165
Accepted
Reaces
Reaces
Asked: 2015-03-03 04:37:26 +0800 CST2015-03-03 04:37:26 +0800 CST 2015-03-03 04:37:26 +0800 CST

Tempdb 正在增长,但是它有很多可用空间

  • 772

在专用于 Dynamics CRM 数据库的 sql 服务器上,我看到了一些奇怪的行为。

在使用以下查询作为基础监控增长时,我注意到 tempdb 在过去几个小时内增长非常频繁:

DECLARE @path NVARCHAR(1000)
SELECT @path = Substring(PATH, 1, Len(PATH) - Charindex('\', Reverse(PATH))) +
                      '\log.trc'
FROM   sys.traces
WHERE  id = 1
SELECT databasename,
       e.name   AS eventname,
       cat.name AS [CategoryName],
       starttime,
       e.category_id,
       loginname,
       loginsid,
       spid,
       hostname,
       applicationname,
       servername,
       textdata,
       objectname,
       eventclass,
       eventsubclass
FROM   ::fn_trace_gettable(@path, 0)
       INNER JOIN sys.trace_events e
         ON eventclass = trace_event_id
       INNER JOIN sys.trace_categories AS cat
         ON e.category_id = cat.category_id
WHERE  e.name IN( 'Data File Auto Grow', 'Log File Auto Grow' )
ORDER  BY starttime DESC 

给出数据文件的几行增长:

tempdb  Data File Auto Grow Database    2015-03-02 09:50:33.187 2

但是,当我查看 tempdb 占用的空间时,我没有看到空间紧缩的位置:

USE tempdb 
GO 
SELECT DB_NAME() AS DbName, 
name AS FileName, 
size/128.0 AS CurrentSizeMB,  
size/128.0 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS INT)/128.0 AS FreeSpaceMB 
FROM sys.database_files; 

给出以下输出:

DbName  FileName    CurrentSizeMB   FreeSpaceMB
tempdb  tempdev     7500.000000     7492.625000
tempdb  templog     156.132812      93.820312
tempdb  tempdev2    7250.000000     7245.625000
tempdb  tempdev3    7250.000000     7245.312500
tempdb  tempdev4    7366.500000     7360.875000

维护 CRM 的人要求我们缩小 tempdb。
我的同事过去曾有义务。但是我不愿意在没有解释的情况下这样做。尤其是考虑到收缩已经成为几乎每周都会发生的事情。

谁能告诉我为什么 tempdb 有这么多增长事件,以及如何正确处理?
我目前正在考虑要求更多存储空间,并将 tempdb 驱动器增加 50%。
然而,这感觉就像治疗症状,而不是原因。

sql-server sql-server-2008-r2
  • 3 3 个回答
  • 7276 Views

3 个回答

  • Voted
  1. BradC
    2018-01-04T08:41:34+08:002018-01-04T08:41:34+08:00

    这是一个老问题,但看起来它应该得到一个更普遍的答案。

    关于 SQL Server 上 tempdb 大小的标准建议是使其足够大以处理服务器向其抛出的任何常规活动,并停止对增长和收缩进行微观管理。

    SQL 使用 tempdb 处理大量内容:内存排序、表重新索引、显式创建的临时表、数据库快照等。SQL 应根据需要使用 tempdb 中的空间,并在完成后在内部释放它。整体文件大小不应该一直改变。零理由继续将该空间回收回操作系统,SQL 可能很快会再次需要它。确定 tempdb 使用量是否“正常”的唯一方法是随着时间的推移对其进行监控。

    作为生产 DBA,我会拒绝应用程序团队提出的缩减 tempdb 的请求,至少无需进行大量进一步讨论。这也适用于“供应商建议”;即使供应商是 Microsoft - MS CRM 团队(以及 SharePoint 团队和 System Center 团队等)也不是 Microsoft SQL 产品团队。

    您的帖子没有说明您的用户数据库有多大,但根据我作为生产 DBA 的经验,30GB 的 tempdb 数据文件一点也不大。事实上,如果您仍然看到 tempdb 数据文件增长到 30GB,那么与他们的要求相反,您需要使其更大,而不是更小。如果您的用户数据库非常大(100 GB 或 TB),则 100 GB 或更大的 Tempdb 大小并不少见。

    为 SQL 提供完成其工作所需的磁盘空间。

    另一方面,您的 tempdb日志文件非常小。在您的情况下,我可能会将其设为数据文件总大小的 25% 或更多。

    综上所述,在您的情况下,我可能会尝试以下操作:

    • 4 个数据文件,每个 20GB 大小。1GB的增长率。
    • 1x 日志文件,20GB 大小,4GB 增长率。

    继续监控,看看这是否足够大,或者它们是否继续增长。

    有一些活动(写得不好的查询、重新索引大表等)可能会破坏日志,并且需要更有针对性地关注到底是什么导致了问题。

    • 3
  2. Best Answer
    EMarkM
    2015-03-03T06:03:36+08:002015-03-03T06:03:36+08:00

    TempDB 文件的自动增长模型是什么?微小的增量会导致许多小的自动增长,而大的增量会导致更少但更密集的增长例程。

    大概是因为在服务器上运行的查询正在构造大量临时表、表变量或游标等,所以 TempDB 正在增长?

    是否知道正在运行哪些查询,是否有历史基线来比较自动增长和大小?

    如果事情突然发生了变化,并且组织没有显着增加它使用的实际数据量,我猜想开发人员或报告用户已经改变了他们运行查询的方式。

    关于上述内容,我认为我们需要您提供更多信息。

    • 2
  3. bp_
    2018-01-04T08:08:45+08:002018-01-04T08:08:45+08:00

    虽然我遇到了同样的问题,但我遇到了不同的解决方案。

    问题: tempdb 数据文件位于 99% 的未使用空间。磁盘空间接近于零。我在磁盘上释放了一些空间,在 24 小时内数据文件已经增长到再次消耗所有磁盘空间。他们仍然报告 99% 的未使用空间。

    解决方案: 我们让 checkDB 每天晚上在一个作业中运行。checkDB 在 tempdb 中创建了一个快照,该快照对于 tempdb 来说太大而无法处理并一直失败(我们也试图单独解决作业失败的原因)。事实证明,这两个问题是相互关联的,tempdb 数据文件被填充并随着 checkDB 作业自动增长,这会因为磁盘空间不足而失败。正在检查的数据库超过 TB。

    希望这会为未来的 Google 员工增加上述解决方案。

    • 2

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve