• 首页
  • 小学语文
  • 中学语文
  • 中学英语
  • 免费论文
  • 教学随笔
  • 学生作文
  • 综合考试
  • 试题教案
  • 育儿话题
  • 教学资源
  • 编程技术
  • 博客
  • Oracle专家高级编程学习笔记[1]

    日期:2005-07-04  地址:  作者:

      Expert one-on-one oracle是Oracle专家Thomas Kyte的大作,洋洋大观,总共有1329页,啃起来颇费力气.故作此笔记,记录精华所在.

      一.准备工作

      1.建立基本调试环境

      Create demo schema(建立演示模式)

      sqlplus>start $ORACLE_HOME/sqlplus/demo/demobld.sql
     
      2.建立login.sql

      ---------------------------------
      define_editor=vi
      set serveroutput on size 1000000
      set trimspool on
      set long 500
      set linesize 100
      set pagesize 9999

      column plan_plus_exp format a80
      column global_name new_value gname

      select lower(user)||'@'||decode(global_name,'WEBDB.FANYAMIN.NET','webdb',global_name) global_name from global_name;

      set sqlprompt '&gname>'
      set termout on
      -------------------------------------------------

      3.在sqlplus中配置AutoTrace

      1)cd $ORACLE_HOME/rdbms/admin

      log into sqlplus as system(connect system/manager@webdb)
      run @utlxplan
      run create public synonym plan_table for plan_table;
      run grant all on plan_table to public;

      2)

      cd $ORACLE_HOME/sqlplus/admin
      log into sqlplus as sys(connect sys/change_on_install@webdb)
      run @plustrce
      run grant plustrace to public;

      二.内容

      1.开发成功的Oracle应用程序

      一条简单秘诀

      if(possible) 就用单条SQL语句完成
      else if(possible) 用plsql程序
      else if(possible) 用java存储过程
      else if(possible) 用C外部过程
      else 考虑是否真有必要这样做

      两个指导方针

      1)不要在MTS下运行长事务<45s
      2)使用绑定变量

      alter>system@webdb>alter system  flush shared_pool;
      set>system@webdb>set timing on
    执行这两个sql文件,一比较,发现使用绑定变量后,速度快多了

      --bindtest1.sql, did not use bind variable
      -----------------------------------------------------------------------------
      declare
       type rc is ref cursor;
       l_rc rc;
       l_dummy all_objects.object_name%type;
       l_start number default dbms_utility.get_time;
      begin
       for i in 1..1000
       loop
        open l_rc for
        'select object_name from all_objects where object_id='||i;
        fetch l_rc into l_dummy;
        close l_rc;
       end loop;
       dbms_output.put_line(round((dbms_utility.get_time-l_start)/100,2)||'seconds...');
      end;
      /
      --bindtest2.sql,  use bind variable
      -----------------------------------------------------------
      declare
       type rc is ref cursor;
       l_rc rc;
       l_dummy all_objects.object_name%type;
       l_start number default dbms_utility.get_time;
      begin
       for i in 1..1000
       loop
        open l_rc for
        'select object_name from all_objects where object_id=:x'
        using i;
        fetch l_rc into l_dummy;
        close l_rc;
       end loop;
       dbms_output.put_line(round((dbms_utility.get_time-l_start)/100,2)||'seconds...');
      end;
      /
      Oracle封锁策略

      1)只有当修改时,oracle在行级上锁定数据,不要把锁定上升到块级或表级
      2)Oracle决不会为读取而锁定数据,简单读取不能在数据行上设置锁定
      3)数据的写入器不会阻塞数据读取器.
      4)只有当另一个数据写入器已经锁定了某行数据后,才阻塞其他人对该行数据的写入.数据读取器决不会阻塞数据的写入器

      Oracle的这种不阻塞方法用一个副作用,如果想要一次只有一个用户访问某行数据,在多用户环境中,必须经常使用在多线程程序设计用到的相似技巧,

      select * from resources where resource-name=:room_name FOR UPDATE

      Oracle的并行控制机制(多版本一致读)
      一致性查询:在某一时刻查询产生一致结果
      非阻塞查询:数据写入器从来不阻塞查询

    对 Oracle专家高级编程学习笔记[1] 文章的评论    [查看网友评论]

    验证码:
    匿名发表: