并发用户报告

     2023-03-31     255

关键词:

【中文标题】并发用户报告【英文标题】:Concurrent User Report 【发布时间】:2013-10-28 15:53:38 【问题描述】:

我在 Oracle 中有一个跟踪用户登录和注销/超时的表。我正在进行选择查询,以按小时显示过去 7 天的并发用户数。我有一个基本查询,但它没有正确计算会话超过午夜的用户。

关于数据/我的查询的一些信息:

Lo​​gintracking 保存所有用户登录操作,例如登录/注销/超时操作。每个操作都位于单独的行中。 Attemptdate 是动作发生的时间 Attemptresult7 是登录操作的结果(LOGIN/LOGOUT/TIMEOUT) Maxsessionuid 是用户会话 id,可用于将登录与注销/超时联系起来。 我正在使用左外自连接来匹配登录和基于会话 ID 的注销。由于用户可能仍处于登录状态,因此我将空注销日期替换为 sysdate。 我按年/月/日对数据进行分组,并删除用户可能以不同方式登录两次的所有记录。在此报告中,同一用户登录 10 次仅被视为 1 个并发用户。 (这部分也没有真正起作用,因为我的不同之处在于登录和注销时间,会话之间可能会有所不同。我真的需要为同一用户组合重叠会话......) 我通过查看从 0 到 23 的每小时是否介于他们的登录和注销之间来计算并发用户的数量(这当然不适用于跨天的会话)

--到目前为止我的 Oracle 查询:

Select Lyear,
        Lmonth,
        Lday,
        Sum(Case When 0 Between Lhour And Ohour Then 1 Else 0 End) H00,
        Sum(CASE WHEN 1 between LHour and OHour Then 1 Else 0 End) H01,
        Sum(CASE WHEN 2 between LHour and OHour Then 1 Else 0 End) H02,
        Sum(Case When 3 Between Lhour And Ohour Then 1 Else 0 End) H03,
        Sum(CASE WHEN 4 between LHour and OHour Then 1 Else 0 End) H04,
        Sum(CASE WHEN 5 between LHour and OHour Then 1 Else 0 End) H05,
        Sum(CASE WHEN 6 between LHour and OHour Then 1 Else 0 End) H06,
        Sum(CASE WHEN 7 between LHour and OHour Then 1 Else 0 End) H07,
        Sum(CASE WHEN 8 between LHour and OHour Then 1 Else 0 End) H08,
        Sum(Case When 9 Between Lhour And Ohour Then 1 Else 0 End) H09,
        Sum(CASE WHEN 10 between LHour and OHour Then 1 Else 0 End) H10,
        Sum(CASE WHEN 11 between LHour and OHour Then 1 Else 0 End) H11,
        Sum(CASE WHEN 12 between LHour and OHour Then 1 Else 0 End) H12,
        Sum(CASE WHEN 13 between LHour and OHour Then 1 Else 0 End) H13,
        Sum(CASE WHEN 14 between LHour and OHour Then 1 Else 0 End) H14,
        Sum(CASE WHEN 15 between LHour and OHour Then 1 Else 0 End) H15,
        Sum(Case When 16 Between Lhour And Ohour Then 1 Else 0 End) H16,
        Sum(Case When 17 Between Lhour And Ohour Then 1 Else 0 End) H17,
        Sum(Case When 18 Between Lhour And Ohour Then 1 Else 0 End) H18,
        Sum(CASE WHEN 19 between LHour and OHour Then 1 Else 0 End) H19,
        Sum(Case When 20 Between Lhour And Ohour Then 1 Else 0 End) H20,
        Sum(Case When 21 Between Lhour And Ohour Then 1 Else 0 End) H21,
        Sum(CASE WHEN 22 between LHour and OHour Then 1 Else 0 End) H22,
        Sum(Case When 23 Between Lhour And Ohour Then 1 Else 0 End) H23
