隨筆 - 39  文章 - 1  trackbacks - 0
          <2013年8月>
          28293031123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿

          隨筆檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

            在很多系統中用數字類型表示日期類型的字段設計。這樣設計會帶來一定的問題,現具體說明一下。

            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

            *兩列列分別為日期、數字類型,但保存的都是"日期"含義的數據。

          1.JPG

            *在日期類型對,對選擇基數的計算明顯出現異常。有正常的8”天”偏差到了396”天”。其直接后果導致優化器可能選擇了錯誤的執行計劃。

            結論

            使用錯誤的數據類型保存(例如:用數字保存日期類型數據),這往往會造成優化器對范圍的判斷錯誤。雖然可以采用直方圖或FBI的方式解決,但是這會花費額外的代價且有一定局限性。

          posted on 2013-08-13 14:49 親愛的小孩 閱讀(110) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 江达县| 普宁市| 东宁县| 横峰县| 淮北市| 凉城县| 乌鲁木齐县| 栾城县| 昌都县| 叶城县| 阿鲁科尔沁旗| 且末县| 九台市| 亳州市| 修武县| 搜索| 土默特左旗| 荣成市| 宝清县| 连云港市| 孙吴县| 青阳县| 吉木萨尔县| 城步| 连州市| 冀州市| 大英县| 舟山市| 墨玉县| 铁岭县| 曲松县| 锦州市| 全州县| 本溪| 穆棱市| 福州市| 林州市| 桐梓县| 曲水县| 久治县| 曲麻莱县|