SQL Server 2014 突然变慢/无插入/与硬件或索引无关

8 sql-server sql-server-2014

350GB在我的电脑上运行一个数据库,大约有 4000 万行。

SQL Server 2014、Win7、AMD 8350 @ 4.8GHZ、16 GB RAM 和 500 GB SSD(数据库托管在它自己的 500 GB SSD 上,吞吐量为 500MB/500MB 读/写)。

数据库没有更新,我只是在分析/阅读它。与创建几个indexes,任何joincount(*)等等,只需要不到1分钟,这是确定我的目的。我一直在对数据运行一些查询(在运行单个连接查询后,40-50 次,它变得很慢),现在花了 1 分钟的调用,在 20 分钟后仍在运行。

我密切关注系统资源,我可以看到SSD查询开始时的启动,它读取 20-30 秒,然后121kB/second在接下来的 20 分钟读取。这不是 CPU 问题或磁盘问题。我的 RAM 数量有限,但是当我第一次加载数据库时调用运行良好,现在,25 分钟后没有任何运行。

实际上,我无法再查询数据库,任何调用都需要很长时间,即使是基本SELECT语句。我试过重建索引和更新统计信息,但没有区别。

我在这方面没有很多经验,所以我的 SQL 查询完全有可能不正确,在这种情况下,我希望出现错误,或者它以 0 结果完成执行,但两者都没有发生。

我想要做的是在基于表 ACALLS 的时间之前的 5 秒内计算“TypeID”的所有实例。

SELECT ACALLS.StartTime, ACALLS.Time, ACALLS.ServerIP, ACALLS.SRVR,   ACALLS.calls, ACALLS.TOKEN, COUNT(TypeID) as ExecRate
FROM ACALLS
INNER JOIN MAINVIEW ON 
MainView.TimeStamp BETWEEN ACALLS.StartTime and DATEADD(ss,-5,ACALLS.StartTime)

WHERE DATEPART(hour,MainView.TimeStamp) BETWEEN 10 and 13 and 
CAST(MainView.TimeStamp as date) = '2015-12-09' and
MainView.TypeID = '123456789'
GROUP BY Acalls.STartTime, ACALLs.TIME, ServerIp,SRVR, ACALLS.CALLS, ACALLS.TOKEN
ORDER BY Acalls.StartTime
Run Code Online (Sandbox Code Playgroud)

运行“谁在运行”后, 在此处输入图片说明 在此处输入图片说明

小智 1

在 mainview(typeid, timestamp) 上创建复合非聚集索引。

更改主视图上的“位置”,这样您就不会针对主视图列使用函数。如果您需要这些值更加动态,这可能需要您在运行查询之前将这些值预先计算为变量。

WHERE MainView.TimeStamp BETWEEN '2015-12-09 10:00' and '2015-12-09 13:00'
Run Code Online (Sandbox Code Playgroud)

在 ACALLS.StartTime 上创建非聚集索引。

将 ACALLS 的连接更改为

WHERE ACALLS.StartTime BETWEEN DATEADD(ss,-5,MainView.TimeStamp) AND MainView.TimeStamp
Run Code Online (Sandbox Code Playgroud)

根据我的理解,这将处理您的逻辑并以相当高的性能进行连接,并使您远离 IO。

我对您遇到的情况的最佳猜测是您的数据正在从缓存中刷新和/或 tempdb 时不时地溢出到磁盘,因此我通常找到的最佳解决方案是将查询更好地写入限制 tempdb 和内存使用,潜在的问题就会消失。