From (    
Select Distinct L1.Userid,
         Extract(Year From L1.Attemptdate) Lyear,  
         Extract(Month From L1.Attemptdate) Lmonth, 
         Extract(Day From L1.Attemptdate) Lday,
    --You can't extract HOUR from a date, must be a timestamp
         Extract(Hour From Cast(L1.Attemptdate As Timestamp)) As Lhour, 
         Extract(Hour From Cast(NVL(L2.Attemptdate,SYSDATE) As Timestamp)) As OHour
  From Maximo.Logintracking L1
        LEFT OUTER JOIN Maximo.Logintracking L2 On
          L1.Maxsessionuid = L2.Maxsessionuid
  Where L1.Attemptresult7 = 'LOGIN' And L2.Attemptresult7 != 'LOGIN'
        And L1.Attemptdate > Trunc( Sysdate)-7
        And L2.Attemptdate > Trunc(Sysdate)-7) Sessions
Group By Lyear, Lmonth, Lday    
ORDER By LYear, LMonth, LDay

查询不必像现在一样保持不变。但最终结果应该是我按小时查看了 x 天的并发用户数。

相关:How to count the number of concurrent users using time interval data?

【问题讨论】:

【参考方案1】:

在此过程中,我写得非常简单整洁的查询变成了这个怪物(似乎有效,所以至少有一件好事):

CREATE TABLE logintracking (
  userid NUMBER,
  maxsessionuid NUMBER,
  Attemptdate DATE,
  attemptresult7 VARCHAR2(20)
);

INSERT INTO logintracking VALUES (1, 100, TO_DATE('27-10-2013 10:00:00', 'DD-MM-YYYY HH24:MI:SS'), 'LOGIN');
INSERT INTO logintracking VALUES (1, 100, TO_DATE('27-10-2013 12:00:00', 'DD-MM-YYYY HH24:MI:SS'), 'LOGOUT');

INSERT INTO logintracking VALUES (1, 101, TO_DATE('27-10-2013 11:00:00', 'DD-MM-YYYY HH24:MI:SS'), 'LOGIN');
INSERT INTO logintracking VALUES (1, 101, TO_DATE('27-10-2013 15:00:00', 'DD-MM-YYYY HH24:MI:SS'), 'LOGOUT');

INSERT INTO logintracking VALUES (1, 102, TO_DATE('27-10-2013 23:00:00', 'DD-MM-YYYY HH24:MI:SS'), 'LOGIN');
INSERT INTO logintracking VALUES (1, 102, TO_DATE('28-10-2013 02:00:00', 'DD-MM-YYYY HH24:MI:SS'), 'LOGOUT');

INSERT INTO logintracking VALUES (1, 103, TO_DATE('27-10-2013 20:00:00', 'DD-MM-YYYY HH24:MI:SS'), 'LOGIN');
INSERT INTO logintracking VALUES (1, 103, TO_DATE('28-10-2013 01:00:00', 'DD-MM-YYYY HH24:MI:SS'), 'LOGOUT');

INSERT INTO logintracking VALUES (2, 104, TO_DATE('27-10-2013 23:00:00', 'DD-MM-YYYY HH24:MI:SS'), 'LOGIN');
INSERT INTO logintracking VALUES (2, 104, TO_DATE('28-10-2013 02:00:00', 'DD-MM-YYYY HH24:MI:SS'), 'LOGOUT');

COMMIT;

WITH
  hours_of_last_7_days AS (
    SELECT TRUNC(SYSDATE, 'HH24') - numtodsinterval(level, 'HOUR') AS hour_val
      FROM dual
    CONNECT BY level <= 7 * 24
  )
