标签: tempdb

如何确定哪个查询正在填满 tempdb 事务日志?

我想知道如何识别实际填充 TEMPDB 数据库事务日志的确切查询或存储过程。

sql-server-2005 sql-server-2008 sql-server tempdb transaction-log

75
推荐指数
3
解决办法
19万
查看次数

选择到临时表中通常比选择到实际表中更快吗?

我想我曾经在某处读到过写入 tempdb 比不在 tempdb 中的实际表更快。这在任何情况下都是真的吗?我想我记得它说了一些关于 tempdb 并将数据存储在内存中的特殊内容?

sql-server memory tempdb temporary-tables sql-server-2016

35
推荐指数
2
解决办法
4577
查看次数

如何找到导致tempdb增长的SQL语句?

服务器 (SQL Server 2008) 的 tempdb 每月数次增加到 500GB+。是否可以找出导致此问题的 SQL 语句?问题通常不是由create table #temp...; insert into #temp...select ... into #temp...复杂的连接引起的。

某些 tempdb 文件的初始大小每次也会自动设置为更大的值。如何预防?

有时缓存的计划会阻止调整/缩小文件的大小。如何找到哪一个持有tempdb?

sql-server-2008 sql-server tempdb

29
推荐指数
1
解决办法
7万
查看次数

在生产环境中缩小 Tempdb 的最佳实践

在 SQL Server 2008 中缩小临时数据库时使用的最佳实践是什么?

使用以下方法有风险吗?

use tempdb
GO

DBCC FREEPROCCACHE -- clean cache
DBCC DROPCLEANBUFFERS -- clean buffers
DBCC FREESYSTEMCACHE ('ALL') -- clean system cache
DBCC FREESESSIONCACHE -- clean session cache
DBCC SHRINKDATABASE(tempdb, 10); -- shrink tempdb
dbcc shrinkfile ('tempdev') -- shrink db file
dbcc shrinkfile ('templog') -- shrink log file
GO

-- report the new file sizes
SELECT name, size
FROM sys.master_files
WHERE database_id = DB_ID(N'tempdb');
GO
Run Code Online (Sandbox Code Playgroud)

sql-server shrink tempdb

28
推荐指数
1
解决办法
16万
查看次数

安全地移动和创建新的 tempdb 文件

我想知道两件事:

  • 您如何以最少的停机时间安全地移动 tempdb?
  • 您需要多少个 tempdb 文件?

每个内核是 1 个文件吗?那么四核 = 4 个 tempdb 文件,创建三个新文件?

sql-server sql-server-2008-r2 tempdb

22
推荐指数
3
解决办法
3万
查看次数

SQL Server 内存优化 tempdb 元数据内存使用量不断增长

问题

我们已启用 sp_configure 'tempdb metadata memory-optimized' = 1,现在 tempdb 元数据在我们的一台服务器上占用了 400 GB 以上,并且还在继续增长。内存使用量有所下降,但通常它的内存使用量会不断增加。我们已经有几次服务器实际上崩溃了,因为其他系统进程没有足够的内存来修改 tempdb,这导致整个服务器宕机。

我问的问题

如何防止 SQL Server 内存中优化的 tempdb 元数据不断增长并使我的服务器崩溃?如果有的话,我可以查看哪些其他信息来找到消耗如此多内存的内容?

有关问题的数据

sys.dm_os_memory_clerks

以下查询当前返回 438 GB。

SELECT SUM(domc.pages_kb / 1024.0 / 1024.0) AS pages_gb
FROM sys.dm_os_memory_clerks AS domc
WHERE domc.type LIKE 'MEMORYCLERK_XTP'
Run Code Online (Sandbox Code Playgroud)

sys.dm_db_xtp_memory_consumers

以下查询提供的数据是内存的最大使用量(290 GB)是 memory_consumer_id 为 113 - 'LOB Page Allocator'。它没有object_id 或xtp_object_id,所以我猜它是一个数据库范围的对象。

SELECT ddxmc.memory_consumer_id
     , ddxmc.memory_consumer_type_desc
     , ddxmc.memory_consumer_desc
     , ddxmc.object_id
     , ddxmc.xtp_object_id
     , ddxmc.used_bytes / 1024.0 / 1024.0 / 1024.0 AS used_gb
FROM sys.dm_db_xtp_memory_consumers AS ddxmc
ORDER BY ddxmc.allocated_bytes …
Run Code Online (Sandbox Code Playgroud)

sql-server memory tempdb memory-optimized-tables sql-server-2019

19
推荐指数
1
解决办法
1692
查看次数

