51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 34996|回复: 70
打印 上一主题 下一主题

oracle10g基础教程(第二版)ppt

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2007-12-18 11:30:05 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
分享

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

71#
发表于 2012-2-1 17:19:16 | 只看该作者
回复 支持 反对

使用道具 举报

该用户从未签到

70#
发表于 2012-1-4 11:10:54 | 只看该作者
感谢 楼主分享
回复 支持 反对

使用道具 举报

该用户从未签到

69#
发表于 2011-12-16 16:13:07 | 只看该作者
下载了~谢谢
回复 支持 反对

使用道具 举报

该用户从未签到

68#
发表于 2011-12-12 21:25:53 | 只看该作者
不错  顶
回复 支持 反对

使用道具 举报

  • TA的每日心情
    奋斗
    2016-4-28 05:52
  • 签到天数: 17 天

    连续签到: 1 天

    [LV.4]测试营长

    67#
    发表于 2011-12-9 16:07:26 | 只看该作者
    3ks,无私啊
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    66#
    发表于 2011-8-16 16:04:53 | 只看该作者
    收藏了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    65#
    发表于 2011-8-7 09:20:17 | 只看该作者
    3x
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    64#
    发表于 2011-3-4 13:44:55 | 只看该作者
    用IN来替换OR

        下面的查询可以被更有效率的语句替换:

        低效:

        SELECT…
        FROM LOCATION
     WHERE LOC_ID = 10
     OR     LOC_ID = 20
     OR     LOC_ID = 30

        高效:

     SELECT…
        FROM LOCATION
     WHERE LOC_IN IN
    (10,20,30);

        按:这是一条简单易记的规则,但是实际的执行效果还须检验,在ORACLE8i下,两者的执行路径似乎是相同的。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    63#
    发表于 2011-3-4 13:39:48 | 只看该作者
    减少对表的查询

     在含有子查询的SQL语句中,要特别注意减少对表的查询。

        例如:

     低效

              SELECT TAB_NAME
              FROM TABLES
              WHERE TAB_NAME = ( SELECT TAB_NAME
                                    FROM TAB_COLUMNS
                                    WHERE VERSION = 604)
              AND DB_VER= ( SELECT DB_VER
                               FROM TAB_COLUMNS
                               WHERE VERSION = 604)

    高效

              SELECT TAB_NAME
              FROM TABLES
              WHERE (TAB_NAME,DB_VER)
    = ( SELECT TAB_NAME,DB_VER)
                       FROM TAB_COLUMNS
                       WHERE VERSION = 604)
        Update 多个Column 例子:

     低效:

               UPDATE EMP
               SET EMP_CAT = (SELECT MAX(CATEGORY) FROM EMP_CATEGORIES),
                  SAL_RANGE = (SELECT MAX(SAL_RANGE) FROM EMP_CATEGORIES)
               WHERE EMP_DEPT = 0020;
     高效:

              UPDATE EMP
              SET (EMP_CAT, SAL_RANGE)
              = (SELECT MAX(CATEGORY) , MAX(SAL_RANGE)
              FROM EMP_CATEGORIES)
               WHERE EMP_DEPT = 0020;
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    62#
    发表于 2011-3-4 13:38:23 | 只看该作者
    用Where子句替换HAVING子句

     避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤。 这个处理需要排序,总计等操作。 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销。

        例如:

     低效:

         SELECT REGION,AVG(LOG_SIZE)
         FROM LOCATION
         GROUP BY REGION
         HAVING REGION REGION != ‘SYDNEY’
         AND REGION != ‘PERTH’
     高效

         SELECT REGION,AVG(LOG_SIZE)
         FROM LOCATION
         WHERE REGION REGION != ‘SYDNEY’
         AND REGION != ‘PERTH’
         GROUP BY REGION
    (HAVING 中的条件一般用于对一些集合函数的比较,如COUNT() 等等。 除此而外,一般的条件应该写在WHERE子句中)
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    61#
    发表于 2011-3-4 13:35:58 | 只看该作者
    count*
    count1)稍快

    当然如果可以通过索引检索,对索引列的计数仍旧是最快的。
    例如 COUNTEMPNO
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    60#
    发表于 2011-3-4 11:57:42 | 只看该作者
    最高效的删除重复记录方法 ( 因为使用了ROWID)

    DELETE FROM EMP E
    WHERE E.ROWID > (SELECT MIN(X.ROWID)
                       FROM EMP X
                       WHERE X.EMP_NO = E.EMP_NO);
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    59#
    发表于 2011-3-4 11:05:57 | 只看该作者
    ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。

        例如:

     (低效,执行时间156.3秒)

    SELECT …
    FROM EMP E
    WHERE SAL > 50000
    AND    JOB = ‘MANAGER’
    AND    25 < (SELECT COUNT(*) FROM EMP
                 WHERE MGR=E.EMPNO);
    (高效,执行时间10.6秒)
    SELECT …
    FROM EMP E
    WHERE 25 < (SELECT COUNT(*) FROM EMP
                 WHERE MGR=E.EMPNO)
    AND    SAL > 50000
    AND    JOB = ‘MANAGER’;
    6. SELECT子句中避免使用 ‘ * ’

     当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用 ‘*’ 是一个方便的方法。不幸的是,这是一个非常低效的方法。 实际上,ORACLE在解析的过程中, 会将‘*’ 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。

    7.减少访问数据库的次数

     当执行每条SQL语句时, ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等等。 由此可见, 减少访问数据库的次数 , 就能实际上减少ORACLE的工作量。

        例如,以下有三种方法可以检索出雇员号等于0342或0291的职员。

        方法1 (最低效)

        SELECT EMP_NAME , SALARY , GRADE
        FROM EMP
        WHERE EMP_NO = 342;
         SELECT EMP_NAME , SALARY , GRADE
        FROM EMP
        WHERE EMP_NO = 291;
    方法2 (次低效)

           DECLARE
            CURSOR C1 (E_NO NUMBER) IS
            SELECT EMP_NAME,SALARY,GRADE
            FROM EMP
            WHERE EMP_NO = E_NO;
        BEGIN
            OPEN C1(342);
            FETCH C1 INTO …,..,.. ;
                    OPEN C1(291);
           FETCH C1 INTO …,..,.. ;
             CLOSE C1;
          END;
    方法3 (高效)

        SELECT A.EMP_NAME , A.SALARY , A.GRADE,
                B.EMP_NAME , B.SALARY , B.GRADE
        FROM EMP A,EMP B
        WHERE A.EMP_NO = 342
        AND   B.EMP_NO = 291;
     注意:

     在SQL*Plus , SQL*Forms和Pro*C中重新设置ARRAYSIZE参数, 可以增加每次数据库访问的检索数据量 ,建议值为200.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    58#
    发表于 2011-3-4 10:04:32 | 只看该作者
    3.2  如何杀掉吊死session
    (1)        找出吊死session
    Select sid,serial#,program,machine,lockwait from v$session;
    (2)        杀死session
    Svrmgrl>alter system kill session 'init1,init2';
    其中init1为sid,init2为serial#。
    3.3  如何修改字符集
    以sys用户执行如下命令
    Update props$ set value$='新字符集'
           Where ltrim(name)='NLS_CHARACTERSET';
    commit;
    注意:如果有数据,不要修改数据集。
    3.4  如何追加表空间
    以sys用户:
    Alter tablespace 表空间 add datafile 文件名(带路径)size Xm;
    3.5  如何加大表的maxextents值
    Alter table 表名 storage(maxextents 新值)
    3.6  如何查询无效对象
    (1)        以sys用户登录SQL Plus
    (2)        查询无效对象
    Select  substr(object_name,1,30) object_name,object_type
    from    user_objects
    where  status ='INVALID'
    (3)        恢复失效存储过程
    对于存储过程,如果存储过程或函数脚本中某个表或所调用的存储过程被drop或重新编译,则此存储过程可能变为invalid,正常情况下,再次调用此存储过程时,系统会自动编译使其变为valid,也可以手工编译:Alter procedure 名称 compile;
    3.7  怎样分析SQL语句是否用到索引
    Oracle提供的策略分析器Explain plan能很好地分析SQL语句使用索引情况,分析步骤如下
    (1)        检查当前用户下是否存在策略分析表plan_table
    (2)        检查表结构是否正确(建立数据库时只有sys用户下存在此表),若没有,需要在当前用户下建此表:
    CREATE TABLE PLAN_TABLE
    (
    STATEMENT_ID                VARCHAR2(30),
    TIMESTAMP                   DATE,
    REMARKS                     VARCHAR2(80),
    OPERATION                   VARCHAR2(30),
    OPTIONS                     VARCHAR2(30),
    OBJECT_NODE               VARCHAR2(128),
    OBJECT_OWNER      VARCHAR2(30),
    OBJECT_NAME        VARCHAR2(30),
    OBJECT_INSTANC     NUMBER(38),
    OBJECT_TYPE         VARCHAR2(30),
    OPTIMIZER                   VARCHAR2(255),
    SEARCH_COLUMNS   NUMBER(38),
    ID                    NUMBER(38),
    PARENT_ID           NUMBER(38),
    POSITION             NUMBER(38),
    COST                 NUMBER(38),
    CARDINALITY         NUMBER(38),
    BYTES                NUMBER(38),
    OTHER_TAG          VARCHAR2(255),
    OTHER               LONG
    );
    (3)        执行分析语句:
    sql>delete from plan_table;
    sql>explain plan for
    sql>select * from tab where tname like 'T%';       
    sql>select object_name,options,operation from plan_table;
    执行完上述三步,可查看“select * from tab where tname like 'T%'”语句where条件是否用到索引。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    57#
    发表于 2011-3-4 10:00:55 | 只看该作者
    1. 基本查询命令
    select         from   tablename
         where   
                      group by     
                      having     
                      order by
    where字句可使用运算符:=、<>、!=、>=、<=、in、between、like(%_)、is null   或is not null、not、or、and。
    order by:asc(升序)或desc(降序),缺省升序。
    group by:将查询结果分组,在包含group by 子句的查询中,select 子句的列表中的所有个体值(除聚组函数avg、count等外)必须是groub by子句中的表达式或常量。
    having:如果需要对各个组返回的结果进行筛选,查询满足一定条件的分组值,可以使用having。例如:
    select deptno,sum(sal)
    from emp
    group by deptno
    having sum(sal)>9000;
    2. 数据更新
    insert into  tablename(l1,l2)
    values(v1,v2);           可以带&
    insert into tablename(列表)
    select 语句;
    update  tablename
    set  列名1=,列名2=
    where
    delete from  tablename where
    3. 事物控制
    commit
    set autocommit on
    rollback
    savepoint   保存点
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    56#
    发表于 2011-2-28 13:12:19 | 只看该作者
    谢谢啦~
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    55#
    发表于 2011-2-1 10:27:56 | 只看该作者
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    54#
    发表于 2010-11-30 17:16:17 | 只看该作者
    谢谢
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    53#
    发表于 2010-10-20 10:21:26 | 只看该作者
    谢谢楼主,,,多谢分享
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-25 06:40 , Processed in 0.086052 second(s), 29 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表