sql server 大數據, 統計分組查詢,數據量比較大計算每秒鍾執行數據執行次數


-- 數據量比較大的情況,統計十分鍾內每秒鍾執行次數

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 條數據 

新手初來乍到:代碼親筆手寫,高手路過勿噴,請多多指點

原鏈接:https://www.cnblogs.com/FGang/p/11330736.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM