数据库表设计之number注意事项

时间:2021-11-17 15:00:48

在数据库设计表时,注意字段的类型的选择,先后顺序,这些都是影响性能的,如果设计不对,无论你使用parallel,nologing,compress ,order by index 都没有明显性能提升! 

小续:

number和number(1),number(23) 在user_tab_col中data_length 都是22,没有区别,为什么呢?

SQL> desc ml_test;
Name Type Nullable Default Comments
---- ---------- -------- ------- --------
A INTEGER Y
B NUMBER(1) Y
C NUMBER(23) Y

SQL> select TABLE_NAME,COLUMN_NAME,DATA_TYPE,DATA_LENGTH from user_tab_columns WHERE TABLE_name=upper('ml_test');

TABLE_NAME COLUMN_NAME DATA_TYPE DATA_LENGTH
------------ -------------- ------------------------ -----------
ML_TEST A NUMBER 22
ML_TEST B NUMBER 22
ML_TEST C NUMBER 22


解释如下:

1.DATA_LENGTH          NUMBER                   Length of the column in bytes/*列的数据类型的字节长度*/                                           
2.DATA_PRECISION NUMBER Length: decimal digits (NUMBER) or binary digits (FLOAT)/*数字类型的实际长度*/
3.DATA_SCALE NUMBER Digits to right of decimal point in a number/*小数点位数*/


 

看看存储的对比:

SQL> select dump(110) from dual
2 union all
3 select dump(1100) from dual
4 union all
5 select dump('') from dual union all
6 select dump(null) from dual
7 union all
8 select dump(' ') from dual
9 ;

DUMP(110)
---------------------
Typ=2 Len=3: 194,2,11
Typ=2 Len=2: 194,12
NULL
NULL
Typ=96 Len=1: 32

 

分析: 为什么1100>110 ,但存储时110有3个len,而1100只有2个len。

 

下面是百度wenku的详细解释,详细介绍dump

http://wenku.baidu.com/view/62e707a2b0717fd5360cdc19.html

 

 

总结:

1.设计表时,能用number(1), 就尽力不用number,能用number的,就尽力不用varchar2,char

2.空字段,尽力放后面,以免给中间造成补空存储的浪费,导致物理读增加。

3.有必须按照排序入库,或者建立有序的索引。





SQL> select dump(123456.789) from dual;


DUMP(123456.789)

-------------------------------


Typ=2 Len=6: 195,13,35,57,79,91



指数: 195 - 193 = 2

数字1 13 - 1 = 12 *100^(2-0) 120000

数字2 35 - 1 = 34 *100^(2-1) 3400

数字3 57 - 1 = 56 *100^(2-2) 56

数字4 79 - 1 = 78 *100^(2-3) .78

数字5 91 - 1 = 90 *100^(2-4) .009

123456.789