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