sqlserver查询突然变得很慢

时间:2024-10-14 18:16:24

今天早上上班发现应该在周末执行完的脚本执行到了现在,靠着自建的etl日志表发现某个大表的查询 修改速度特别慢 。

后来重新启动了数据库(在控制面板的服务里面重新启动sqlserver),就好了。

猜测原因:可能是因为系统的临时数据库tempdb满了,或者是被阻塞之类的,在活动件事器里面看到我的那个进程一直在报RESOURCE_SEMAPHORE 等待状态 ,阻塞他的进程是tempdb数据库的,然后就猜测是不是这个原因。sqlserver每次启动都会重新建立tempdb表。

--20190305更新 

就是临时表的问题,请见SQL Server中的临时表是否需要显式删除?_sql server 临时表 是否需要清理删除-****博客

重新启动数据库之后,存放数据的盘空间多了近100个g。应为我经常在ssms的查询里面没有写drop语句,可能是这个导致的,在连接池断开之前,数据库不会帮我们删除临时表,需要显示删除。所以以后最好显示删除临时表。

--

详细情况描述:

发现作业执行了很久都没有执行完成,正常情况2个钟以内能执行完,但是他花了快两天。

当时操作:停止作业,重新执行作业,然后发现etl日志表明它没有在执行或者说是卡住了。查看磁盘io以及内存等,发现都没有在动(这点很重要,说明哪些语句压根就没有在执行)

下面是排查的过程

1.检查生产数据,近期是否有大批量数据。(没有)

2.磁盘空间是不是不够了。(查看该盘的剩余空间,还有200G,不是这个原因)

2.是否有死锁(没有)

参考sqlserver中查询是否有死锁存在_sql server 查死锁-****博客

3.查看该表的执行计划

因为这些查询都是很固定的查询,之前都没什么问题的,只能抱着希望查了。

在这里我发现一个很奇怪的地方,有索引它不走索引,偏偏要全表扫描,我看了他的建议说要我见一个索引。但我觉得没必要。后来证明不是这个的原因。

然后记录下一些常用的检查语句

  1. DBCC showcontig('[R_sy_jfrs_year_report]')
  2. --关注:扫描密度 [最佳计数:实际计数], 逻辑扫描碎片
  3. --当你发现,扫描密度行,最佳计数和实际计数的比例已经严重失调,逻辑扫描碎片占了非常大的百分比,每页平
  4. --均可用字节数非常大时,就说明你的索引需要重新整理一下了
  5. --然后执行,--重建索引
  6. DBCC DBREINDEX('Table_name'')
  1. --查看目前正在被使用的表,这个可以在没有实时日志的情况下猜测下大概执行到了哪里
  2. select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName
  3. from sys.dm_tran_locks where resource_type='OBJECT'
  4. ORDER BY TABLENAME
  1. --查看表的索引情况
  2. SELECT  
  3. ,  
  4. ,  
  5. ,  
  6. FROM   sysindexes   a  
  7. JOIN   sysindexkeys   b   ON   =   AND   =  
  8. JOIN   sysobjects   c   ON   =  
  9. JOIN   syscolumns   d   ON   =   AND   =  
  10. WHERE     NOT IN (0,255)  
  11. -- and   ='U'   and   >0 --查所有用户表  
  12. AND   ='Fact_Trade_log' --查指定表
  13. --查看数据库负载
  14. SELECT
  15. substring (,0,20) as [数据库名],
  16. [连接数] = (SELECT COUNT(*)
  17. FROM master..sysprocesses b
  18. WHERE
  19. = ),
  20. [阻塞进程] = (SELECT COUNT(*)
  21. FROM master..sysprocesses b
  22. WHERE
  23. = AND
  24. blocked <> 0),
  25. [总内存] = ISNULL((SELECT SUM(memusage)
  26. FROM
  27. master..sysprocesses b
  28. WHERE
  29. = ),0),
  30. [总IO] = ISNULL((SELECT SUM(physical_io)
  31. FROM
  32. master..sysprocesses b
  33. WHERE
  34. = ),0),
  35. [总CPU] = ISNULL((SELECT SUM(cpu)
  36. FROM
  37. master..sysprocesses b
  38. WHERE
  39. = ),0),
  40. [总等待时间] = ISNULL((SELECT SUM(waittime)
  41. FROM
  42. master..sysprocesses b
  43. WHERE
  44. = ),0)
  45. FROM a WITH (nolock)
  46. WHERE
  47. DatabasePropertyEx(,'Status') = 'ONLINE'
  48. ORDER BY [数据库名]
  1. --查询正在执行的语句
  2. SELECT spid,
  3. blocked,
  4. DB_NAME() AS DBName,
  5. program_name,
  6. waitresource,
  7. lastwaittype,
  8. ,
  9. ,
  10. a.[Text] AS [TextData],
  11. SUBSTRING(, sp.stmt_start / 2,
  12. (CASE WHEN sp.stmt_end = -1 THEN DATALENGTH() ELSE sp.stmt_end
  13. END - sp.stmt_start) / 2) AS [current_cmd]
  14. FROM AS sp OUTER APPLY sys.dm_exec_sql_text (sp.sql_handle) AS A
  15. WHERE spid > 50

 ---20240611----------------------------------------------------------------------------------------------------------------

欢迎关注我的订阅号,一起探讨

  论PM如何成长