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
    • 最新
    • 标签
主页 / server / 问题 / 57786
Accepted
MichaelGG
MichaelGG
Asked: 2009-08-24 06:49:29 +0800 CST2009-08-24 06:49:29 +0800 CST 2009-08-24 06:49:29 +0800 CST

大量tempdb日志写入,没有读取

  • 772

我遇到了一些对我来说很奇怪的行为。我在 Windows 7 上使用 SQL Server 2008 Enterprise,32 位(四核 2)(用于测试)。

我有一个使用两个表变量的存储过程。一个插入大约 2 或 3 行,另一个插入 0 到 100 行。然后我从第二个中选择大概 20-60 行,仅此而已。

性能相当快。我创建了一个简单的应用程序来循环执行查询,我可以使用 1 个线程执行 1300/秒,使用 4 个线程执行大约 4000 个。

输入 tempdb:当我打开资源监视器查看发生了什么时,我看到有大量写入 tempdb 日志文件。(我在 2 个不同的物理磁盘上创建了 2、100MB - 它们似乎没有超过 100MB。)读取活动为零- 整个数据库都适合 RAM。

在单线程运行查询的情况下,对 tempdb 日志文件的写入速度约为 3MB/秒。随着我的增加,每个日志文件的速度会上升到 20MB/秒。

在 SQL 活动监视器中,当我使用 5 个线程时,“等待时间”的“日志记录”超过 300 毫秒/秒。在 3 个线程时,它降至 25 毫秒/秒。

问题:发生了什么事?为什么 SQL 会疯狂地写入 tempdb 日志,但发出零读取(我在资源监视器或活动监视器中看不到读取活动)?在非测试环境中,在我看来,额外的 40MB/秒写入可能会损害整体性能。

我知道表变量(@foo)并不总是存储在内存中,但我很困惑为什么 tempdb 必须记录所有这些东西。我该如何解决它在做什么?我可以将 tempdb 的日志放在 ramdisk 上吗?还有其他指针吗?

提前致谢!

sql-server
  • 1 1 个回答
  • 2945 Views

1 个回答

  • Voted
  1. Best Answer
    Remus Rusanu
    2009-08-24T14:20:59+08:002009-08-24T14:20:59+08:00

    这是典型的日志预写行为。当数据库中的页面更新时,更新首先写入日志,然后应用于内存页面。该页面在内存中保持脏状态,直到发生检查点,此时它被写入磁盘。必须在更新之前写入日志以支持恢复和回滚。除非发生这两种情况之一(恢复或回滚),否则无需再次读取日志。因此,您看到的行为对于修改 tempdb 中的页面的系统来说是典型的。如果发生回滚,您只会看到日志读取(因为 tempdb 无法进行恢复)。

    一个更有趣的问题是,为什么 tempdb 中会发生如此多的页面更新?典型的罪魁祸首是直接更新(例如,带有 ASP 的 tempdb 中的会话状态)或间接更新(查询计划中的假脱机和排序)。

    • 1

相关问题

  • sql server 连接字符串上的网络数据包大小以提高吞吐量

  • 基于 Microsoft 的服务器(IIS、MSSQL 等)上的病毒扫描应排除哪些内容?

  • SQL 洗衣清单

  • OPENROWSET、二进制文件、varchars 和 varbinaries

  • 聚集索引与非聚集索引?

Sidebar

Stats

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

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

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

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve