【问题标题】:Write SQL data into Memory rather than table将 SQL 数据写入内存而不是表
【发布时间】:2018-05-06 08:31:35
【问题描述】:

我有一个 SQL DB,其中大量 SP 中的日志步骤不断将数百行写入错误日志表并耗尽服务器上的资源。建议的一种解决方案是将日志写入内存,一旦日志计数超过 1000 行,然后将其批量插入到日志表中,而不是不断地写入单独的行。我曾经提到过使用 CLR - 任何人都可以为我指出如何使用它的正确方向吗?以上听起来可行吗?

【问题讨论】:

  • 那么,实际的问题是什么?如何使用内存结构?
  • 如果日志来自不同的存储过程,如何使用批量插入
  • 建议是将所有日志缓冲到内存中,一旦其中有关键数量,它们就会被批量插入到表中——我们的想法是,而不是像现在这样一直不停地写入加载它们然后分批发送。

标签: sql sql-server logging clr


【解决方案1】:

我有一个 SQL 数据库,其中有大量 SP 中的日志步骤 不断将数百行写入错误日志表并使用 服务器上的资源。建议的一种解决方案是编写 登录到内存,一旦日志计数超过 1000 行,然后批量 将其插入日志表中

您已经在写入内存。当您将某些内容写入表时,您永远不会写入磁盘。所有操作都在内存中进行。并且仅在某些时候 SQL Server 会将脏(修改)页面刷新到磁盘。这些时刻是检查点:

出于性能原因,数据库引擎对 数据库页面在内存中—在缓冲区缓存中—并且不写这些 每次更改后将页面写入磁盘。相反,数据库引擎 定期在每个数据库上发布一个检查点。检查点写入 当前在内存中修改的页面(称为脏页面)和 从内存到磁盘的事务日志信息,以及记录 有关事务日志的信息。

链接:Database Checkpoints (SQL Server)

【讨论】:

  • 感谢您的回复 - 所以你认为这是可能的 - 让我试着更好地解释一下 - 我们有大量的 SP 写入每个 SP 内的活动表关键步骤 - 例如“处理新客户”加上日期和时间 - 这会导致写入数千行并在服务器上出现性能问题 - 我们是否可以使用检查点来标记此数据并配置服务器或触发器和 SP 以将这些数据批量插入到活动表中达到临界数据量,因此将数据存储在内存中,而不是不断写入表 - 谢谢
  • 你看错了方向。您的问题不是服务器写入磁盘,我重复一遍,您的所有插入都在内存中执行。你应该检查你真正的瓶颈是什么,例如,使用 sys.dm_os_waiting_tasks 找出你的等待是什么
猜你喜欢
  • 1970-01-01
  • 2021-02-23
  • 1970-01-01
  • 1970-01-01
  • 2011-02-28
  • 2023-03-16
  • 2010-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多