今天早上上班发现应该在周末执行完的脚本执行到了现在,靠着自建的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.查看该表的执行计划
因为这些查询都是很固定的查询,之前都没什么问题的,只能抱着希望查了。
在这里我发现一个很奇怪的地方,有索引它不走索引,偏偏要全表扫描,我看了他的建议说要我见一个索引。但我觉得没必要。后来证明不是这个的原因。
然后记录下一些常用的检查语句
-
DBCC showcontig('[R_sy_jfrs_year_report]')
-
--关注:扫描密度 [最佳计数:实际计数], 逻辑扫描碎片
-
--当你发现,扫描密度行,最佳计数和实际计数的比例已经严重失调,逻辑扫描碎片占了非常大的百分比,每页平
-
--均可用字节数非常大时,就说明你的索引需要重新整理一下了
-
-
--然后执行,--重建索引
-
DBCC DBREINDEX('Table_name'')
-
-
--查看目前正在被使用的表,这个可以在没有实时日志的情况下猜测下大概执行到了哪里
-
select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName
-
from sys.dm_tran_locks where resource_type='OBJECT'
-
ORDER BY TABLENAME
-
--查看表的索引情况
-
SELECT
-
,
-
,
-
,
-
FROM sysindexes a
-
JOIN sysindexkeys b ON = AND =
-
JOIN sysobjects c ON =
-
JOIN syscolumns d ON = AND =
-
WHERE NOT IN (0,255)
-
-- and ='U' and >0 --查所有用户表
-
AND ='Fact_Trade_log' --查指定表
-
-
--查看数据库负载
-
SELECT
-
substring (,0,20) as [数据库名],
-
[连接数] = (SELECT COUNT(*)
-
FROM master..sysprocesses b
-
WHERE
-
= ),
-
[阻塞进程] = (SELECT COUNT(*)
-
FROM master..sysprocesses b
-
WHERE
-
= AND
-
blocked <> 0),
-
[总内存] = ISNULL((SELECT SUM(memusage)
-
FROM
-
master..sysprocesses b
-
WHERE
-
= ),0),
-
[总IO] = ISNULL((SELECT SUM(physical_io)
-
FROM
-
master..sysprocesses b
-
WHERE
-
= ),0),
-
[总CPU] = ISNULL((SELECT SUM(cpu)
-
FROM
-
master..sysprocesses b
-
WHERE
-
= ),0),
-
[总等待时间] = ISNULL((SELECT SUM(waittime)
-
FROM
-
master..sysprocesses b
-
WHERE
-
= ),0)
-
FROM a WITH (nolock)
-
WHERE
-
DatabasePropertyEx(,'Status') = 'ONLINE'
-
ORDER BY [数据库名]
-
--查询正在执行的语句
-
SELECT spid,
-
blocked,
-
DB_NAME() AS DBName,
-
program_name,
-
waitresource,
-
lastwaittype,
-
,
-
,
-
a.[Text] AS [TextData],
-
SUBSTRING(, sp.stmt_start / 2,
-
(CASE WHEN sp.stmt_end = -1 THEN DATALENGTH() ELSE sp.stmt_end
-
END - sp.stmt_start) / 2) AS [current_cmd]
-
FROM AS sp OUTER APPLY sys.dm_exec_sql_text (sp.sql_handle) AS A
-
WHERE spid > 50
---20240611----------------------------------------------------------------------------------------------------------------
欢迎关注我的订阅号,一起探讨
论PM如何成长