數(shù)據(jù)庫設(shè)計(jì)和數(shù)據(jù)庫重構(gòu)--小小心得
對(duì)于一個(gè)軟件系統(tǒng),數(shù)據(jù)庫設(shè)計(jì)是整個(gè)系統(tǒng)最核心的部分。
但由于系統(tǒng)的需求是不斷變化,使得在數(shù)據(jù)庫設(shè)計(jì)變得十分重要而且困難。
在需求變化非常快情況下,有一部分人會(huì)認(rèn)為要尋找一種設(shè)計(jì)方法以固定不變的表結(jié)構(gòu)來適用不斷變化需
求。這個(gè)觀點(diǎn)是十分不明智和以現(xiàn)時(shí)的技術(shù)上暫時(shí)不能實(shí)現(xiàn)。對(duì)于軟件功能程序在需求不斷變法時(shí)候,為
了適應(yīng)新的需求,不斷重構(gòu)系統(tǒng)的代碼。以相同的道理,數(shù)據(jù)庫設(shè)計(jì)也是程序設(shè)計(jì)的一部分。那么,數(shù)據(jù)
庫一樣可以使用重構(gòu)來實(shí)現(xiàn)適用不斷變化的軟件系統(tǒng)。
本人認(rèn)為數(shù)據(jù)庫設(shè)計(jì)將會(huì)分為兩個(gè)階段進(jìn)行:
第一階段:數(shù)據(jù)庫功能上的設(shè)計(jì),由于在軟件系統(tǒng)的數(shù)據(jù)庫建立初期,數(shù)據(jù)庫也只是以實(shí)現(xiàn)系統(tǒng)同能為目
標(biāo),對(duì)于系統(tǒng)性能優(yōu)化將不會(huì)是數(shù)據(jù)庫設(shè)計(jì)的重點(diǎn)。
·建立軟件系統(tǒng)的比較通用功能基礎(chǔ)表。在基礎(chǔ)功能建立后,系統(tǒng)使用者會(huì)對(duì)系統(tǒng)部分功能作出評(píng)價(jià)和修
改要求。而功能基礎(chǔ)表設(shè)計(jì)為減少日后修改和維護(hù)量,會(huì)盡量設(shè)計(jì)通用和冗雜結(jié)構(gòu)。
·收集軟件系統(tǒng)的一些基本信息。對(duì)于軟件系統(tǒng)設(shè)計(jì)者來說,對(duì)軟件系統(tǒng)的中每個(gè)表數(shù)據(jù)量,程序上SQL的
使用,系統(tǒng)的繁忙時(shí)段以及周期等都會(huì)有比較初步評(píng)估。但對(duì)于數(shù)據(jù)庫設(shè)計(jì)者來說,這些估計(jì)都是只一些
推斷并沒有實(shí)際數(shù)據(jù)支持。為第二階段數(shù)據(jù)庫修改和維護(hù),對(duì)軟件系統(tǒng)作一些基本數(shù)據(jù)收集是必要的。
第二階段為數(shù)據(jù)庫系統(tǒng)能上優(yōu)化,主要是通過第一階段收集系統(tǒng)數(shù)據(jù)庫一些信息來對(duì)系統(tǒng)做修改和優(yōu)化
數(shù)據(jù)庫具體優(yōu)化方案需要以收集信息為基礎(chǔ)來之際來進(jìn)行指定。
下面本人總結(jié)下,數(shù)據(jù)庫中一般有哪些方面需要進(jìn)行優(yōu)化。
1優(yōu)化系統(tǒng)的SQL,具體有下面幾點(diǎn)可以進(jìn)行:
·對(duì)使用頻繁的SQL以創(chuàng)建具體功能存儲(chǔ)過程來代替,可以減少數(shù)據(jù)庫系統(tǒng)對(duì)SQL編譯和解析
·涉及到數(shù)據(jù)量大的表,盡量建立基本視圖來完成數(shù)據(jù)查詢工作
·在程序中盡量使用批量提交
(注:此方法在多數(shù)據(jù)更新和插入軟件系統(tǒng)中 ,可以比較顯著提高性能。
在提高系統(tǒng)性能的同時(shí),對(duì)程序的多線程控制技術(shù)上增加不少難度。
若線程控制出現(xiàn)問題,會(huì)對(duì)數(shù)據(jù)庫帶來災(zāi)難性破壞)
·程序在使用SQL的時(shí)候,盡量使用少消耗數(shù)據(jù)庫資源的運(yùn)行方式
2 數(shù)據(jù)庫表結(jié)構(gòu)的
·在數(shù)據(jù)量大表中,盡量減少非必要字段索引建立。
(注: 索引建立多了查詢速度是可以很有效的提高,但隨之而來的是插入數(shù)據(jù)消耗的數(shù)據(jù)庫資源也提高了很多)
·大表需要進(jìn)行分區(qū)存儲(chǔ)
(注:現(xiàn)在主流數(shù)據(jù)庫都已經(jīng)開始支持分區(qū)存儲(chǔ)數(shù)據(jù))
·在不影響系統(tǒng)的業(yè)務(wù)邏輯上,清理數(shù)據(jù)表中被廢棄使用的字段
(注:在清理廢棄的字段需要關(guān)注的確定這些字段是否真的已經(jīng)被廢棄,程序真的不再啟用)
3 修改有問題的SQL
·在實(shí)現(xiàn)功能時(shí)候,由于時(shí)間或者其他原因整個(gè)系統(tǒng)中肯定會(huì)有部分性能不優(yōu)的SQL存在。第一階段收集的數(shù)據(jù),現(xiàn)在就可以有效的進(jìn)行使用。通過這些數(shù)據(jù)我們可以很有效地把這些不優(yōu)的SQL[甚至是很爛]找出來,一條一條進(jìn)行調(diào)整
·在調(diào)整SQL外,還需要對(duì)數(shù)據(jù)庫內(nèi)存或者共享空間等等進(jìn)行調(diào)整;使得數(shù)據(jù)庫永遠(yuǎn)是處于最優(yōu)的狀態(tài)。
以上是本人一些小小心得,如果不對(duì)的地方歡迎指教。
MK-TIANYI
MK-TIANYI
但由于系統(tǒng)的需求是不斷變化,使得在數(shù)據(jù)庫設(shè)計(jì)變得十分重要而且困難。
在需求變化非常快情況下,有一部分人會(huì)認(rèn)為要尋找一種設(shè)計(jì)方法以固定不變的表結(jié)構(gòu)來適用不斷變化需
求。這個(gè)觀點(diǎn)是十分不明智和以現(xiàn)時(shí)的技術(shù)上暫時(shí)不能實(shí)現(xiàn)。對(duì)于軟件功能程序在需求不斷變法時(shí)候,為
了適應(yīng)新的需求,不斷重構(gòu)系統(tǒng)的代碼。以相同的道理,數(shù)據(jù)庫設(shè)計(jì)也是程序設(shè)計(jì)的一部分。那么,數(shù)據(jù)
庫一樣可以使用重構(gòu)來實(shí)現(xiàn)適用不斷變化的軟件系統(tǒng)。
本人認(rèn)為數(shù)據(jù)庫設(shè)計(jì)將會(huì)分為兩個(gè)階段進(jìn)行:
第一階段:數(shù)據(jù)庫功能上的設(shè)計(jì),由于在軟件系統(tǒng)的數(shù)據(jù)庫建立初期,數(shù)據(jù)庫也只是以實(shí)現(xiàn)系統(tǒng)同能為目
標(biāo),對(duì)于系統(tǒng)性能優(yōu)化將不會(huì)是數(shù)據(jù)庫設(shè)計(jì)的重點(diǎn)。
·建立軟件系統(tǒng)的比較通用功能基礎(chǔ)表。在基礎(chǔ)功能建立后,系統(tǒng)使用者會(huì)對(duì)系統(tǒng)部分功能作出評(píng)價(jià)和修
改要求。而功能基礎(chǔ)表設(shè)計(jì)為減少日后修改和維護(hù)量,會(huì)盡量設(shè)計(jì)通用和冗雜結(jié)構(gòu)。
·收集軟件系統(tǒng)的一些基本信息。對(duì)于軟件系統(tǒng)設(shè)計(jì)者來說,對(duì)軟件系統(tǒng)的中每個(gè)表數(shù)據(jù)量,程序上SQL的
使用,系統(tǒng)的繁忙時(shí)段以及周期等都會(huì)有比較初步評(píng)估。但對(duì)于數(shù)據(jù)庫設(shè)計(jì)者來說,這些估計(jì)都是只一些
推斷并沒有實(shí)際數(shù)據(jù)支持。為第二階段數(shù)據(jù)庫修改和維護(hù),對(duì)軟件系統(tǒng)作一些基本數(shù)據(jù)收集是必要的。
第二階段為數(shù)據(jù)庫系統(tǒng)能上優(yōu)化,主要是通過第一階段收集系統(tǒng)數(shù)據(jù)庫一些信息來對(duì)系統(tǒng)做修改和優(yōu)化
數(shù)據(jù)庫具體優(yōu)化方案需要以收集信息為基礎(chǔ)來之際來進(jìn)行指定。
下面本人總結(jié)下,數(shù)據(jù)庫中一般有哪些方面需要進(jìn)行優(yōu)化。
1優(yōu)化系統(tǒng)的SQL,具體有下面幾點(diǎn)可以進(jìn)行:
·對(duì)使用頻繁的SQL以創(chuàng)建具體功能存儲(chǔ)過程來代替,可以減少數(shù)據(jù)庫系統(tǒng)對(duì)SQL編譯和解析
·涉及到數(shù)據(jù)量大的表,盡量建立基本視圖來完成數(shù)據(jù)查詢工作
·在程序中盡量使用批量提交
(注:此方法在多數(shù)據(jù)更新和插入軟件系統(tǒng)中 ,可以比較顯著提高性能。
在提高系統(tǒng)性能的同時(shí),對(duì)程序的多線程控制技術(shù)上增加不少難度。
若線程控制出現(xiàn)問題,會(huì)對(duì)數(shù)據(jù)庫帶來災(zāi)難性破壞)
·程序在使用SQL的時(shí)候,盡量使用少消耗數(shù)據(jù)庫資源的運(yùn)行方式
2 數(shù)據(jù)庫表結(jié)構(gòu)的
·在數(shù)據(jù)量大表中,盡量減少非必要字段索引建立。
(注: 索引建立多了查詢速度是可以很有效的提高,但隨之而來的是插入數(shù)據(jù)消耗的數(shù)據(jù)庫資源也提高了很多)
·大表需要進(jìn)行分區(qū)存儲(chǔ)
(注:現(xiàn)在主流數(shù)據(jù)庫都已經(jīng)開始支持分區(qū)存儲(chǔ)數(shù)據(jù))
·在不影響系統(tǒng)的業(yè)務(wù)邏輯上,清理數(shù)據(jù)表中被廢棄使用的字段
(注:在清理廢棄的字段需要關(guān)注的確定這些字段是否真的已經(jīng)被廢棄,程序真的不再啟用)
3 修改有問題的SQL
·在實(shí)現(xiàn)功能時(shí)候,由于時(shí)間或者其他原因整個(gè)系統(tǒng)中肯定會(huì)有部分性能不優(yōu)的SQL存在。第一階段收集的數(shù)據(jù),現(xiàn)在就可以有效的進(jìn)行使用。通過這些數(shù)據(jù)我們可以很有效地把這些不優(yōu)的SQL[甚至是很爛]找出來,一條一條進(jìn)行調(diào)整
·在調(diào)整SQL外,還需要對(duì)數(shù)據(jù)庫內(nèi)存或者共享空間等等進(jìn)行調(diào)整;使得數(shù)據(jù)庫永遠(yuǎn)是處于最優(yōu)的狀態(tài)。
以上是本人一些小小心得,如果不對(duì)的地方歡迎指教。
MK-TIANYI
MK-TIANYI
posted on 2008-11-25 21:53 天一 閱讀(3143) 評(píng)論(3) 編輯 收藏 所屬分類: 其他