木匠的微型博客 Charlie Twitter

    follow me on Twitter

    Tuesday, February 05, 2008

    在维多利亚Oracle用户组学到的东西

    上周四下午, 第一次参加了Victoria Oracle Users Group
    组织的技术交流活动. 题目是 Database Gems: 9i, 10g, and 11g.

    VicOUG 请来了著名Oracle 技术网站的http://www.psoug.org/的作者: Dan Morgan,
    --
    最常用的是
    Morgan's Library http://www.psoug.org/library.html, 可以找到各种语法和函数用例.
    这个伙计自称因为人员好, 被评为Oracle Ace Director.

    言归正传, 以下是我学到的3点,

    1)
    ALTER SYSTEM SET PLSQL_WARNINGS='ENABLE:ALL';
    建议在所有的开发(Development)及测试(Test)环境设置.

    有啥好处呢? 编译PL/SQL的时候,给出有用的警告信息.
    a) 严重问题, 比如参数混淆 (这点我还没有理解, 需要一个示例)
    b) 性能问题, 一个INSERT语句,传递一个VARCHAR2值给一个NUMBER列
    c) 提示信息, 比如有一段代码 永远不会被执行

    详细说明, 请参考:
    Oracle® Database PL/SQL Language Reference
    11g Release 1 (11.1)
    - 第十一章: 11 Handling PL/SQL Errors
    -- Overview of PL/SQL Compile-Time Warnings

    2)
    wmsys.wm_concate

    你可以Sum() 数字列, 也可以 Sum() Varchar2 字符串列,
    我们叫作String Aggregate, 以后会有一长篇文章介绍.

    这里有一个示例, 自己在 SQL*Plus 或者SQL Developer里面跑一下吧,
    select DEFAULT_TABLESPACE,
    translate(wmsys.wm_concat(username),',','|')
    from dba_users
    group by DEFAULT_TABLESPACE;

    3)
    FBI index, virtual column index and SHRINK clause

    有个听众提个问题, 说在10.2以下版本, 有Function Based Index的表不能做空间回收-Shrink.
    Dan Morgan这位老大自己没测试过, 随口就说11g上,在一个表的虚拟列上的构建索引,这张表可以Shrink, 岂不是犯了和 老旦一样的错误.
    (老旦:Dan. 你们都知道是谁, 曾被老刘 Lewis 严肃的教育过, 以后有另外一篇文章评论,关于PGA 和 Parallel execution)

    第二天到办公室一测试, 发现11.1也不行.

    以下是测试用例:

    --drop table scott.y1;
    create table scott.y1(sal number, comm number);

    drop index scott.yi_fbi1;
    create index scott.yi_fbi1 on scott.y1(sal + comm)
    --tablespace data_auto
    ;

    alter table scott.y1 enable row movement;

    alter TABLE scott.y1 shrink space compact;
    alter TABLE scott.y1 shrink space;

    ERROR at line 1:
    ORA-10631: SHRINK clause should not be specified for this object

    drop index scott.yi_fbi1;

    alter table scott.y1 add (income AS (sal + comm));

    drop index scott.yi_vi1;
    create index scott.yi_vi1 on scott.y1(income);

    alter TABLE scott.y1 shrink space;

    ERROR at line 1:
    ORA-10631: SHRINK clause should not be specified for this object

    No comments: