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
sql server 大数据, 统计分组查询,数据量比较大计算每秒钟执行数据执行次数的更多相关文章
- SQL Server的镜像是基于物理块变化的复制 镜像Failover之后数据的预热问题
SQL Server的镜像是基于物理块变化的复制 镜像Failover之后数据的预热问题 基于物理块变化的复制,没有并行也是很快的. 逻辑复制的日志是按事务结束的时间排序的,而物理复制是与事务无关的, ...
- SQL Server 按某一字段分组 取 最大 (小)值所在行的数据
SQL Server 按某一字段分组 取 最大 (小)值所在行的数据 -- 按某一字段分组 取 最大 (小)值所在行的数据 -- (爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开) 2007-10-23 ...
- Sql Server来龙去脉系列之三 查询过程跟踪
我们在读写数据库文件时,当文件被读.写或者出现错误时,这些过程活动都会触发一些运行时事件.从一个用户角度来看,有些时候会关注这些事件,特别是我们调试.审核.服务维护.例如,当数据库错误出现.列数据被更 ...
- c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程
c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...
- 在SQL Server 2016里使用查询存储进行性能调优
作为一个DBA,排除SQL Server问题是我们的职责之一,每个月都有很多人给我们带来各种不能解释却要解决的性能问题. 我就多次听到,以前的SQL Server的性能问题都还好且在正常范围内,但现在 ...
- SQL Server,Access数据库查询易混点和C#中parameter指定参数长度的优缺点
在学校的时候就经常做一些网站,所以这次在公司实习,组长第一次给了一个企业的网站还是很快的完成了.中间并没有遇到什么大的问题,但是还是遇到了两个新手非常容易混淆的小问题,所以拿出来跟大家分享一下. 主要 ...
- 在SQL Server中用好模糊查询指令LIKE
简介:like在sql中的使用 在SQL Server中用好模糊查询指令LIKE 查询是SQL Server中重要的功能,而在查询中将Like用上,可以搜索到一些意想不到的结果和效果,like的神奇之 ...
- 在SQL Server中用好模糊查询指令LIKE (转载)
like在sql中的使用:在SQL Server中用好模糊查询指令LIKE:查询是SQL Server中重要的功能,而在查询中将Like用上,可以搜索到一些意想不到的结果和效果,like的神奇 一.一 ...
- SQL Server 锁表、查询被锁表、解锁相关语句
SQL Server 锁表.查询被锁表.解锁相关语句,供参考. --锁表(其它事务不能读.更新.删除) BEGIN TRAN SELECT * FROM <表名> WITH(TABLOCK ...
- sql server Service Broker 相关查询
sql server Service Broker 相关查询 -- 查看传输队列中的消息 --如果尝试从队列中移除时,列将表明哪里出现了问题 select * from sys.transmissio ...
随机推荐
- DNS解析过程--笔试答题版
在运维笔试的时候,回答DNS解析的过程,不能写一大堆,一是不美观,二是浪费时间,应该怎么写呢?我觉得这样写比较好. 1.客户端:chche----hosts 2.DNS服务器:cache---递归-- ...
- 201871010125 王玉江 《面向对象程序设计(java)》 第四周学习总结
项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/wswyj/ 作业学习目 ...
- BOI 2003 团伙
洛谷 P1892 [BOI2003]团伙 洛谷传送门 题目描述 1920年的芝加哥,出现了一群强盗.如果两个强盗遇上了,那么他们要么是朋友,要么是敌人.而且有一点是肯定的,就是: 我朋友的朋友是我的朋 ...
- LG2053/BZOJ1070 「SCOI2007」修车 费用流
问题描述 LG2053 BZOJ1070 题解 将\(m\)个修理工拆为\(n \times m\)个,将修理工和车辆看做二分图,连出一个完全二分图. 边流量为\(1\),费用为时间,费用流即可. \ ...
- 缓存原理,自己写一个缓存类(c#版)
.net中的MemoryCache是通过内部封装一个静态Dictionary 自己写一个缓存,来看看内部怎么实现的 public class CustomerCache : ICache { priv ...
- 【Excel】截取字符 LEFT(A1,2) RIGHT(A1,2) MID(SHEET1!E2,1,9)
LEFT(A1,2)从左边取两个字符 RIGHT(A1,2)从右边取两个字符 MID(SHEET1!E2,1,9)从sheet1表E2单元格中第一位起后9位 可以嵌套
- 【oracle】ceil函数 返回值 (大于参数的最小整数)
SELECT CEIL(15.8) FROM DUAL;==========16 SELECT CEIL(-15.8) FROM DUAL;==========-15
- requests获取图片的宽和高
try: if cover: resp = requests.get('%s?x-oss-process=image/info' % (url), timeout=30) if resp.status ...
- Ztree + bootstarp-table 使用
Ztree + bootstarp-table 使用 一. Ztree 1.引入js/css文件 Ztree官网 <!--ztree--> <link rel="sty ...
- Vue插槽详解 | 什么是插槽?
作者 | Jeskson 来源 | 达达前端小酒馆 什么是插槽?插槽的指令为v-slot,它目前取代了slot和slot-scope,插槽内容,vue实例一套内容分发的api,将slot元素作为承载分 ...