SQL Server 2016 + FILESTREAM + Windows Defender = 常量 CPU 和磁盘使用

SQL Server 2016 + FILESTREAM + Windows Defender = constant CPU and disk usage

我有一个问题是几周前 Windows 更新后开始的,我在互联网上找不到有关该问题的任何信息。我有一个 SQL Server 2016 Express 实例安装在最新的 Windows 10 机器上,数据库有一个 FILESTREAM 文件组和一个全文搜索目录。据我所知,数据库已连接并正常运行,Windows 事件日志中没有任何异常。然而,自那次更新以来,SQL 服务器不断搅动数据库,使用 CPU 和磁盘 constantly.

我将数据库存储在机械硬盘上,CPU 使用率一直在 30% 左右,直到我关闭 SQL 实例。重新启动它只是暂时的帮助,因为搅动很快就会再次开始。请记住,这是在离线计算机上(除了互联网连接)。起初我以为我中了病毒什么的,所以我关闭了服务器,然后将其从轨道上删除。我得到了一个新的 SSD,安装了 Windows 10,安装了 SQL Server 2016,更新了所有内容,获取了 MDF 和 LDF(以及文件流文件夹),将它们移到新机器上,附加了数据库。起初没有问题。然后它再次开始,尽管现在 CPU 使用率低得多,可能是因为存储速度快得多。

这是它在资源监视器中的样子:

这似乎与 Windows Defender 有关,因为我可以开始扫描并查看同一数据库的 sqlservr.exe 句柄数量。

SQL 服务器日志看起来像无休止的页面:

并且一直以来,SSMS activity 监视器都没有显示任何进程或任何可以解释 activity 的数据库方面的信息。请记住,这是一个独立的数据库,位于新安装的机器上,除了我之外没有连接任何客户端。

我查看了可能导致此问题的更新,但没有发现任何明显的问题,现在我不知道该怎么做。我看到的唯一解决方案是降级到 SQL Server 2008 SP3,我知道它以前运行良好。如果能提供任何帮助,我将不胜感激。

SQL 服务器错误日志中频繁出现 "Starting up database 'Abacus'" 消息表明数据库设置为 AUTO_CLOSE 并且数据库被频繁访问。这种不断打开和关闭数据库会导致大量开销,并且很可能是您看到的高资源利用率的原因。

简单的解决方法是关闭自动关闭:

ALTER DATABASE Abacus
SET AUTO_CLOSE OFF;

通常最好关闭 AUTO_CLOSE 数据库设置以避免不必要的开销。例外是一个 SQL 实例托管数百或数千个数据库,其中大多数数据库未被积极使用。