zoukankan      html  css  js  c++  java
  • 数据库设计--数据的垂直拆分

        假设表字段太多,假设表中有些字段比較大,即便是你仅仅查有限的几个字段,在做表关联和全表扫的时候。由于扫描的数据块多,性能方面还是会不理想。

    由于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

  • 相关阅读:
    天热了,心静了,四月过去了
    Boost编译一步步来
    战争又起
    waiting for the day
    游戏状态管理之C++实现
    匈牙利命名法之VB篇
    VB 实用函数集
    匈牙利命名法之简介
    Dxperience 安装总是不成功
    Developer Express DevExpress DXperience
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/7105699.html
Copyright © 2011-2022 走看看