SELECT
    lyear,
    lmonth,
    lday,
    SUM(DECODE(lhour, 0, 1, 0)) AS H00,
    SUM(DECODE(lhour, 1, 1, 0)) AS H01,
    SUM(DECODE(lhour, 2, 1, 0)) AS H02,
    SUM(DECODE(lhour, 3, 1, 0)) AS H03,
    SUM(DECODE(lhour, 4, 1, 0)) AS H04,
    SUM(DECODE(lhour, 5, 1, 0)) AS H05,
    SUM(DECODE(lhour, 6, 1, 0)) AS H06,
    SUM(DECODE(lhour, 7, 1, 0)) AS H07,
    SUM(DECODE(lhour, 8, 1, 0)) AS H08,
    SUM(DECODE(lhour, 9, 1, 0)) AS H09,
    SUM(DECODE(lhour, 10, 1, 0)) AS H10,
    SUM(DECODE(lhour, 11, 1, 0)) AS H11,
    SUM(DECODE(lhour, 12, 1, 0)) AS H12,
    SUM(DECODE(lhour, 13, 1, 0)) AS H13,
    SUM(DECODE(lhour, 14, 1, 0)) AS H14,
    SUM(DECODE(lhour, 15, 1, 0)) AS H15,
    SUM(DECODE(lhour, 16, 1, 0)) AS H16,
    SUM(DECODE(lhour, 17, 1, 0)) AS H17,
    SUM(DECODE(lhour, 18, 1, 0)) AS H18,
    SUM(DECODE(lhour, 19, 1, 0)) AS H19,
    SUM(DECODE(lhour, 20, 1, 0)) AS H20,
    SUM(DECODE(lhour, 21, 1, 0)) AS H21,
    SUM(DECODE(lhour, 22, 1, 0)) AS H22,
    SUM(DECODE(lhour, 23, 1, 0)) AS H23
  FROM (
    SELECT
      DISTINCT
          sessions.userid,
          EXTRACT(YEAR FROM hour_val) AS lyear,
          EXTRACT(MONTH FROM hour_val) AS lmonth,
          EXTRACT(DAY FROM hour_val) AS lday,
          EXTRACT(HOUR FROM CAST(hour_val AS TIMESTAMP)) AS lhour
        FROM (
            SELECT start_lt.userid, start_lt.attemptdate AS login_date, NVL(end_lt.attemptdate, sysdate) AS logout_date
              FROM
                logintracking start_lt
                  LEFT OUTER JOIN logintracking end_lt  ON (start_lt.maxsessionuid = end_lt.maxsessionuid AND start_lt.attemptresult7 <> end_lt.attemptresult7)
            WHERE
              start_lt.attemptresult7 = 'LOGIN'
              AND start_lt.attemptdate > Trunc(SYSDATE) - 8
          ) sessions
          JOIN hours_of_last_7_days hd ON (hd.hour_val BETWEEN trunc(sessions.login_date,'HH24') AND trunc(sessions.logout_date,'HH24'))
  )
GROUP BY lyear, lmonth, lday
ORDER BY lyear, lmonth, lday
;

输出:

 LYEAR LMONTH LDAY H00 H01 H02 H03 H04 H05 H06 H07 H08 H09 H10 H11 H12 H13 H14 H15 H16 H17 H18 H19 H20 H21 H22 H23
---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
      2013 10 27 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 1 1 1 2
      2013 10 28 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

【讨论】:

非常感谢。我将 Hours_Of_Last_7_days 更改为使用 TRUNC(SYSDATE,'DDD'),我还将内部选择更改为使用 Trunc(SYSDATE,'DDD') - 8 而不是 -7,因为它会切断在午夜之前开始的登录会话第一天,但​​在午夜后结束。

真实性能测试案例之性能分析与报告

