我350GB
在我的电脑上运行一个数据库,大约有 4000 万行。
SQL Server 2014、Win7、AMD 8350 @ 4.8GHZ、16 GB RAM 和 500 GB SSD(数据库托管在它自己的 500 GB SSD 上,吞吐量为 500MB/500MB 读/写)。
数据库没有更新,我只是在分析/阅读它。与创建几个indexes
,任何join
,count(*)
等等,只需要不到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 和内存使用,潜在的问题就会消失。
归档时间: |
|
查看次数: |
348 次 |
最近记录: |