• 数据库设计--垂直拆分数据


        假设表字段太多,假设表中有些字段比較大,即便是你仅仅查有限的几个字段。在做表关联和全表扫的时候,由于扫描的数据块多,性能方面还是会不理想。由于oracle扫描的时候是依照块为单位扫描,读取的时候也是按块为单位读取。所以这样的功能无法在SQL层面上优化的时候。能够考虑做数据的垂直切分。以下来做个试验:

    --制造数据不做垂直切分
    create table test(
      a number,
      b varchar2(4000),
      c varchar2(4000),
      d varchar2(4000),
      e varchar2(4000),
      f varchar2(4000),
      g varchar2(4000),
      h varchar2(4000)
    );
    INSERT INTO test
      SELECT ROWNUM,
             rpad('*', 4000, 1),
             rpad('*', 4000, 1),
             rpad('*', 4000, 1),
             rpad('*', 4000, 1),
             rpad('*', 4000, 1),
             rpad('*', 4000, 1),
             rpad('*', 4000, 1)
        FROM DUAL
      CONNECT BY ROWNUM <= 100000;
    commit;
    create table test1 as select * from  test;

    --制造数据做垂直切分
    create table test_cuizhi(
      a number
    );
    INSERT INTO test_cuizhi
      SELECT ROWNUM
        FROM DUAL
      CONNECT BY ROWNUM <= 100000;
    commit;
    create table test_cuizhi1 as select * from  test_cuizhi;

    --開始測试,仅仅是取两个最小的字段
    SQL> set timing on
    SQL> set autotrace traceonly
    SQL> select t.a,t1.a from test t, test1  t1 where t.a=t1.a;
    已选择100000行。
    已用时间:  00: 00: 53.17
    运行计划
    ----------------------------------------------------------
    Plan hash value: 2400077556
    ----------------------------------------------------------------------------
    | Id  | Operation          | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
    ----------------------------------------------------------------------------
    |   0 | SELECT STATEMENT   |       | 44504 |  1129K|   173K  (1)| 00:34:38 |
    |*  1 |  HASH JOIN         |       | 44504 |  1129K|   173K  (1)| 00:34:38 |
    |   2 |   TABLE ACCESS FULL| TEST  | 44504 |   564K| 87801   (1)| 00:17:34 |
    |   3 |   TABLE ACCESS FULL| TEST1 |   117K|  1490K| 85344   (1)| 00:17:05 |
    ----------------------------------------------------------------------------
    Predicate Information (identified by operation id):
    ---------------------------------------------------
       1 - access("T"."A"="T1"."A")
    Note
    -----
       - dynamic sampling used for this statement
    统计信息
    ----------------------------------------------------------
             52  recursive calls
              0  db block gets
         795627  consistent gets
         534917  physical reads
              0  redo size
        1664840  bytes sent via SQL*Net to client
          73664  bytes received via SQL*Net from client
           6668  SQL*Net roundtrips to/from client
              2  sorts (memory)
              0  sorts (disk)
         100000  rows processed
    SQL> /
    已选择100000行。
    已用时间:  00: 00: 33.36
    运行计划
    ----------------------------------------------------------
    Plan hash value: 2400077556
    ----------------------------------------------------------------------------
    | Id  | Operation          | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
    ----------------------------------------------------------------------------
    |   0 | SELECT STATEMENT   |       | 44504 |  1129K|   173K  (1)| 00:34:38 |
    |*  1 |  HASH JOIN         |       | 44504 |  1129K|   173K  (1)| 00:34:38 |
    |   2 |   TABLE ACCESS FULL| TEST  | 44504 |   564K| 87801   (1)| 00:17:34 |
    |   3 |   TABLE ACCESS FULL| TEST1 |   117K|  1490K| 85344   (1)| 00:17:05 |
    ----------------------------------------------------------------------------
    Predicate Information (identified by operation id):
    ---------------------------------------------------
       1 - access("T"."A"="T1"."A")
    Note
    -----
       - dynamic sampling used for this statement
    统计信息
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
         795446  consistent gets
         552087  physical reads
              0  redo size
        1664840  bytes sent via SQL*Net to client
          73664  bytes received via SQL*Net from client
           6668  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
         100000  rows processed


    SQL> select t.a,t1.a from test_cuizhi t, test_cuizhi1  t1 where t.a=t1.a;
    已选择100000行。
    已用时间:  00: 00: 06.17
    运行计划
    ----------------------------------------------------------
    Plan hash value: 2501302817
    -------------------------------------------------------------------------------------------
    | Id  | Operation          | Name         | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
    -------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT   |              | 88629 |  2250K|       |   310   (2)| 00:00:04 |
    |*  1 |  HASH JOIN         |              | 88629 |  2250K|  2168K|   310   (2)| 00:00:04 |
    |   2 |   TABLE ACCESS FULL| TEST_CUIZHI  | 88629 |  1125K|       |    42   (3)| 00:00:01 |
    |   3 |   TABLE ACCESS FULL| TEST_CUIZHI1 |   101K|  1288K|       |    39   (3)| 00:00:01 |
    -------------------------------------------------------------------------------------------
    Predicate Information (identified by operation id):
    ---------------------------------------------------
       1 - access("T"."A"="T1"."A")
    Note
    -----
       - dynamic sampling used for this statement


    统计信息
    ----------------------------------------------------------
             52  recursive calls
              0  db block gets
           7139  consistent gets
            153  physical reads
              0  redo size
        1664840  bytes sent via SQL*Net to client
          73664  bytes received via SQL*Net from client
           6668  SQL*Net roundtrips to/from client
              2  sorts (memory)
              0  sorts (disk)
         100000  rows processed


    SQL> /
    已选择100000行。


    已用时间:  00: 00: 06.06
    运行计划
    ----------------------------------------------------------
    Plan hash value: 2501302817
    -------------------------------------------------------------------------------------------
    | Id  | Operation          | Name         | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
    -------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT   |              | 88629 |  2250K|       |   310   (2)| 00:00:04 |
    |*  1 |  HASH JOIN         |              | 88629 |  2250K|  2168K|   310   (2)| 00:00:04 |
    |   2 |   TABLE ACCESS FULL| TEST_CUIZHI  | 88629 |  1125K|       |    42   (3)| 00:00:01 |
    |   3 |   TABLE ACCESS FULL| TEST_CUIZHI1 |   101K|  1288K|       |    39   (3)| 00:00:01 |
    -------------------------------------------------------------------------------------------
    Predicate Information (identified by operation id):
    ---------------------------------------------------
       1 - access("T"."A"="T1"."A")
    Note
    -----
       - dynamic sampling used for this statement
    统计信息
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
           7008  consistent gets
              0  physical reads
              0  redo size
        1664840  bytes sent via SQL*Net to client
          73664  bytes received via SQL*Net from client
           6668  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
         100000  rows processed

    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    伪静态规则写法RewriteRule-htaccess详细语法使用
    事务的操作
    layer 模版使用
    追加下拉框的自动生成
    PHP自动生成前端的表单框架
    MySQL高效获取记录总数
    引用JS表单验证大全 以后方便查看用
    关于left join连接查询 两张表里有同名字段的问题
    详解clientHeight、offsetHeight、scrollHeight
    php防止SQL注入详解及防范
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4676191.html
Copyright © 2020-2023  润新知