您的位置:首页 > 博客中心 > 数据库 >

记一次数据库调优过程(IIS发过来SQLSERVER 的FETCH API_CURSOR语句是神马?)

时间:2022-03-10 17:29

 

 这些是什么语句呢?在msdn上面找不到任何资料,使用下面的SQL语句查看,在[program_name]字段可以看到是IIS发过来的

gxlsystem.com,布布扣

 

如果你使用sys.dm_exec_requests 视图或者sys.dm_exec_connections视图来查看session_id53执行了什么语句

和执行的状态

gxlsystem.com,布布扣

从结果来看,我们知道语句使用了游标,并且知道游标的属性(scroll locks)和游标创建时间

并且我们看到执行的SQL语句不像是FETCH API_CURSOR或者sp_cursorfetch,而是

gxlsystem.com,布布扣

 

3、把结果拷贝出来,可以发现也是执行的是SELECT 语句

gxlsystem.com,布布扣

 

4、因为是ASP程序,没有用到存储过程,于是搜索项目文件,看一下哪个文件有类似的代码

gxlsystem.com,布布扣

5、找到结果

gxlsystem.com,布布扣

 gxlsystem.com,布布扣

ASP的语法跟VB是很像的,本人觉得非常羞涩

可以看到server对象创建了一个recordset对象,然后从recordset对象里逐条记录取出来,再做处理,可以看到后续还有

select case....case...case....

就是对取出来的记录再做处理

 

因为ASP是脚本语言,由IIS来执行,所以在SQLSERVER这边可以看到下面语句的program_name字段是IIS

gxlsystem.com,布布扣gxlsystem.com,布布扣
SELECT * FROM sys.[dm_os_performance_counters] 
WHERE [counter_name]=‘CPU usage %‘   
AND [object_name]=‘SQLServer:Resource Pool Stats‘     
AND [instance_name]=‘default‘                                                


SELECT * FROM sys.[dm_os_performance_counters] 
WHERE [counter_name]=‘Active cursors‘   
AND [object_name]=‘SQLServer:Cursor Manager by Type‘     
AND [instance_name]=‘_Total‘                                                


--建表
USE [msdb]
GO
CREATE TABLE ActiveCursors
(cntr_value BIGINT,cntr_time DATETIME PRIMARY KEY)
GO
CREATE TABLE CPUUsage
(cntr_value BIGINT,cntr_time DATETIME PRIMARY KEY)
GO


--建作业
DECLARE @DBName NVARCHAR(MAX)
DECLARE @job_name sysname

SET @DBName=‘xxx‘  --★Do

SET @job_name=‘Monitor_CPUUsage_‘ + @DBName
EXEC msdb.dbo.sp_add_job @job_name=@job_name, 
@enabled=1, 
@notify_level_eventlog=0, 
@notify_level_email=0, 
@notify_level_netsend=0, 
@notify_level_page=0, 
@delete_level=0, 
@description=N‘监控CPU使用率‘, 
@category_name=N‘Database Maintenance‘, 
@owner_login_name=N‘sa‘ 


--添加监控步骤
DECLARE @job_name SYSNAME
DECLARE @SQL NVARCHAR(MAX)
DECLARE @DBName NVARCHAR(MAX)

SET @DBName=‘xxx‘  --★Do
SET @job_name=‘Monitor_CPUUsage_‘ + @DBName  --★Do

BEGIN 
    SET @SQL = N‘
USE [msdb]
GO
INSERT INTO CPUUsage(cntr_value,cntr_time)  
SELECT cntr_value,GETDATE() FROM sys.[dm_os_performance_counters] 
WHERE [counter_name]=‘‘CPU usage %‘‘   
AND [object_name]=‘‘SQLServer:Resource Pool Stats‘‘   
AND [instance_name]=‘‘default‘‘
‘
    EXEC msdb.dbo.sp_add_jobstep @job_name = @job_name,
        @step_name = N‘Monitor‘, @step_id = 1, @cmdexec_success_code = 0,
        @on_success_action = 3, @on_success_step_id = 0, @on_fail_action = 2,
        @on_fail_step_id = 0, @retry_attempts = 0, @retry_interval = 0,
        @os_run_priority = 0, @subsystem = N‘TSQL‘, @command = @SQL,
        @database_name = @DBNAME, @flags = 0

END

  


--创建Monitor作业的调度计划
DECLARE @job_name SYSNAME
DECLARE @SQL NVARCHAR(MAX)
DECLARE @DBName NVARCHAR(MAX)

SET @DBName=‘xxx‘  --★Do
SET @job_name=‘Monitor_CPUUsage_‘ + @DBName  --★Do

