设计可扩展的 Oracle 应用
我是谁 ? <ul><li>Jametong@ 童家旺 </li></ul><ul><li>work @alipay (2010.8-) </li></ul><ul><li>Blog @http://www.dbthink.com/ </li>...
议程 <ul><li>可扩展性 ? </li></ul><ul><li>纵向扩展  Vs  横向扩展 </li></ul><ul><li>使用连接池 </li></ul><ul><li>使用绑定变量 </li></ul><ul><li>使用批量...
可扩展性 ?
可扩展性 ?
可扩展性 ?
可扩展性 ? <ul><li>当我们增加一个系统中的资源,并能获取与增加的资源保持适当的比例关系的性能提升,我们就认为这个服务具备了伸缩性。 </li></ul><ul><li>提供更多单位的服务 </li></ul><ul><li>处理更大单...
Amdahl's law <ul><li>使用多处理器进行 并行处理能够提升的性能的比例受限于程序中需要串行处理的比例 . </li></ul><ul><li>Maximum speedup <= p / ( 1 + f * (p – 1 ))...
USL Scalability <ul><li>使用多处理器进行 并行处理能够提升的性能的比例不仅受限于程序中需要串行处理的比例 ,  还受限于进程之间的并发系数 . </li></ul><ul><li>Maximum speedup <= <...
可扩展性 ? <ul><li>实现好的可扩展性,还可能吗? </li></ul>http://www.dbthink.com/?p=352
可扩展性 ? <ul><li>实现好的伸缩性,还可能吗? </li></ul><ul><li>完全可能 </li></ul><ul><li>但是只有当我们 在进行系统架构设计 时 充分考虑伸缩性 时才可能实现 </li></ul>http://...
提高扩展能力的方式 <ul><li>拆分  —提高可并行处理的比例 </li></ul><ul><li>异步  ---  降低系统之间的耦合度与争用 </li></ul><ul><li>优化响应时间 </li></ul><ul><ul><li>...
横向扩展  Vs  纵向扩展 <ul><li>横向扩展  Vs  纵向扩展 </li></ul><ul><li>水平拆分  ?  垂直拆分 ?  </li></ul><ul><li>纵向扩展的限制 ? </li></ul><ul><ul><li...
使用连接池 <ul><li>大家使用什么开发语言 ? </li></ul><ul><ul><li>Java ? PHP ? .NET ?  </li></ul></ul><ul><li>JBOSS connection  Pool ? DBCP...
使用连接池—性能比较
使用绑定变量 <ul><li>硬解析 –  Hard Parse  </li></ul><ul><li>软解析 –  Soft Parse (Bind variable) </li></ul><ul><li>软软解析 –  Softer Sof...
不同解析方式下的性能
使用批量接口 <ul><li>使用批量提取接口 </li></ul><ul><ul><li>PStmt. setFetchSize(50)  --- Java </li></ul></ul><ul><ul><li>oci_set_prefetc...
使用批量接口的性能
你了解哪些缓存 ? <ul><li>缓存技术 ? </li></ul><ul><li>缓存方式 ? </li></ul><ul><li>缓存的内容 ?  </li></ul>
使用各种缓存 <ul><li>缓存的使用场景 </li></ul><ul><ul><li>应用的读写比 </li></ul></ul><ul><li>使用缓存需要考虑的因素 </li></ul><ul><ul><li>缓存的一致性维护问题 </...
范式化  vs  反范式化 <ul><li>为什么要进行范式化 ?  </li></ul><ul><li>为什么要进行反范式化 ? </li></ul><ul><li>如何控制业务之间的耦合度 ? </li></ul><ul><li>改进行何种...
A ny  Q uestions
Upcoming SlideShare
Loading in …5
×

设计可扩展的Oracle应用

5,836 views

Published on

0 Comments
6 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
5,836
On SlideShare
0
From Embeds
0
Number of Embeds
3,130
Actions
Shares
0
Downloads
83
Comments
0
Likes
6
Embeds 0
No embeds

