"非规范"数据类型带来的问题
2013-08-13 00:00
323 查看
在很多系统中用数字类型表示日期类型的字段设计。这样设计会带来一定的问题,现具体说明一下。
1.存储空间
在传统设计中,经常有类似的设计,很多设计的初衷是为了节省存储空间。下面举例观察一下,不同字段类型的存储空间消耗。oracle培训
示例
SQL> create table t1 ( c1 int,c2 number,c3 date);
SQL> insert into t1 values(20110101,20110101,to_date('20110101','yyyymmdd'));
SQL> commit;
SQL> select dump(c1),dump(c2),dump(c3) from t1;
DUMP(C1)
--------------------------------------------------------------------------------
DUMP(C2)
--------------------------------------------------------------------------------
DUMP(C3)
--------------------------------------------------------------------------------
Typ=2 Len=5: 196,21,12,2,2 //占用5个字节
Typ=2 Len=5: 196,21,12,2,2 //占用5个字节
Typ=12 Len=7: 120,111,1,1,1,1,1 //占用7个字节
结论
采用这种设计,会在一定程度上节省空间,但是整体收益并不是很明显。
2.数据质量
示例
SQL> insert into t1(c1) values(20119999); …ok
SQL> insert into t1(c3) values(20119999); …err
结论
采用这种写法,会”屏蔽”字段的日期属性。在开发的过程中容易导致因为异常日期数据(合法数字),造成数据质量下降。
3.字段加减
示例
SQL> select * from t1;
C1 C2 C3
---------- --------- ---------
20110101 20110101 01-JAN-11
20110202 20110202 02-FEB-11
SQL> select c1+50,c3+50 from t1;
C1+50 C3+50
---------- ---------
20110151 20-FEB-11
20110252 24-MAR-11
*显然对于从数字表示的日期,简单的加法就造成了”歧义”。
结论
针对日期类型的加、减法,日期之间的减法等,有其特殊的含义,用数字代表,往往会带来错误的结果。
4.计算选择率
示例
SQL> create table t1(d1 date,n1 number);
SQL> select * from t1 where rownum<5;
D1 N1
------------------- ------------
2001-06-02 00:00:00 20010602
2001-06-03 00:00:00 20010603
2001-06-04 00:00:00 20010604
2001-06-05 00:00:00 20010605
*两列列分别为日期、数字类型,但保存的都是"日期"含义的数据。
*在日期类型对,对选择基数的计算明显出现异常。有正常的8”天”偏差到了396”天”。其直接后果导致优化器可能选择了错误的执行计划。
结论
使用错误的数据类型保存(例如:用数字保存日期类型数据),这往往会造成优化器对范围的判断错误。虽然可以采用直方图或FBI的方式解决,但是这会花费额外的代价且有一定局限性。
1.存储空间
在传统设计中,经常有类似的设计,很多设计的初衷是为了节省存储空间。下面举例观察一下,不同字段类型的存储空间消耗。oracle培训
示例
SQL> create table t1 ( c1 int,c2 number,c3 date);
SQL> insert into t1 values(20110101,20110101,to_date('20110101','yyyymmdd'));
SQL> commit;
SQL> select dump(c1),dump(c2),dump(c3) from t1;
DUMP(C1)
--------------------------------------------------------------------------------
DUMP(C2)
--------------------------------------------------------------------------------
DUMP(C3)
--------------------------------------------------------------------------------
Typ=2 Len=5: 196,21,12,2,2 //占用5个字节
Typ=2 Len=5: 196,21,12,2,2 //占用5个字节
Typ=12 Len=7: 120,111,1,1,1,1,1 //占用7个字节
结论
采用这种设计,会在一定程度上节省空间,但是整体收益并不是很明显。
2.数据质量
示例
SQL> insert into t1(c1) values(20119999); …ok
SQL> insert into t1(c3) values(20119999); …err
结论
采用这种写法,会”屏蔽”字段的日期属性。在开发的过程中容易导致因为异常日期数据(合法数字),造成数据质量下降。
3.字段加减
示例
SQL> select * from t1;
C1 C2 C3
---------- --------- ---------
20110101 20110101 01-JAN-11
20110202 20110202 02-FEB-11
SQL> select c1+50,c3+50 from t1;
C1+50 C3+50
---------- ---------
20110151 20-FEB-11
20110252 24-MAR-11
*显然对于从数字表示的日期,简单的加法就造成了”歧义”。
结论
针对日期类型的加、减法,日期之间的减法等,有其特殊的含义,用数字代表,往往会带来错误的结果。
4.计算选择率
示例
SQL> create table t1(d1 date,n1 number);
SQL> select * from t1 where rownum<5;
D1 N1
------------------- ------------
2001-06-02 00:00:00 20010602
2001-06-03 00:00:00 20010603
2001-06-04 00:00:00 20010604
2001-06-05 00:00:00 20010605
*两列列分别为日期、数字类型,但保存的都是"日期"含义的数据。
*在日期类型对,对选择基数的计算明显出现异常。有正常的8”天”偏差到了396”天”。其直接后果导致优化器可能选择了错误的执行计划。
结论
使用错误的数据类型保存(例如:用数字保存日期类型数据),这往往会造成优化器对范围的判断错误。虽然可以采用直方图或FBI的方式解决,但是这会花费额外的代价且有一定局限性。
相关文章推荐
- "非规范"数据类型带来的问题
- "确保已安装文件类型.cs的应用程序" 问题
- C语言中值得深入知识点----数组做函数参数、数组名a与&a区别、数组名a的"数据类型"
- ria +prism 难解问题之 "返回类型必须是实体或复杂类型、复杂类型的集合或预定义的可序列化类型之一"
- 关于css未被载入问题--->因为它的 MIME 类型 "text/html" 不是 "text/css"。
- 遇到“拒绝了对对象的 EXECUTE 权限”和“无法作为数据库主体执行,因为主体 "dbo" 不存在、无法模拟这种类型的主体,或您没有所需的权限”的问题
- VS2010中C#代码用"转到定义"或F12转到定义时,总是显示从元数据的问题
- C++的基础知识(十一)--数组做函数参数、数组名a与&a区别、数组名a的"数据类型"
- 在java中已经规定数据类型是长整形为什么数字后面还要加一个"l"啊?前面不是有long吗?
- 关于"作数类型冲突: nvarchar 与 image 不兼容"的问题(DBNull)
- Linq中字段数据类型转换问题(Linq to entity,LINQ to Entities 不识别方法"System.String ToString()"问题解决)
- SQLServer 2005 MSG 2570 类型为"In-row data" 中。列的值超出了数据类型的范围
- 关于oracle数据库中直接修改表中数据点击小锁出现"these query results are not updateable"的问题
- "?:"运算符类型转换问题
- 解决Sony Z2上卸载 "授权管理" 带来的发热问题
- 加密解密时遇到的"不正确的数据"以及"要解密的数据长度无效"问题解决方案
- 用类型模板判断"数据"类型
- 解决content-type为"application/json"的post过来的数据在php端接受不到的问题
- 提交表单,有两个页面,一个是系统日志,一个是运行日志,其中日志类型不能用同一个"name",否则其中一个会出现404页面,可能是缓存问题吧(API?)
- 平台导出"导出全部数据到Excel中(显示列)"的问题