...,根据目前业务的需要,需要测试在线考试能否支持100的并发量。一、场景描述采取逐步增加用户数(每10分钟增加用户数20人)对在线考试进行并发操作,达到100人为止;当并发数达到100后则继续运行一段时间(30 查看详情

性能测试基本概念聚合报告指标分析

...其它JMeter测试元件的容器。2.线程组:代表一定数量的并发用户,它可以用来模拟并发用户发送请求。实际的请求内容在Sampler中定义,它被线程组包含。可以在“测试计划->添加->线程组”来建立它,然后在线程组面... 查看详情

badboy——并发报告断点

badboy的并发:1.工具栏中“Tools”—选中“RunBackgroundThreads...”               2."NunberofThreads"——跑的个数;“Staggertime(seconds)”——每次请求中间的间隔时间。设置好后点击“Start”开始。... 查看详情

MS SQL 并发,多余的锁

】MSSQL并发,多余的锁【英文标题】:MSSQLConcurrency,excessLocks【发布时间】:2008-10-1015:39:49【问题描述】:我在mssql2000上有一个数据库,一次被数百名用户访问。使用ReportingServices2005访问同一数据库的大量报告。当有大量报告正在... 查看详情

loadrunner

...款性能测试软件,通过模拟真实的用户行为,通过负载、并发和性能实时监控以及完成后的测试报告,分析系统可能存在的瓶颈,LoadRunner最为有效的手段之一应该就是并发控制,通过在控制台的设置,以达到同一个业务同时模... 查看详情

避免并发删除死锁

】避免并发删除死锁【英文标题】:Avoiddeadlockforconcurrentdelete【发布时间】:2013-02-2518:12:44【问题描述】:我有一个名为Products的表,其中包含许多列。它是用于报告目的的临时表。多个用户请求将同时处理数据到该表。有单独... 查看详情

jmeter多用户利用集合点瞬压并发测试

    在测试一些限时秒杀类似的接口时,需要模拟多用户同时一瞬间访问接口,我们这里简单模拟多用户同时访问百度。1、首先打开Jmeter,在测试计划下添加线程组。2.在线程组下添加HTTP请求。3.在HTTP请求下添加察... 查看详情

jmeter接口稳定性测试

1.创建进行测试的脚本2.场景设置线程组设置并发用户数30在启动1s,30并发用户全部启动循环设置为永远采用调度器:有两种工作方式1.设置启动和结束时间2.设置持续时间,我设置的是60s(因为我的脚本是1分钟内抽奖的)集合点... 查看详情

[c#]c#并发编程-异步编程基础-报告进度

1intProgressRate=0;23privateasyncvoidbtnProgress_Click(objectsender,EventArgse)4{5ProgressRate=0;67varprogress=newProgress<int>();89//progress的进度改变10progress.ProgressChanged+=(obj1,obj2)=>11{ 查看详情

jmeter生成测试报告

...能够生成漂亮的HTML测试报告。上图是测试统计图20个用户并发,测试时长一分钟,发起流程320次,没有出错,TPS为6.5,平均发起流程事务响应时间为2.9秒,意思是启动20个流程的时间为2.9秒。TPS计算方法为:完成事务总数/测试时... 查看详情

性能测试基本概念聚合报告指标分析

...其它JMeter测试元件的容器。2.线程组:代表一定数量的并发用户,它可以用来模拟并发用户发送请求。实际的请求内容在Sampler中定义,它被线程组包含。可以在“测试计划->添加->线程组”来建立它,然后在线程组面... 查看详情

jmeterconcurrencythreadgroup阶梯式加压

...经不被官方推荐了,所以现在我们使用ConcurrencyThreadGroup并发线程组;下载ConcurrencyThreadGroup并发线程组插件,选择或者搜索CustomThreadGroups:下载完成之后,JMeter会自动重启。在测试计划里面添加并发线程组: 并发线程组允许... 查看详情

openmp使用体验报告(概述)(代码片段)

...并不能并行计算,这是很显然的,只有一个核心只能做到并发处理(与并行处理区别),这是一种虚拟化的技术,让用户感觉计算机在同时处理多任务,而事实上是通过分时算法来分割、分配任务,从而给用户多任务同时处理的... 查看详情

理解什么是真正的并发数

你,真的理解什么是并发数吗?从事测试行业的兄dei,或多或少都知道并发数的概念。在计算机领域里,并发数是指同时访问服务器站点的连接数。在实际工作中,经常发现很多人对并发数有误解。比如领导... 查看详情

jemter命令行并发执行

1.开启gui-设置用户定义变量  2.在线程组进行参数化  3.将以上内容保存,并且保证当前脚本已调试通过4.开启cmd,进入jmeter/bin目录下C:UsershuiDesktop oolsapache-jmeter-3.3in>执行:jmeter.bat-JthreadNum=2-JloopNum=2 -n-tC:Usersh... 查看详情

jmeter并发用户数,在线用户数,平均并发峰值并发实战演示(代码片段)

jmeter并发用户数,在线用户数,平均并发峰值并发介绍:【记录以下两个案例】在线用户数与并发用户数的区别和比例关系在线用户数:用户同时在一定时间段的在线数量并发用户数:某一时刻同时向服务器... 查看详情

jmeter性能测试指标--最佳并发用户数和最大并发用户数

参考技术A最佳并发用户数:当系统的负载等于最佳并发用户数时,系统的整体效率最高,没有资源被浪费,用户也不需要等待最大并发用户数:系统的负载一直持续,有些用户在处理而有的用户在自己最大的等待时间内等待的... 查看详情

在线抢购系统需求分析报告

...幅推广(3) 瞬间售空(4) 定时上架,定时结束(5) 并发量高2. 技术挑战(1) 对现有业务的冲击(2) 高并发的环境下,数据库负担(3) 高并发情况下网络的波动(4) 前端对数据显示的处理(5) 产品定时上架的 查看详情