楼主: kinghow

[SQL] SQL最佳实践

[复制链接]
论坛徽章:
98
秀才
日期:2016-02-18 10:06:46山治
日期:2017-02-21 16:18:12秀才
日期:2017-02-22 15:14:12秀才
日期:2017-02-22 15:16:26秀才
日期:2017-02-22 15:18:00秀才
日期:2017-03-01 13:53:39秀才
日期:2017-03-20 13:42:20秀才
日期:2017-03-27 17:52:06秀才
日期:2017-03-28 15:11:09秀才
日期:2017-03-28 15:59:38
11#
发表于 2016-2-16 16:14 | 只看该作者
下载了解压不了啊

使用道具 举报

回复
论坛徽章:
1
优秀写手
日期:2014-11-26 06:00:12
12#
 楼主| 发表于 2016-2-16 16:27 | 只看该作者
可以解压,你重新下载试试

使用道具 举报

回复
论坛徽章:
59
优秀写手
日期:2015-02-12 06:00:132016猴年福章
日期:2016-02-23 09:58:34猴赛雷
日期:2016-02-23 10:04:24紫水晶
日期:2016-04-01 12:19:28双子座
日期:2016-04-28 10:19:29秀才
日期:2016-06-23 14:15:06奥运会纪念徽章:曲棍球
日期:2016-08-30 13:12:24奥运会纪念徽章:体操
日期:2016-09-26 11:24:37妮可·罗宾
日期:2016-10-25 13:54:46娜美
日期:2017-04-28 10:45:33
13#
发表于 2016-2-17 16:11 | 只看该作者
这个下载什么时候可以不再扫二维码。。。。操作越来越麻烦了

使用道具 举报

回复
论坛徽章:
1
优秀写手
日期:2014-11-26 06:00:12
14#
 楼主| 发表于 2016-3-3 17:19 | 只看该作者
最近遇到个问题,要求统计每天在线人数。我们拿Oracle 11g审计日志来做个演示:
先统计最近5天每天活动用户数:
  SELECT TRUNC (timestamp) AS gp, COUNT (DISTINCT USERNAME) active_user_count
    FROM dba_audit_trail
   WHERE timestamp >= SYSDATE - 5
GROUP BY TRUNC (timestamp)
ORDER BY gp DESC;

使用道具 举报

回复
论坛徽章:
1
优秀写手
日期:2014-11-26 06:00:12
15#
 楼主| 发表于 2016-3-3 17:22 | 只看该作者
本帖最后由 kinghow 于 2016-3-4 14:20 编辑

这样只是当天有登录登出用户,如果有隔天登录登出的用户也算是在线,应该这样统计:

with v1 as (select a.USERNAME,trunc(a.timestamp) atimestamp,trunc(b.timestamp) btimestamp from
(select USERNAME,sessionid,timestamp from dba_audit_trail where entryid=1 and timestamp>SYSDATE-5) a,
(select USERNAME,sessionid,timestamp from dba_audit_trail where entryid=2 and timestamp>SYSDATE-5) b
where a.sessionid=b.sessionid),
v2 as (    SELECT TRUNC(SYSDATE-5) +LEVEL-1 gp
      FROM DUAL
CONNECT BY LEVEL<=6)
select gp,COUNT(DISTINCT USERNAME) active_user_count
from v1,v2
where v2.gp>=atimestamp and v2.gp<=btimestamp
GROUP BY gp
ORDER BY gp DESC;

这样cost比统计每天活动增加1倍,执行时间增加4倍。


使用道具 举报

回复
论坛徽章:
1
优秀写手
日期:2014-11-26 06:00:12
16#
 楼主| 发表于 2016-3-3 17:25 | 只看该作者
本帖最后由 kinghow 于 2016-3-4 14:27 编辑

我们用数据来验证一下:

先把登录,登出隔天的sessionid找出来:
select a.sessionid,a.timestamp,b.timestamp,trunc(b.timestamp-a.timestamp)session_times from
(select USERNAME,USERHOST,sessionid,timestamp from dba_audit_trail where entryid=1 and timestamp>SYSDATE-3) a,
(select USERNAME,USERHOST,sessionid,timestamp from dba_audit_trail where entryid=2 and timestamp>SYSDATE-3) b
where a.sessionid=b.sessionid and trunc(b.timestamp-a.timestamp)>1

每天活动用户统计:
  SELECT TRUNC(timestamp) AS gp, COUNT(DISTINCT USERNAME) active_user_count
    FROM dba_audit_trail
   WHERE timestamp>=SYSDATE-5 and sessionid=10284595
GROUP BY TRUNC(timestamp)
ORDER BY gp DESC;

