-- 數據量比較大的情況,統計十分鍾內每秒鍾執行次數
declare @begintime varchar(100); -- 開始時間 declare @endtime varchar(100); -- 結束時間 declare @num int; -- 結束時間 set @begintime = '2019-08-10 09:10:00' -- 開始時間 set @endtime = '2019-08-10 09:20:00' -- 結束時間 set @num = (select count(1) from PM_SYS_LOGINLOG where CONVERT(varchar(100),loginTime, 20) >= @begintime and CONVERT(varchar(100),loginTime, 20) <= @endtime) print(@num) select @num as 總條數, AVG(調用總數) as 十分鍾內每秒平均執行次數 from (select s.請求時間, (調用一次的總數+ ( select 調用多次 from ( select 請求時間, COUNT(1) 調用多次 from ( select CONVERT(varchar(100),loginTime, 20) as 請求時間, count(1) as 調用次數 from PM_SYS_LOGINLOG where CONVERT(varchar(100),loginTime, 20) >= @begintime and CONVERT(varchar(100),loginTime, 20) <= @endtime group by loginTime having count(1) > 1) o where 請求時間 = s.請求時間 group by o.請求時間 ) o ) ) as 調用總數 from ( select t.請求時間, count(1) as 調用一次的總數 from ( select CONVERT(varchar(100),loginTime, 20) as 請求時間, count(1) as 調用次數 from PM_SYS_LOGINLOG where CONVERT(varchar(100),loginTime, 20) >= @begintime and CONVERT(varchar(100),loginTime, 20) <= @endtime group by loginTime having count(1) = 1 ) t group by 請求時間 ) s ) m
查詢前一秒執行次數
declare @str varchar(100); set @str = convert(varchar,dateadd(ss,-1,getdate()),20) --select @str --print(@str) select @str as 執行時間, count(1) + ( select count(1) from (select top 20 CONVERT(varchar(100),loginTime, 20) as 請求時間, count(1) as 調用次數 from PM_SYS_LOGINLOG where CONVERT(varchar(100),loginTime, 20) = @str group by loginTime having count(1) = 2 order by loginTime desc) as o ) as 執行次數 from ( select top 20 CONVERT(varchar(100),loginTime, 20) as 請求時間, count(1) as 調用次數 from PM_SYS_LOGINLOG where CONVERT(varchar(100),loginTime, 20) = @str group by loginTime --having count(1) = 1 order by loginTime desc ) t
聚合函數分組查詢最大值
select max(t.總數) as 最大值 from (select Token as 令牌, count(1) as 總數 from PM_SYS_LOGINLOG group by token having count(1) > max(1)) as t
select top 1 count(1) as 總數 from PM_SYS_LOGINLOG group by token having count(1) > 1 order by 總數 desc
第二次優化統計半個小時時間統計每秒鍾執行次數條數
declare @begintime varchar(100); -- 開始時間 declare @endtime varchar(100); -- 結束時間 --declare @tmpTab varchar(50); -- 定義臨時表名稱前綴 declare @num int; -- 結束時間 set @begintime = '2019-08-10 09:00:00' -- 開始時間 set @endtime = '2019-08-10 09:30:00' -- 結束時間 -- 定義臨時表名稱前綴加時間戳 -- set @tmpTab = '_' + DateName(YEAR,GetDate()) + DateName(MONTH,GetDate()) + DateName(DAY,GetDate()) + DateName(HOUR,GetDate()) + DateName(MINUTE,GetDate()) + DateName(S,GetDate()) + DateName(MILLISECOND,GetDate()) -- set @num = (select count(1) from PM_SYS_LOGINLOG where CONVERT(varchar(100),loginTime, 20) >= @begintime and CONVERT(varchar(100),loginTime, 20) <= @endtime) --print(@data) print(@num) --print(@tmpTab) -- 創建臨時表 判斷是否存在如果不存在則刪除 if exists(select * from sys.tables where name = '_tmpTab') begin drop table _tmpTab end -- 創建臨時表 create table _tmpTab ( ID int, LoginName nvarchar(20), Token varchar(50), loginTime datetime, ) -- 將數據插入到臨時表 insert into _tmpTab(id, loginName,loginTime, Token) (select ID, LoginName, loginTime, Token from PM_SYS_LOGINLOG where CONVERT(varchar(100),loginTime, 20) >= @begintime and CONVERT(varchar(100),loginTime, 20) <= @endtime) -- 查詢統計臨時表數據總條數 set @num = (select count(1) from _tmpTab) select @num as 總條數, AVG(調用總數) as 十分鍾內每秒平均執行次數 from (select s.請求時間, (調用一次的總數+ ( select 調用多次 from ( select 請求時間, COUNT(1) 調用多次 from ( select CONVERT(varchar(100),loginTime, 20) as 請求時間, count(1) as 調用次數 from _tmpTab where CONVERT(varchar(100),loginTime, 20) >= @begintime and CONVERT(varchar(100),loginTime, 20) <= @endtime group by loginTime having count(1) > 1) o where 請求時間 = s.請求時間 group by o.請求時間 ) o ) ) as 調用總數 from ( select t.請求時間, count(1) as 調用一次的總數 from ( select CONVERT(varchar(100),loginTime, 20) as 請求時間, count(1) as 調用次數 from _tmpTab where CONVERT(varchar(100),loginTime, 20) >= @begintime and CONVERT(varchar(100),loginTime, 20) <= @endtime group by loginTime having count(1) = 1 ) t group by 請求時間 ) s ) m -- 使用完畢刪除臨時表 drop table _tmpTab
第三次最終優化
declare @begintime varchar(100); -- 開始時間 declare @endtime varchar(100); -- 結束時間 declare @startTime datetime; -- 查詢開始時間 declare @num int; -- 數據總條數 set @begintime = '2019-08-10 08:00:00' -- 開始時間 set @endtime = '2019-08-10 14:20:00' -- 結束時間 set @startTime = GETDATE(); -- 創建臨時表 判斷是否存在如果不存在則刪除 if exists(select * from sys.tables where name = '_tmpTab') begin drop table _tmpTab end -- 創建臨時表 create table _tmpTab ( ID int, LoginName nvarchar(20), Token varchar(50), loginTime datetime, ) -- 將數據插入到臨時表 insert into _tmpTab(id, loginName,loginTime, Token) (select ID, LoginName, loginTime, Token from PM_SYS_LOGINLOG where CONVERT(varchar(100),loginTime, 20) >= @begintime and CONVERT(varchar(100),loginTime, 20) <= @endtime) -- 創建臨時表用於存儲臨時查到的數據進行求平均數 if exists(select * from sys.tables where name = '_tmpAvg') begin drop table _tmpAvg end -- 創建臨時表存儲查詢到的數據 create table _tmpAvg ( reqTime varchar(100), reqNum int ) -- 查詢統計臨時表數據總條數 set @num = (select count(1) from _tmpTab) -- 添加數據到臨時表 insert into _tmpAvg(reqTime, reqNum) (select x.reqTime, (x.reqNum+m.reqNum) as reqNum from ( (select reqTime, sum(1) reqNum from (select CONVERT(varchar(100),loginTime, 20) as reqTime, (count(1) * 1) as reqNum from _tmpTab where CONVERT(varchar(100),loginTime, 20) >= @begintime and CONVERT(varchar(100),loginTime, 20) <= @endtime group by loginTime having count(1) = 1 ) o group by o.reqTime ) as x left join (select reqTime, sum(1) as reqNum from (select CONVERT(varchar(100),loginTime, 20) as reqTime, (count(1) * 2) as reqNum from _tmpTab where CONVERT(varchar(100),loginTime, 20) >= @begintime and CONVERT(varchar(100),loginTime, 20) <= @endtime group by loginTime having count(1) = 2 ) o group by o.reqTime ) as m on x.reqTime = m.reqTime)) select DATEDIFF(MILLISECOND, @startTime, GETDATE()) as 查詢耗時單位秒, @num as 數據總條數, avg(reqNum) 每秒鍾執行次數, @begintime 查詢開始時間, @endtime as 查詢結束時間 from _tmpAvg -- 使用完畢刪除臨時表 drop table _tmpAvg drop table _tmpTab
最后優化結果:平均每秒鍾執行計算 10 條數據
新手初來乍到:代碼親筆手寫,高手路過勿噴,請多多指點