--修改作业的执行时间
EXEC  msdb.dbo.sp_add_jobschedule  @job_name = @job_name, @name=N‘Plan‘, 
        @enabled=1, 
        @freq_type=4, 
        @freq_interval=1, 
        @freq_subday_type=2, 
        @freq_subday_interval=30, 
        @freq_relative_interval=0, 
        @freq_recurrence_factor=0, 
        @active_start_date=20140105, 
        @active_end_date=99991231, 
        @active_start_time=2000, 
        @active_end_time=235959

EXEC  msdb.dbo.sp_add_jobserver  @job_name = @job_name, @server_name = N‘(local)‘





------------------------------------------------------------------------------
--建作业
DECLARE @DBName NVARCHAR(MAX)
DECLARE @job_name sysname

SET @DBName=‘xxx‘  --★Do

SET @job_name=‘Monitor_ActiveCursors_‘ + @DBName
EXEC msdb.dbo.sp_add_job @job_name=@job_name, 
@enabled=1, 
@notify_level_eventlog=0, 
@notify_level_email=0, 
@notify_level_netsend=0, 
@notify_level_page=0, 
@delete_level=0, 
@description=N‘监控游标使用‘, 
@category_name=N‘Database Maintenance‘, 
@owner_login_name=N‘sa‘ 


--添加监控步骤
DECLARE @job_name SYSNAME
DECLARE @SQL NVARCHAR(MAX)
DECLARE @DBName NVARCHAR(MAX)

SET @DBName=‘xxxx‘  --★Do
SET @job_name=‘Monitor_ActiveCursors_‘ + @DBName  --★Do

BEGIN 
    SET @SQL = N‘
USE [msdb]
GO
INSERT INTO ActiveCursors(cntr_value,cntr_time)  
SELECT cntr_value,GETDATE()  FROM sys.[dm_os_performance_counters] 
WHERE [counter_name]=‘‘Active cursors‘‘   
AND [object_name]=‘‘SQLServer:Cursor Manager by Type‘‘  
AND [instance_name]=‘‘_Total‘‘
‘
    EXEC msdb.dbo.sp_add_jobstep @job_name = @job_name,
        @step_name = N‘Monitor‘, @step_id = 1, @cmdexec_success_code = 0,
        @on_success_action = 3, @on_success_step_id = 0, @on_fail_action = 2,
        @on_fail_step_id = 0, @retry_attempts = 0, @retry_interval = 0,
        @os_run_priority = 0, @subsystem = N‘TSQL‘, @command = @SQL,
        @database_name = @DBNAME, @flags = 0

END

  


--创建Monitor作业的调度计划
DECLARE @job_name SYSNAME
DECLARE @SQL NVARCHAR(MAX)
DECLARE @DBName NVARCHAR(MAX)

SET @DBName=‘xxxx‘  --★Do
SET @job_name=‘Monitor_ActiveCursors_‘ + @DBName  --★Do

--修改作业的执行时间
EXEC  msdb.dbo.sp_add_jobschedule  @job_name = @job_name, @name=N‘Plan‘, 
        @enabled=1, 
        @freq_type=4, 
        @freq_interval=1, 
        @freq_subday_type=2, 
        @freq_subday_interval=30, 
        @freq_relative_interval=0, 
        @freq_recurrence_factor=0, 
        @active_start_date=20140105, 
        @active_end_date=99991231, 
        @active_start_time=2000, 
        @active_end_time=235959

EXEC  msdb.dbo.sp_add_jobserver  @job_name = @job_name, @server_name = N‘(local)‘
View Code

上面视图里的[object_name]字段和 [instance_name]字段跟你的环境会不一样,所以大家要按照自己的环境来修改

如果是SQLSERVER2005是没有CPU usage %这个counter的,我使用了下面的SQL语句

gxlsystem.com,布布扣

gxlsystem.com,布布扣

 

凌晨那段曲线是因为数据库有做清除数据的操作,所以会比较高

游标跟CPU图虽然说不能完全吻合,但是基本能吻合

 

解决方法

1、修改代码

2、升级到SQL2008,然后使用资源调控器把CPU压下去

 

最终还是找人修改代码


总结

有时候对一些老旧的程序,例如ASP,可能老一代程序员还会,现在的程序员基本都使用ASP.NET

所以如果可能,还是跟上技术的脚步,不然出问题了,没有人维护就麻烦了

 

如有不对的地方,欢迎大家拍砖o(∩_∩)o 

记一次数据库调优过程(IIS发过来SQLSERVER 的FETCH API_CURSOR语句是神马?),布布扣,bubuko.com

热门排行

今日推荐

热门手游