加载中…
个人资料
寸草心
寸草心
  • 博客等级:
  • 博客积分:0
  • 博客访问:23,579
  • 关注人气:4
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
分类
搜博主文章
好友
加载中…
访客
加载中…
评论
加载中…
博文
(2010-05-08 22:04)
标签:

it

分类: ORACLE

一.WM_CONCAT:用逗号连接数据,行转列.WM_CONCAT(p1 IN VARCHAR2) RETURN VARCHAR2

例子:

SELECT
    ENAME, DEPTNO,
    wm_concat(ENAME) over (partition by DEPTNO) dd
FROM SCOTT.EMP
order by DEPTNO

结果:


二.WM_CONTAINS:WM_CONTAINS(p1 IN WM_PERIOD, p2 IN WM_PERIOD) RETURN INTEGER.检查p1是否包含p2

例子:

select
    wm_contains(
        wm_period(to_date('2010-01-01', 'yyyy-mm-dd'), to_date('2010-01-31', 'yyyy-mm-dd')),
     

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
分类: ORACLE

Oracle的GROUP BY语句除了最基本的语法外,还支持ROLLUP和CUBE语句。如果是ROLLUP(A, B, C)的话,首先会对(A、B、C)进行GROUP BY,然后对(A、B)进行GROUP BY,然后是(A)进行GROUP BY,最后对全表进行GROUP BY操作。如果是GROUP BY CUBE(A, B, C),则首先会对(A、B、C)进行GROUP BY,然后依次是(A、B),(A、C),(A),(B、C),(B),(C),最后对全表进行GROUP BY操作。 grouping_id()可以美化效果。

一、CUBE和ROLLUP

例子:

SELECT
        MANAGER_ID, DEPARTMENT_ID, SUM(SALARY) DD
    FROM EMPLOYEES EMP
    WHERE DEPARTMENT_ID IN (20,30)
    GROUP BY CUBE(DEPARTMENT_ID,MANAGER_ID)

返回结果:

MANAGER_ID DEPARTMENT_ID DD

            &n

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
(2010-04-26 19:52)
分类: ORACLE

参考:http://q.yesky.com/group/review-17556889.html

十二、PERCENTILE_CONT   返回一个与输入的分布百分比值相对应的数据值,分布百分比的计算方法见函数PERCENT_RANK,如果没有正好对应的数据值,就通过下面算法来得到值:
    RN = 1+ (P*(N-1)) 其中P是输入的分布百分比值,N是组内的行数
    CRN = CEIL(RN)

    FRN = FLOOR(RN) 
   if (CRN = FRN = RN) then
        (value of expression_r from row at RN)
   else
       (CRN - RN) * (value of expression_r for row at FRN) + (RN - FRN) * (value of expression_r for row at CRN)
注意:本函数与PERCENTILE_DISC的区别在找不到对应的分布值时返回的替代值的计算方法不同
    例子:

    SELECT
        EMPLOYEE_ID, SAL

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
(2010-04-26 14:32)
分类: ORACLE

    知识铺垫:分析函数中经常用到排序,如果排序列中包含NULL值,则NULL大于其他值,可以利用NULLS LAST和NULLS FIRST。注意是NULLS,而不是NULL。

一、AVG() 用于计算一个组和数据窗口内表达式的平均值。
    例子:

    SELECT
        EMPLOYEE_ID, SALARY, MANAGER_ID, DEPARTMENT_ID,
        ROUND(AVG(SALARY) OVER (PARTITION BY DEPARTMENT_ID ORDER BY SALARY),2) DD
    FROM EMPLOYEES EMP
    ORDER BY DEPARTMENT_ID

    返回结果:

    EMPLOYEE_ID  SALARY   MANAGER_ID   DEPARTMENT_ID   DD
    200          4400     101          10              440

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
(2010-04-26 13:31)
标签:

杂谈

分类: ORACLE

基本介绍:

Analytic_clause的语法如下:
[ query_partition_clause ] [ order_by_clause [ windowing_clause ] ]
这里:
query_partition_clause是查询分组子句;
order_by_clause是分组排序子句;
windowing_clause是窗口范围子句。

分析函数在查询结果集确定之后才开始进行计算,Analytic_clause就是用来定义函数怎样对查询结果集进行分组计算的。

根据Oracle对查询和分析函数的处理方法可知,在select和order by子句中都可以使用分析函数。

query_partition_by、order_by_clause和windowing_clause三个子句是可选的,将三个子句分别简记为p,o,w。
合法的组合方式有如下6种:
1).        Pow
(query_partition_clause order_by_clause windowing_clause)
分组,排序,定义窗口范围
2).        Po
(query_partition_clause order_by_clause)
分组,排序,窗口默认为range between unbounded preceding and current row
3).        P
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