No notes for slide
  • &lt;? $time_start = microtime(true); $n = 50; for ( $i = 1 ; $i &lt;= $n ; $i ++ ) { //$conn[$i] = oci_new_connect (&amp;quot;james&amp;quot;,&amp;quot;james&amp;quot;,&amp;quot;dbmain&amp;quot;); //Decicated Connection //$conn[$i] = oci_new_connect (&amp;quot;james&amp;quot;,&amp;quot;james&amp;quot;,&amp;quot;dbmains&amp;quot;); //Shared Connection $conn[$i] = oci_new_connect (&amp;quot;james&amp;quot;,&amp;quot;james&amp;quot;,&amp;quot;dbmainp&amp;quot;); //Pooled Connection } $time_end = microtime(true); $time = $time_end - $time_start; echo &amp;quot;Create $n Connections Time Elapsed : $time seconds\\n&amp;quot;; for ( $i = 1; $i &lt;= $n ; $i ++) { oci_close($conn[$i]); } ?&gt;
  • [oracle@localhost ~]$ cat basicbind.sql alter session set session_cached_cursors = 0; set feedback off heading off timing on declare v_cust_id varchar2(30); begin for i in 1..200000 loop execute immediate &apos;select user_name from james_t where id = :id &apos; into v_cust_id using i; end loop; end; / exit; [oracle@localhost ~]$ cat nobind.sql alter session set session_cached_cursors = 0; set feedback off heading off timing on declare v_cust_id varchar2(30); begin for i in 1..200000 loop execute immediate &apos;select user_name from james_t where id = &apos; || i || &apos;&apos; into v_cust_id; end loop; end; / exit; [oracle@localhost ~]$ cat enhancedbind.sql set feedback off heading off timing on declare v_cust_id varchar2(30); begin for i in 1..200000 loop execute immediate &apos;select user_name from james_t where id = :id &apos; into v_cust_id using i; end loop; end; / exit; [oracle@localhost ~]$ cat noparse.sql set heading off feedback off timing on declare card_cur integer; v_cust_id varchar2(30); ignore integer; begin card_cur := dbms_sql.open_cursor; dbms_sql.parse(card_cur, &apos;select user_name from james_t where id = :id &apos;,dbms_sql.native); for i in 1..200000 loop dbms_sql.define_column_char(card_cur, 1, v_cust_id,30); dbms_sql.bind_variable(card_cur, &apos;:id&apos;, i); ignore := dbms_sql.execute(card_cur); end loop; dbms_sql.close_cursor(card_cur); end; / exit; [oracle@localhost ~]$ [oracle@localhost ~]$ cat stress.sh echo &amp;quot;stree $1 concurrency&amp;quot; for num in `seq 1 $1`; do sqlplus -S james/james @$2 &amp; done wait 847 for SEQ in `seq 1 6`; do stress.sh $SEQ noparse.sql; done 848 for SEQ in `seq 1 6`; do stress.sh $SEQ enhancedbind.sql; done 849 for SEQ in `seq 1 6`; do stress.sh $SEQ basicbind.sql; done 850 for SEQ in `seq 1 6`; do stress.sh $SEQ nobind.sql; done
  • 设计可扩展的Oracle应用

    1. 1. 设计可扩展的 Oracle 应用
    2. 2. 我是谁 ? <ul><li>Jametong@ 童家旺 </li></ul><ul><li>work @alipay (2010.8-) </li></ul><ul><li>Blog @http://www.dbthink.com/ </li></ul><ul><li>mail@ jametong@gmail.com </li></ul><ul><li>Weibo @ Jametong </li></ul>
    3. 3. 议程 <ul><li>可扩展性 ? </li></ul><ul><li>纵向扩展 Vs 横向扩展 </li></ul><ul><li>使用连接池 </li></ul><ul><li>使用绑定变量 </li></ul><ul><li>使用批量接口 </li></ul><ul><li>使用各种缓存 </li></ul><ul><li>范式化 Vs 反范式化 </li></ul>
    4. 4. 可扩展性 ?
    5. 5. 可扩展性 ?
    6. 6. 可扩展性 ?
    7. 7. 可扩展性 ? <ul><li>当我们增加一个系统中的资源,并能获取与增加的资源保持适当的比例关系的性能提升,我们就认为这个服务具备了伸缩性。 </li></ul><ul><li>提供更多单位的服务 </li></ul><ul><li>处理更大单元的工作量 </li></ul>http://www.dbthink.com/?p=352
    8. 8. Amdahl's law <ul><li>使用多处理器进行 并行处理能够提升的性能的比例受限于程序中需要串行处理的比例 . </li></ul><ul><li>Maximum speedup <= p / ( 1 + f * (p – 1 )) </li></ul><ul><li>P 为并行的数量 , F 没有提升的部分所占比例 . </li></ul><ul><li>Percentage improvement = </li></ul><ul><li>( 1 – 1 / ( speedup factor ) ) * 100% </li></ul><ul><li>Speedup factor 为上面等式的结果 . </li></ul>http://en.wikipedia.org/wiki/Amdahl%27s_law
    9. 9. USL Scalability <ul><li>使用多处理器进行 并行处理能够提升的性能的比例不仅受限于程序中需要串行处理的比例 , 还受限于进程之间的并发系数 . </li></ul><ul><li>Maximum speedup <= </li></ul><ul><li>p / ( 1 + f * ( p – 1 ) + k * p * ( p – 1 ) ) </li></ul><ul><li>p 为并行的数量 , </li></ul><ul><li>f 没有提升的部分所占比例 . </li></ul><ul><li>k 为多个进程相互之间的交互影响 </li></ul><ul><ul><li>Oracle 中的 Enqueue 或者 Latch 争用 . </li></ul></ul>Guerrilla Capacity Planning Chapter 4 By Neil Gunther
    10. 10. 可扩展性 ? <ul><li>实现好的可扩展性,还可能吗? </li></ul>http://www.dbthink.com/?p=352
    11. 11. 可扩展性 ? <ul><li>实现好的伸缩性,还可能吗? </li></ul><ul><li>完全可能 </li></ul><ul><li>但是只有当我们 在进行系统架构设计 时 充分考虑伸缩性 时才可能实现 </li></ul>http://www.dbthink.com/?p=352
    12. 12. 提高扩展能力的方式 <ul><li>拆分 —提高可并行处理的比例 </li></ul><ul><li>异步 --- 降低系统之间的耦合度与争用 </li></ul><ul><li>优化响应时间 </li></ul><ul><ul><li>降低单次处理的耗费的时间 / 资源 </li></ul></ul><ul><ul><li>减少串行执行部分的比例 </li></ul></ul><ul><li>减少请求次数 </li></ul><ul><ul><li>批次处理 --- 降低需要进行处理的交互次数 </li></ul></ul><ul><ul><li>使用缓存 --- 降低对后端的请求次数 </li></ul></ul>
    13. 13. 横向扩展 Vs 纵向扩展 <ul><li>横向扩展 Vs 纵向扩展 </li></ul><ul><li>水平拆分 ? 垂直拆分 ? </li></ul><ul><li>纵向扩展的限制 ? </li></ul><ul><ul><li>单机处理能力 ? </li></ul></ul><ul><ul><li>设备 / 软件的维护费用 ? </li></ul></ul><ul><ul><li>Oracle ExaData? </li></ul></ul><ul><li>横向扩展的限制 ? </li></ul><ul><ul><li>业务之间的耦合性 ? </li></ul></ul><ul><ul><li>系统架构的复杂性 ? </li></ul></ul>
    14. 14. 使用连接池 <ul><li>大家使用什么开发语言 ? </li></ul><ul><ul><li>Java ? PHP ? .NET ? </li></ul></ul><ul><li>JBOSS connection Pool ? DBCP ? C3P0? </li></ul><ul><li>如果开发语言 不支持 Connection Pool </li></ul><ul><ul><li>Oracle Database Resident Connection Pooling </li></ul></ul><ul><ul><li>Dedicated Server Vs Shared Server </li></ul></ul>
    15. 15. 使用连接池—性能比较
    16. 16. 使用绑定变量 <ul><li>硬解析 – Hard Parse </li></ul><ul><li>软解析 – Soft Parse (Bind variable) </li></ul><ul><li>软软解析 – Softer Soft Parse </li></ul><ul><ul><li>Session Cached Cursors </li></ul></ul><ul><li>不解析 </li></ul><ul><ul><li>Parse Once Execute Many </li></ul></ul>
    17. 17. 不同解析方式下的性能
    18. 18. 使用批量接口 <ul><li>使用批量提取接口 </li></ul><ul><ul><li>PStmt. setFetchSize(50) --- Java </li></ul></ul><ul><ul><li>oci_set_prefetch($stid, 300); ---PHP </li></ul></ul><ul><li>使用批量插入接口 </li></ul><ul><ul><li>Pstmt.AddBatch() ---Java </li></ul></ul><ul><ul><li>oci_bind_array_by_name($stmt, &quot;:c1&quot;, $array, 5, -1, SQLT_CHR); ---PHP </li></ul></ul>
    19. 19. 使用批量接口的性能
    20. 20. 你了解哪些缓存 ? <ul><li>缓存技术 ? </li></ul><ul><li>缓存方式 ? </li></ul><ul><li>缓存的内容 ? </li></ul>
    21. 21. 使用各种缓存 <ul><li>缓存的使用场景 </li></ul><ul><ul><li>应用的读写比 </li></ul></ul><ul><li>使用缓存需要考虑的因素 </li></ul><ul><ul><li>缓存的一致性维护问题 </li></ul></ul><ul><ul><li>数据的具体读写比 </li></ul></ul><ul><ul><li>变更频率 </li></ul></ul><ul><ul><li>业务对一致性的要求 </li></ul></ul><ul><ul><li>使用何种缓存方式 . </li></ul></ul>
    22. 22. 范式化 vs 反范式化 <ul><li>为什么要进行范式化 ? </li></ul><ul><li>为什么要进行反范式化 ? </li></ul><ul><li>如何控制业务之间的耦合度 ? </li></ul><ul><li>改进行何种程度的反范式化 ? </li></ul><ul><li>反范式化带来的困难 ? </li></ul>
    23. 23. A ny Q uestions

    ×