亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

記一次數據庫調優過程(IIS發過來SQLSERVER 的FETCH API_CURSOR語句是神馬?)

2024-07-21 02:50:02
字體:
來源:轉載
供稿:網友
記一次數據庫調優過程(IIS發過來SQLSERVER 的FETCH API_CURSOR語句是神馬?)記一次數據庫調優過程(IIS發過來SQLSERVER 的FETCH API_CURSOR語句是神馬?)

前幾天幫客戶優化一個數據庫,那個數據庫的大小是6G

這麼小的數據庫按道理不會有太大的性能問題的,但是客戶反應說CPU占用很高,經常達到80%~90%

我檢查了任務管理器,確實是SQLSERVER占的CPU

而服務器的內存是16G內存,只占用了7G+

客戶的環境:

Windows2008R2

SQLSERVER2005 SP3 64位 企業版

服務器內存:16G

CPU:8核

RDS:阿里云主機

IIS7.5

網站使用asp技術


著手查找原因

于是就著手檢查占用CPU高的原因,檢查了很久,發現有一些SQL語句占用CPU很高,而執行的SQL語句如下:

這些是什么語句呢?在msdn上面找不到任何資料,使用下面的SQL語句查看,在[PRogram_name]字段可以看到是IIS發過來的

SELECT * FROM sys.[sysprocesses] WHERE SPID>=50

難道是IIS的bug?然后我又繼續在茫茫網海里查找資料,最后終于在paul的博客里找到原因

文章地址:Hunting down the origins of FETCH API_CURSOR and sp_cursorfetch


文章大意

我在調優數據庫的時候,使用sqlserver profiler捕獲RPC:Completed事件,可以看到很多類似下面的語句

exec sp_cursorfetch 180150003,32,1,1 exec sp_cursorfetch 180150003,32,1,1 exec sp_cursorfetch 180150003,32,1,1 exec sp_cursorfetch 180150003,32,1,1

你看到這些語句是從session_id為53的session那里發過來的

于是用下面語句看一下session_id為53執行的究竟是什么語句

DBCC INPUTBUFFER (53)

而返回的結果是

 FETCH API_CURSOR0000000000000004

您很快意識到這跟服務器游標有一定的關系

如果你使用sys.dm_exec_requests 視圖或者sys.dm_exec_connections視圖來查看session_id53執行了什么語句

和執行的狀態

SELECT t.textFROM sys.dm_exec_connections cCROSS APPLY sys.dm_exec_sql_text (c.most_recent_sql_handle) tWHERE session_id = 53

但是返回的結果依然是

FETCH API_CURSOR0000000000000004

那么還有沒有其他的視圖來幫助我們呢?我們可以使用sys.dm_exec_cursors視圖,將spid代入進去

SELECT c.session_id, c.properties, c.creation_time, c.is_open, t.textFROM sys.dm_exec_cursors (53) cCROSS APPLY sys.dm_exec_sql_text (c.sql_handle) t

從結果來看,我們知道語句使用了游標,并且知道游標的屬性(scroll locks)和游標創建時間

并且我們看到執行的SQL語句不像是FETCH API_CURSOR或者sp_cursorfetch,而是

SELECT * FROM dbo.FactResellerSales.

本人的處理過程

1、先使用下面的SQL語句找出當前實例下有使用到游標的語句

-- =============================================-- Author:      <樺仔>-- Blog:        <http://www.cnblogs.com/lyhabc/>-- Create date: <2014/6/3>-- Description: <獲取當前實例下所有的游標語句>-- =============================================DECLARE @spid NVARCHAR(100)DECLARE @SQL NVARCHAR(MAX)DECLARE CurSPID CURSORFOR    SELECT  [spid]    FROM    sys.[sysprocesses]    WHERE   [spid] >= 50OPEN CurSPIDFETCH NEXT FROM CurSPID INTO @spidWHILE @@FETCH_STATUS = 0    BEGIN          SET @SQL = N'SELECT  cursors.session_id ,        cursors.properties ,        cursors.creation_time ,        cursors.is_open ,        text.textFROM    sys.dm_exec_cursors (' + @spid + ') cursors        CROSS APPLY sys.dm_exec_sql_text(cursors.sql_handle) text'        EXEC(@SQL)         FETCH NEXT FROM CurSPID INTO @spid    ENDCLOSE CurSPIDDEALLOCATE CurSPID

為什麼上面的腳本要使用游標,因為當時我根據paul的腳本來執行的時候,在活動監視器里能看到使用游標的SQL語句,

但是在SSMS里查詢的時候,怎麼也查詢不出來,所以才用游標,將使用到游標的語句一網打盡,這里輸出的結果要忽略本身這個腳本使用到的游標??!

2、根據輸出的結果,發現有幾個地方使用了游標,下面只是部分截圖

3、把結果拷貝出來,可以發現也是執行的是SELECT 語句

4、因為是ASP程序,沒有用到存儲過程,于是搜索項目文件,看一下哪個文件有類似的代碼

5、找到結果

ASP的語法跟VB是很像的,本人覺得非常羞澀

可以看到server對象創建了一個recordset對象,然后從recordset對象里逐條記錄取出來,再做處理,可以看到后續還有

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

就是對取出來的記錄再做處理

因為ASP是腳本語言,由IIS來執行,所以在SQLSERVER這邊可以看到下面語句的program_name字段是IIS

SELECT * FROM sys.[sysprocesses] WHERE SPID>=50

6、驗證一下是否是游標的原因導致CPU高,使用下面的腳本

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]GOCREATE TABLE ActiveCursors(cntr_value BIGINT,cntr_time DATETIME PRIMARY KEY)GOCREATE TABLE CPUUsage(cntr_value BIGINT,cntr_time DATETIME PRIMARY KEY)GO--建作業DECLARE @DBName NVARCHAR(MAX)DECLARE @job_name sysnameSET @DBName='xxx'  --★DoSET @job_name='Monitor_CPUUsage_' + @DBNameEXEC 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 SYSNAMEDECLARE @SQL NVARCHAR(MAX)DECLARE @DBName NVARCHAR(MAX)SET @DBName='xxx'  --★DoSET @job_name='Monitor_CPUUsage_' + @DBName  --★DoBEGIN     SET @SQL = N'USE [msdb]GOINSERT 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 = 0END  --創建Monitor作業的調度計劃DECLARE @job_name SYSNAMEDECLARE @SQL NVARCHAR(MAX)DECLARE @DBName NVARCHAR(MAX)SET @DBName='xxx'  --★DoSET @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=235959EXEC  msdb.dbo.sp_add_jobserver  @job_name = @job_name, @server_name = N'(local)'--------------------------------------------------------------------------------建作業DECLARE @DBName NVARCHAR(MAX)DECLARE @job_name sysnameSET @DBName='xxx'  --★DoSET @job_name='Monitor_ActiveCursors_' + @DBNameEXEC 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 SYSNAMEDECLARE @SQL NVARCHAR(MAX)DECLARE @DBName NVARCHAR(MAX)SET @DBName='xxxx'  --★DoSET @job_name='Monitor_ActiveCursors_' + @DBName  --★DoBEGIN     SET @SQL = N'USE [msdb]GOINSERT 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 =
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久视频在线| 在线观看成人黄色| 欧美福利视频在线| 精品福利一区二区| 日韩中文字幕久久| 欧美成人国产va精品日本一级| 色婷婷综合成人| 国产精品电影网| 国产高清视频一区三区| 国产精品丝袜白浆摸在线| 91精品在线观| 国产精品影片在线观看| 中文字幕欧美在线| 国产偷亚洲偷欧美偷精品| 亚洲视频一区二区三区| 国外日韩电影在线观看| 中文字幕亚洲无线码在线一区| 国产精品久久久久久久久久免费| 欧美高清视频在线| 久久亚洲春色中文字幕| 亚洲国产精品中文| 亚洲欧美激情四射在线日| 精品一区二区三区电影| 中文字幕精品网| 欧美成人免费在线视频| 成人h片在线播放免费网站| 一本一道久久a久久精品逆3p| 在线日韩av观看| 国产在线日韩在线| 中文字幕在线视频日韩| 国产精品va在线播放| 国产在线日韩在线| 精品国产一区二区三区在线观看| 国产精品欧美亚洲777777| 97不卡在线视频| 91久久久久久久| 精品女同一区二区三区在线播放| 欧美日韩一二三四五区| 日韩精品在线免费观看| 国产精品香蕉av| 九色成人免费视频| 国产精品高潮呻吟久久av无限| 日韩av电影手机在线观看| 中文字幕一精品亚洲无线一区| 成人免费视频在线观看超级碰| 亚洲伊人成综合成人网| 亚洲人成电影在线观看天堂色| 欧美成人精品h版在线观看| 亚洲精品久久久久中文字幕欢迎你| www.亚洲天堂| 色妞在线综合亚洲欧美| 日韩精品视频免费| 欧美重口另类videos人妖| 国产一区二区三区视频免费| 欧美色视频日本高清在线观看| 亚洲精品电影网站| 91久热免费在线视频| 国产亚洲欧美视频| 欧美大全免费观看电视剧大泉洋| 国产视频福利一区| 一本色道久久综合狠狠躁篇的优点| 日产精品久久久一区二区福利| 精品国产一区二区三区久久久狼| 91成品人片a无限观看| 美女国内精品自产拍在线播放| 国产精品福利网| 欧美中文在线视频| 亚洲欧美国产日韩中文字幕| 2020久久国产精品| 欧美黑人巨大xxx极品| 96国产粉嫩美女| 日韩精品福利网站| 97超级碰碰碰久久久| 久久久久久国产| 亚洲国产中文字幕在线观看| 久久久久久九九九| 久久久国产一区二区三区| 超碰97人人做人人爱少妇| 欧美日韩中文字幕综合视频| 美女撒尿一区二区三区| 久久免费视频这里只有精品| 国产欧美日韩精品丝袜高跟鞋| 日韩免费在线免费观看| 精品中文字幕乱| 亚洲精品欧美日韩专区| 国产又爽又黄的激情精品视频| 国产97在线播放| 久久99久国产精品黄毛片入口| 精品magnet| 国产精品视频99| 日本视频久久久| 成人精品一区二区三区| 中文字幕亚洲激情| 91成品人片a无限观看| 亚洲黄色成人网| 欧美综合一区第一页| 日韩资源在线观看| 亚洲精品乱码久久久久久金桔影视| 亚洲欧洲美洲在线综合| 国产精品av电影| 欧美一区二区三区艳史| 一区二区三区高清国产| 欧美激情欧美激情在线五月| 91免费看片网站| 久久久999成人| 成人黄色短视频在线观看| 91精品久久久久久久| 精品日韩美女的视频高清| 国产91色在线|免| 国产欧美一区二区白浆黑人| 国产亚洲人成网站在线观看| 久久精品视频在线| 亚洲欧美制服第一页| 搡老女人一区二区三区视频tv| 红桃av永久久久| 欧美性videos高清精品| 国产mv免费观看入口亚洲| 亚洲图片欧美日产| 久久精品国产亚洲一区二区| 色综合天天综合网国产成人网| 欧美日本黄视频| 在线精品高清中文字幕| 欧美老女人在线视频| 日韩美女中文字幕| 欧美午夜宅男影院在线观看| 久久久电影免费观看完整版| 国产精品va在线播放| 成人免费直播live| 欧日韩在线观看| 国产精品亚洲第一区| 国产精品a久久久久久| 2025国产精品视频| 精品国产一区二区三区久久久狼| 国内精品视频一区| 一区二区三区无码高清视频| 美女精品视频一区| 久久精品成人动漫| 国产一区二区三区在线| 亚洲最大av在线| 国产日韩精品在线观看| 国产91在线播放精品91| 成人xxxx视频| 日本在线观看天堂男亚洲| 欧美激情a∨在线视频播放| 久久视频在线观看免费| 国产精品久久一区| 成人黄色片在线| 亚洲高清在线观看| 精品亚洲一区二区三区四区五区| 欧美自拍视频在线观看| 伊人伊人伊人久久| 国产精品久久久久久久久久东京| 欧美激情视频播放| 国产精品中文字幕久久久| 国产综合福利在线| 亚洲国产女人aaa毛片在线| 日韩av在线电影网| 中文字幕亚洲欧美| 亚洲影视九九影院在线观看| 亚洲国产精品999| 中文字幕日韩视频| 中文字幕v亚洲ⅴv天堂| 国产精品视频26uuu| 国产日韩欧美综合|