查找哪个会话持有哪个临时表

我们有一个 SQL Server 2005 数据库,临时数据库已满。通过进入 SQL Server Management Studio,我可以看到 tempdb 中的所有临时表。是否可以判断哪个会话持有哪个临时表?理想情况下,一个查询将列出每个会话使用的临时表。

谢谢,

sql-server-2005 sql-server tempdb

17
推荐指数
2
解决办法
3万
查看次数

当 SQL Server 没有可用的物理内存时会发生什么?

在谷歌搜索时,我发现了一些相互矛盾的信息。

某些站点指出,当没有为数据留下物理内存时,SQL Server 会将现有数据移动到 TEMPDB(请参阅:SQL Server:揭秘 TempDb 和建议)。

但是其他站点声明,当没有足够的物理内存时,操作系统可以使用 PAGE FILE 并将数据从物理内存移到它(请参阅SQL Server 的页面文件)。

我想知道当 SQL Server 物理内存不足时,它会在哪里写入数据?到 tempdb 还是到 OS Page 文件?或者两者都有?

sql-server data-pages memory tempdb sql-server-2014

16
推荐指数
1
解决办法
2767
查看次数

排序溢出到 tempdb 但估计行等于实际行

在最大内存设置为 25GB 的 SQL Server 2016 SP2 上,我们有一分钟执行大约 80 次的查询。该查询将大约 4000 页溢出到 tempdb。这会导致 tempdb 的磁盘上出现大量 IO。

当您查看查询计划(简化查询)时,您会看到估计行数等于实际行数,但仍然会发生溢出。所以过时的统计数据不能成为问题的原因。

我做了一些测试和以下查询溢出到 Tempdb:

select id --uniqueidentifier
from SortProblem
where [status] ='A'
order by SequenceNumber asc
option (maxdop 1)
Run Code Online (Sandbox Code Playgroud)

但是,如果我选择不同的列,则不会发生溢出:

select startdate --datetime
from SortProblem
where [status] ='A'
order by SequenceNumber asc 
option (maxdop 1)
Run Code Online (Sandbox Code Playgroud)

所以我试图“放大” id 列的大小:

select CONVERT(nvarchar(512),id)
from SortProblem
where [status] ='A'
order by SequenceNumber asc 
option (maxdop 1)
Run Code Online (Sandbox Code Playgroud)

然后也不会发生溢出。

为什么 uniqueidentifier 不会溢出到 tempdb 和 datatime 列?当我删除大约 20000 条记录时,当我选择 id …

sql-server tempdb sorting sql-server-2016 cardinality-estimates

15
推荐指数
1
解决办法
542
查看次数

TempDB 争用

我们在 SQL Server 2014 SP1 上有一个活动的 OLTP 40GB 数据库。发现查询缓慢,IO_Completion 等待,磁盘队列长度上升到 900,SQL Server 停止响应。我们尝试了什么:

  1. 重新启动实例,一分钟后它开始以相同的方式运行。

  2. 第二次重启后,我们更改了每个 tempdb 数据文件的初始大小(创建了 16 个数据文件),它开始正常工作。

注意:我们将表变量用于中间结果集。这些结果集非常小。

一个月内发生了两次。每次我手动向数据文件添加一点空间时,它就会开始正常工作。更有趣的是,我们在 SQL Server 2008 R2 和 SQL Server 2012 上的相同设置(相同的硬件、相同的文件夹和文件设置、相同的工作负载)运行良好。

请帮助我们找到永久解决方案。

所有数据文件的初始大小都是 1000MB,当前每个是 1500MB。都是一样的。每个自动增长是 100MB。在此之前,我们面临 PFS 和 GAM 页面争用,我们增加到 16 个并解决了问题。跟踪标志 1117 和 1118 都已启用。2 个 NUMA 节点上的 24 个内核。所有数据文件都在同一卷上。简单的磁盘,没有 SAN。

实例位于物理机上。带有表变量的查询和带有哈希联接的查询最常产生 IO_Completion 等待。


wBob 的详细回答促使我们进行更详细的搜索。我们之前是怎么错过的:

数据库 'tempdb' 中文件 'templog' 的自动增长被用户取消或在 7704 毫秒后超时。使用 ALTER DATABASE 为此文件设置较小的 FILEGROWTH 值或显式设置新文件大小。

这是我们在发生此类问题时在日志中发现的。我们正在移动 TempDB 以分离快速驱动器。

sql-server tempdb sql-server-2014

14
推荐指数
1
解决办法
804
查看次数