可以看到漏了隔天。

每天在线用户统计:
with v1 as(select a.USERNAME,trunc(a.timestamp)atimestamp,trunc(b.timestamp)btimestamp from
(select USERNAME,sessionid,timestamp from dba_audit_trail where entryid=1 and timestamp>SYSDATE-5) a,
(select USERNAME,sessionid,timestamp from dba_audit_trail where entryid=2 and timestamp>SYSDATE-5) b
where a.sessionid=b.sessionid and  a.sessionid=10284595),
v2 as (    SELECT TRUNC(SYSDATE-5) +LEVEL-1 gp
      FROM DUAL
CONNECT BY LEVEL<=6)
select gp,COUNT(DISTINCT USERNAME) active_user_count
from v1,v2
where v2.gp>=atimestamp and v2.gp<=btimestamp
GROUP BY gp
ORDER BY gp DESC;

可以看到中间天数没有活动,但是在线,也统计出来了。


使用道具 举报

回复
论坛徽章:
1
优秀写手
日期:2014-11-26 06:00:12
17#
 楼主| 发表于 2016-3-3 17:47 | 只看该作者
本帖最后由 kinghow 于 2016-3-4 14:23 编辑

每天用户登录、登出次数
SELECT gp,
        USERNAME,
        action_name,
         COUNT(*)AScnt
    FROM (SELECT TRUNC(timestamp) AS gp, USERNAME,action_name
            FROM dba_audit_trail
           WHERE timestamp>=SYSDATE-3)
GROUP BY gp, USERNAME,action_name
ORDER BY gp DESC, USERNAME,action_name;
10分钟用户登录登出次数
  SELECT gp, action_name,COUNT(*) AS cnt
    FROM(SELECT timestamp,
                   TRUNC(timestamp,'mi')
                - MOD(TO_CHAR(timestamp,'mi'), 10)/24 / 60
                   AS gp,
                action_name
            FROM dba_audit_trail
           WHERE timestamp>SYSDATE-1)
GROUP BY gp, action_name
ORDER BY gp DESC;

每天用户在线时长

select a.USERNAME,a.USERHOST,TRUNC(a.timestamp),sum((b.timestamp-a.timestamp))*24*60*60 "session_time(S)"from
(select USERNAME,USERHOST,sessionid,timestamp from dba_audit_trail where entryid=1 and timestamp>SYSDATE-7) a,
(select USERNAME,USERHOST,sessionid,timestamp from dba_audit_trail where entryid=2 and timestamp>SYSDATE-7) b
where a.sessionid=b.sessionid
group by a.USERNAME,a.USERHOST,TRUNC(a.timestamp)
order by a.USERNAME,a.USERHOST,TRUNC(a.timestamp)

用户在线时长直方图分布
with v1 as(select a.sessionid,(b.timestamp-a.timestamp)*24*60*60 session_times from
(select sessionid,timestamp from dba_audit_trail where entryid=1 and timestamp>SYSDATE-1) a,
(select sessionid,timestamp from dba_audit_trail where entryid=2 and timestamp>SYSDATE-1) b
where a.sessionid=b.sessionid)
  SELECT session_times_histogram * 500 Spend_Bucket, COUNT(*) aa
    FROM(  SELECT  WIDTH_BUCKET(session_times,
                                 0,
                                 5000,
                                 10)
                      AS session_times_histogram
             FROM v1)
GROUP BY session_times_histogram * 500
ORDER BY 1;

最近3天密码错误次数统计,可以看看有没有人尝试暴力破解的:

select os_username,userhost,username,count(*)
  from dba_audit_trail
where returncode = 1017 and timestamp>SYSDATE-3
group by os_username,userhost,username
having count(*)>10

SELECT *
  FROM(  SELECT username,
                userhost,
                timestamp,
                action_name
            FROM dba_audit_trail
           WHERE returncode = 1017 and username='XXX'
        ORDER BY timestamp DESC)
WHERE ROWNUM<=100

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
18#
发表于 2016-3-3 23:42 | 只看该作者
你这代码怎么都没有空格分隔?

使用道具 举报

回复
论坛徽章:
1
优秀写手
日期:2014-11-26 06:00:12
19#
 楼主| 发表于 2016-3-4 14:16 | 只看该作者
本帖最后由 kinghow 于 2016-3-4 14:29 编辑

直接从word,toad拷贝的,编辑了一下,现在可以直接执行了。

使用道具 举报

回复
论坛徽章:
1
2013年新春福章
日期:2013-02-25 14:51:24
20#
发表于 2016-10-23 00:41 | 只看该作者
好东西啊,值得学习。。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表