今天早上上班发现应该在周末执行完的脚本执行到了现在,靠着自建的etl日志表发现某个大表的查询 修改速度特别慢 。
后来重新启动了数据库(在控制面板的服务里面重新启动sqlserver),就好了。
猜测原因:可能是因为系统的临时数据库tempdb满了,或者是被阻塞之类的,在活动件事器里面看到我的那个进程一直在报RESOURCE_SEMAPHORE 等待状态 ,阻塞他的进程是tempdb数据库的,然后就猜测是不是这个原因。sqlserver每次启动都会重新建立tempdb表。
--20190305更新
就是临时表的问题,请见https://blog.youkuaiyun.com/zxy18210943475/article/details/78735915
重新启动数据库之后,存放数据的盘空间多了近100个g。应为我经常在ssms的查询里面没有写drop语句,可能是这个导致的,在连接池断开之前,数据库不会帮我们删除临时表,需要显示删除。所以以后最好显示删除临时表。
--
详细情况描述:
发现作业执行了很久都没有执行完成,正常情况2个钟以内能执行完,但是他花了快两天。
当时操作:停止作业,重新执行作业,然后发现etl日志表明它没有在执行或者说是卡住了。查看磁盘io以及内存等,发现都没有在动(这点很重要,说明哪些语句压根就没有在执行)
下面是排查的过程
1.检查生产数据,近期是否有大批量数据。(没有)
2.磁盘空间是不是不够了。(查看该盘的剩余空间,还有200G,不是这个原因)
2.是否有死锁(没有)
参考https://blog.youkuaiyun.com/weixin_33277597/article/details/79856786
3.查看该表的执行计划
因为这些查询都是很固定的查询,之前都没什么问题的,只能抱着希望查了。
在这里我发现一个很奇怪的地方,有索引它不走索引,偏偏要全表扫描,我看了他的建议说要我见一个索引。但我觉得没必要。后来证明不是这个的原因。
然后记录下一些常用的检查语句
————————————————
版权声明:本文为优快云博主「valage」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/valage/article/details/88118599
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 a.name
,c.name
,d.name
,d.colid
FROM sysindexes a
JOIN sysindexkeys b ON a.id=b.id AND a.indid=b.indid
JOIN sysobjects c ON b.id=c.id
JOIN syscolumns d ON b.id=d.id AND b.colid=d.colid
WHERE a.indid NOT IN (0,255)
-- and c.xtype='U' and c.status>0 --查所有用户表
AND c.name='Fact_Trade_log' --查指定表
--查看数据库负载
SELECT
substring (a.name,0,20) as [数据库名],
[连接数] = (SELECT COUNT(*)
FROM master..sysprocesses b
WHERE
a.dbid = b.dbid),
[阻塞进程] = (SELECT COUNT(*)
FROM master..sysprocesses b
WHERE
a.dbid = b.dbid AND
blocked <> 0),
[总内存] = ISNULL((SELECT SUM(memusage)
FROM
master..sysprocesses b
WHERE
a.dbid = b.dbid),0),
[总IO] = ISNULL((SELECT SUM(physical_io)
FROM
master..sysprocesses b
WHERE
a.dbid = b.dbid),0),
[总CPU] = ISNULL((SELECT SUM(cpu)
FROM
master..sysprocesses b
WHERE
a.dbid = b.dbid),0),
[总等待时间] = ISNULL((SELECT SUM(waittime)
FROM
master..sysprocesses b
WHERE
a.dbid = b.dbid),0)
FROM master.dbo.sysdatabases a WITH (nolock)
WHERE
DatabasePropertyEx(a.name,'Status') = 'ONLINE'
ORDER BY [数据库名]
--查询正在执行的语句
SELECT spid,
blocked,
DB_NAME(sp.dbid) AS DBName,
program_name,
waitresource,
lastwaittype,
sp.loginame,
sp.hostname,
a.[Text] AS [TextData],
SUBSTRING(A.text, sp.stmt_start / 2,
(CASE WHEN sp.stmt_end = -1 THEN DATALENGTH(A.text) ELSE sp.stmt_end
END - sp.stmt_start) / 2) AS [current_cmd]
FROM sys.sysprocesses AS sp OUTER APPLY sys.dm_exec_sql_text (sp.sql_handle) AS A
WHERE spid > 50
————————————————
版权声明:本文为优快云博主「valage」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/valage/article/details/88118599