我有一个过程用于BULK INSERT
将两个 CSV 文件推送到 SQL 表中,这样我就可以将它们的数据与我拥有的另一个表连接起来。来自 CSV 文件的数据会生成每个约 100,000 行的表。当该过程完成后,这些表将被截断。整个过程都在为此而创建的数据库上运行(没有其他活动)。
在以一分钟为周期运行一段时间后,整个服务器变得非常慢。看起来这个活动占用了一些资源,但没有释放。尽管批量插入和连接每次只需要大约 5 秒钟。
答案1
您对实例执行的每个操作都会消耗资源并在一定程度上影响性能。有些事情比其他事情更明显。
您的数据库采用哪种恢复模式?您要添加数据的表是否位于另一个数据库中?
仅凭您提供的信息很难判断根本问题是什么。您必须对服务器进行一些监控才能准确了解原因。您的服务器可能正在排队 IO 请求,您的 trans 日志文件可能正在增长并在那里等待,您可能正在推动内存限制,索引可能正在重建,各种各样的事情。
答案2
仅使用 BULK INSERT 并不意味着您将获得最少的日志记录。您应该小心并阅读获取最少日志记录的先决条件。
参考:http://msdn.microsoft.com/en-us/library/ms190422.aspx
另外,检查机器上的内存设置,确保最大内存设置正确。你也查看过页面文件使用情况吗?如果页面文件使用量过多,那么你可能还需要降低最大内存设置。机器上还运行着什么?
处理此问题的正确方法是使用 WAIT STATISTICS 信息[http://technet.microsoft.com/en-us/library/ms179984.aspx]还可以在服务器运行缓慢时跟踪一些信息。当服务器运行缓慢时,您需要检查 CPU 使用率、IO 使用率等... @SQLSoldier 有一个很棒的脚本,可以识别高瞬时 CPU 峰值的根本原因。
参考:http://www.sqlsoldier.com/wp/sqlserver/catchingtransientcpuspikesusingsqltrace
这是一个起点,您还可以做其他事情,但需要更多信息。
答案3
这在很大程度上取决于服务器的硬件和配置,但确实,单个数据库上的活动非常频繁能导致整个服务器出现性能问题。最可能的情况是,繁重的活动消耗了几乎所有的服务器内存,并将所有其他内容从系统(或 SQL Server)的缓存中推出;因此,即使完成后,所有内容也必须再次从磁盘重新读取。