資料庫設計--資料的垂直分割

來源:互聯網
上載者:User

    如果表欄位太多,如果表中有些欄位比較大,即便是你只查有限的幾個欄位,在做表關聯和全表掃的時候,由於掃描的資料區塊多,效能方面還是會不理想。因為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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.