杂谈

分类: ORACLE

复合索引的第一列一定要出现在WHERE子句中。

一.like '%_' 百分号在前.
    二.WHERE中单独引用复合索引里第一位置的索引列,并且SELECT、GROUP BY等子句中包含非复合索引列

例句:

用不到索引

SELECT
         CORP.BATCHCODE, CORP.CLITNO,  CORP.LOANBLAN
    FROM VI_CORPCLIT_INFO CORP
    WHERE CORP.BATCHCODE = '200910'

用到索引

SELECT
         CORP.BATCHCODE, CORP.CLITNO
    FROM VI_CORPCLIT_INFO CORP
    WHERE CORP.BATCHCODE = '200910'
    三.字符型字段为数字时在where条件里不添加引号.

四.字符型

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

杂谈

分类: ORACLE
36.       用UNION替换OR (适用于索引列)
通常情况下, 用UNION替换WHERE子句中的OR将会起到较好的效果. 对索引列使用OR将造成全表扫描. 注意, 以上规则只针对多个索引列有效. 如果有column没有被索引, 查询效率可能会因为你没有选择OR而降低. 
   在下面的例子中, LOC_ID 和REGION上都建有索引.
高效:
   SELECT LOC_ID , LOC_DESC , REGION
   FROM LOCATION
   WHERE LOC_ID = 10
   UNION
   SELECT LOC_ID , LOC_DESC , REGION
   FROM LOCATION
   WHERE REGION = 'MELBOURNE'

低效:
   SELECT LOC_ID , LOC_DESC , REGION
   FROM LOCATION
   WHERE LOC_ID = 10 OR REGION = 'MELBOURNE'

如果你坚持要用OR, 那就需要返回记录最少的索引列写在最前面.

注意:

WHERE KEY1 = 10   (返回最少记录)
OR KEY2 = 20        (返回最多记录)

ORACLE 内

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

杂谈

分类: ORACLE
22.       识别'低效执行'的SQL语句
用下列SQL工具找出低效SQL:
 SELECT EXECUTIONS , DISK_READS, BUFFER_GETS,
        ROUND((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2) Hit_radio,
        ROUND(DISK_READS/EXECUTIONS,2) Reads_per_run,
        SQL_TEXT
FROM   V$SQLAREA
WHERE  EXECUTIONS>;0
AND     BUFFER_GETS >; 0 
AND (BUFFER_GETS-DISK_READS)/BUFFER_GETS < 0.8 
ORDER BY 4 DESC;
     (译者按: 虽然目前各种关于SQL优化的图形化工具层出不穷,但是写出自己的SQL工具来解决问题始终是一个最好的方法)


23.       使用TKPROF 工具来查询SQL性能状态
 SQL trace 工具收集正在执行的SQL的性能状态数据并记录到一个跟踪文件中. 这个跟踪文件提供了许多有用的信息,例如解析次数.执行次数,CPU使用时间等.这些

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

杂谈

分类: ORACLE

转载!还没来得急细看!

1. 选用适合的ORACLE优化器
    ORACLE的优化器共有3种:
   a.  RULE (基于规则)   b. COST (基于成本)  c. CHOOSE (选择性)
    设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS . 你当然也在SQL句级或是会话(session)级对其进行覆盖.
   为了使用基于成本的优化器(CBO, Cost-Based Optimizer) , 你必须经常运行analyze 命令,以增加数据库中的对象统计信息(object statistics)的准确性.
   如果数据库的优化器模式设置为选择性(CHOOSE),那么实际的优化器模式将和是否运行过analyze命令有关. 如果table已经被analyze过, 优化器模式将自动成为CBO , 反之,数据库将采用RULE形式的优化器.
   在缺省情况下,ORACLE采用CHOOSE优化器, 为了避免那些不必要的全表扫描(full table scan) , 你必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器.
  2.       访问Table的方式
&

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
分类: ORACLE

一:表的恢复

     对误删的表,只要没有使用PURGE永久删除选项,那么从flash back区恢复回来希望是挺大的。一般步骤有:

1、从flash back里查询被删除的表

    select * from recyclebin

2.执行表的恢复

   flashback table  tb  to before drop,这里的tb代表你要恢复的表的名称。

二:表数据恢复

    对误删的表记录,只要没有t

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

新浪公司 版权所有