經(jīng)驗(yàn)總結(jié):講解大型數(shù)據(jù)庫(kù)的設(shè)計(jì)準(zhǔn)則(2)_Mssql數(shù)據(jù)庫(kù)教程
推薦:SQL Server各種日期計(jì)算方法之二 上個(gè)月的最后一天 這是一個(gè)計(jì)算上個(gè)月最后一天的例子。它通過(guò)從一個(gè)月的最后一天這個(gè)例子上減去3毫秒來(lái)獲得。有一點(diǎn)要記住,在Sql Server中時(shí)間是精確到3毫秒。這就是為
在有些場(chǎng)合,有時(shí)也非得使用游標(biāo),此時(shí)也可考慮將符合條件的數(shù)據(jù)行轉(zhuǎn)入臨時(shí)表中,再對(duì)臨時(shí)表定義游標(biāo)進(jìn)行操作,可時(shí)性能得到明顯提高。筆者在某地市〈電信收費(fèi)系統(tǒng)〉數(shù)據(jù)庫(kù)后臺(tái)程序設(shè)計(jì)中,對(duì)一個(gè)表(3萬(wàn)行中符合條件的30多行數(shù)據(jù))進(jìn)行游標(biāo)操
作(硬件環(huán)境:PC服務(wù)器,PII266 64Mram ,NT4.0 Ms Sqlserver 6.5)。 示例如下:
Create #tmp /* 定義臨時(shí)表 */
( 字段1
字段2
...
)
Insert into #tmp select * from TOTAL where
條件 /* TOTAL中3萬(wàn)行 符合條件只有幾十行 */
Declare Mycursor cursor for select * from #tmp
/*對(duì)臨時(shí)表定義游標(biāo)*/
...
索引(Index)的使用原則
---- 創(chuàng)建索引一般有以下兩個(gè)目的:維護(hù)被索引列的唯一性和提供快速訪問(wèn)表中數(shù)據(jù)的策略。大型數(shù)據(jù)庫(kù)有兩種索引即簇索引和非簇索引,一個(gè)沒(méi)有簇索引的表是按堆結(jié)構(gòu)存儲(chǔ)數(shù)據(jù),所有的數(shù)據(jù)均添加在表的尾部,而建立了簇索引的表,其數(shù)據(jù)在物理上會(huì)按照簇索引鍵的順序存儲(chǔ),一個(gè)表只允許有一個(gè)簇索引,因此,根據(jù)B樹結(jié)構(gòu),可以理解添加任何一種索引均能提高按索引列查詢的速度,但會(huì)降低插入、更新、刪除操作的性能,尤其是當(dāng)填充因子(Fill Factor)較大時(shí)。所以對(duì)索引較多的表進(jìn)行頻繁的插入、更新、刪除操作,建表和索引時(shí)因設(shè)置較小的填充因子,以便在各數(shù)據(jù)頁(yè)中留下較多的自由空間,減少頁(yè)分割及重新組織的工作。
數(shù)據(jù)的一致性和完整性
---- 為了保證數(shù)據(jù)庫(kù)的一致性和完整性,設(shè)計(jì)人員往往會(huì)設(shè)計(jì)過(guò)多的表間關(guān)聯(lián)(Relation),盡可能的降低數(shù)據(jù)的冗余。表間關(guān)聯(lián)是一種強(qiáng)制性措施,建立后,對(duì)父表(Parent Table)和子表(Child Table)的插入、更新、刪除操作均要占用系統(tǒng)的開銷,另外,最好不要用Identify 屬性字段作為主鍵與子表關(guān)聯(lián)。如果數(shù)據(jù)冗余低,數(shù)據(jù)的完整性容易得到保證,但增加了表間連接查詢的操作,為了提高系統(tǒng)的響應(yīng)時(shí)間,合理的數(shù)據(jù)冗余也是必要的。使用規(guī)則(Rule)和約束(Check)來(lái)防止系統(tǒng)操作人員誤輸入造成數(shù)據(jù)的錯(cuò)誤是設(shè)計(jì)人員的另一種常用手段,但是,不必要的規(guī)則和約束也會(huì)占用系統(tǒng)的不必要開銷,需要注意的是,約束對(duì)數(shù)據(jù)的有效性驗(yàn)證要比規(guī)則快。所有這些,設(shè)計(jì)人員在設(shè)計(jì)階段應(yīng)根據(jù)系統(tǒng)操作的類型、頻度加以均衡考慮。
事務(wù)的陷阱
---- 事務(wù)是在一次性完成的一組操作。雖然這些操作是單個(gè)的操作,SQL Server能夠保證這組操作要么全部都完成,要么一點(diǎn)都不做。正是大型數(shù)據(jù)庫(kù)的這一特性,使得數(shù)據(jù)的完整性得到了極大的保證。
---- 眾所周知,SQL Server為每個(gè)獨(dú)立的SQL語(yǔ)句都提供了隱含的事務(wù)控制,使得每個(gè)DML的數(shù)據(jù)操作得以完整提交或回滾,但是SQL Server還提供了顯式事務(wù)控制語(yǔ)句---- BEGIN TRANSACTION 開始一個(gè)事務(wù)
---- COMMIT TRANSACTION 提交一個(gè)事務(wù)
---- ROLLBACK TRANSACTION 回滾一個(gè)事務(wù)
---- 事務(wù)可以嵌套,可以通過(guò)全局變量@@trancount檢索到連接的事務(wù)處理嵌套層次。需要加以特別注意并且極容易使編程人員犯錯(cuò)誤的是,每個(gè)顯示或隱含的事物開始都使得該變量加1,每個(gè)事務(wù)的提交使該變量減1,每個(gè)事務(wù)的回滾都會(huì)使得該變量置0,而只有當(dāng)該變量為0時(shí)的事務(wù)提交(最后一個(gè)提交語(yǔ)句時(shí)),這時(shí)才把物理數(shù)據(jù)寫入磁盤。
數(shù)據(jù)庫(kù)性能調(diào)整
---- 在計(jì)算機(jī)硬件配置和網(wǎng)絡(luò)設(shè)計(jì)確定的情況下,影響到應(yīng)用系統(tǒng)性能的因素不外乎為數(shù)據(jù)庫(kù)性能和客戶端程序設(shè)計(jì)。而大多數(shù)數(shù)據(jù)庫(kù)設(shè)計(jì)員采用兩步法進(jìn)行數(shù)據(jù)庫(kù)設(shè)計(jì):首先進(jìn)行邏輯設(shè)計(jì),而后進(jìn)行物理設(shè)計(jì)。數(shù)據(jù)庫(kù)邏輯設(shè)計(jì)去除了所有冗余數(shù)據(jù),提高了數(shù)據(jù)吞吐速度,保證了數(shù)據(jù)的完整性,清楚地表達(dá)數(shù)據(jù)元素之間的關(guān)系。而對(duì)于多表之間的關(guān)聯(lián)查詢(尤其是大數(shù)據(jù)表)時(shí),其性能將會(huì)降低,同時(shí)也提高了客 戶端程序的編程難度,因此,物理設(shè)計(jì)需折衷考慮,根據(jù)業(yè)務(wù)規(guī)則,確定對(duì)關(guān)聯(lián)表的數(shù)據(jù)量大小、數(shù)據(jù)項(xiàng)的訪問(wèn)頻度,對(duì)此類數(shù)據(jù)表頻繁的關(guān)聯(lián)查詢應(yīng)適當(dāng)提高數(shù)據(jù)冗余設(shè)計(jì)。
數(shù)據(jù)類型的選擇
---- 數(shù)據(jù)類型的合理選擇對(duì)于數(shù)據(jù)庫(kù)的性能和操作具有很大的影響,有關(guān)這方面的書籍也有不少的闡述,這里主要介紹幾點(diǎn)經(jīng)驗(yàn)。
Identify字段不要作為表的主鍵與其它表關(guān)聯(lián),這將會(huì)影響到該表的數(shù)據(jù)遷移。Text 和Image字段屬指針型數(shù)據(jù),主要用來(lái)存放二進(jìn)制大型對(duì)象(BLOB)。這類數(shù)據(jù)的操作相比其它數(shù)據(jù)類型較慢,因此要避開使用。
日期型字段的優(yōu)點(diǎn)是有眾多的日期函數(shù)支持,因此,在日期的大小比較、加減操作上非常簡(jiǎn)單。但是,在按照日期作為條件的查詢操作也要用函數(shù),相比其它數(shù)據(jù)類型速度上就慢許多,因?yàn)橛煤瘮?shù)作為查詢的條件時(shí),服務(wù)器無(wú)法用先進(jìn)的性能策略來(lái)優(yōu)化查詢而只
能進(jìn)行表掃描遍歷每行。
---- 例如:要從DATA_TAB1中(其中有一個(gè)名為DATE的日期字段)查詢2008年的所有記錄。
---- Select * from DATA_TAB1 where datepart(yy,DATE)=2008
分享:透視MySQL數(shù)據(jù)庫(kù)之更新語(yǔ)句用于操作數(shù)據(jù)庫(kù)的SQL一般分為兩種,一種是查詢語(yǔ)句,也就是我們所說(shuō)的SELECT語(yǔ)句,另外一種就是更新語(yǔ)句,也叫做數(shù)據(jù)操作語(yǔ)句。言外之意,就是對(duì)數(shù)據(jù)進(jìn)行修改。在標(biāo)準(zhǔn)的SQL中有3個(gè)語(yǔ)句,它們是I
- sql 語(yǔ)句練習(xí)與答案
- 深入C++ string.find()函數(shù)的用法總結(jié)
- SQL Server中刪除重復(fù)數(shù)據(jù)的幾個(gè)方法
- sql刪除重復(fù)數(shù)據(jù)的詳細(xì)方法
- SQL SERVER 2000安裝教程圖文詳解
- 使用sql server management studio 2008 無(wú)法查看數(shù)據(jù)庫(kù),提示 無(wú)法為該請(qǐng)求檢索數(shù)據(jù) 錯(cuò)誤916解決方法
- SQLServer日志清空語(yǔ)句(sql2000,sql2005,sql2008)
- Sql Server 2008完全卸載方法(其他版本類似)
- sql server 2008 不允許保存更改,您所做的更改要求刪除并重新創(chuàng)建以下表
- SQL Server 2008 清空刪除日志文件(瞬間日志變幾M)
- Win7系統(tǒng)安裝MySQL5.5.21圖解教程
- 將DataTable作為存儲(chǔ)過(guò)程參數(shù)的用法實(shí)例詳解
Mssql數(shù)據(jù)庫(kù)教程Rss訂閱編程教程搜索
Mssql數(shù)據(jù)庫(kù)教程推薦
- 淺談深入淺出SQL嵌套SELECT語(yǔ)句
- SqlServer2005 數(shù)據(jù)庫(kù)同步配置圖文詳解
- 如何在SQL 2005中實(shí)現(xiàn)循環(huán)每一行做一定的操作
- SELECT 賦值與ORDER BY沖突的問(wèn)題
- 帶你深入了解SQL Server 2008獨(dú)到之處
- 觸發(fā)器學(xué)習(xí)
- 解讀數(shù)據(jù)庫(kù)自動(dòng)化技術(shù)彌補(bǔ)數(shù)據(jù)庫(kù)DBA短缺難題
- SSB(SQLservice Service Broker) 入門實(shí)例介紹
- 詳解MySQL權(quán)限
- 通過(guò)事務(wù)日志解決SQL Server常見四大故障(一)
猜你也喜歡看這些
- sql語(yǔ)句:SQLServer字段排序(按筆畫,拼音,拼音首字母)
- SQL分組排序去重復(fù)的小實(shí)例
- mysql出現(xiàn)“Incorrect key file for table”處理方法
- 遠(yuǎn)程連接mysql數(shù)據(jù)庫(kù)注意點(diǎn)記錄
- 基于unique與primary約束的區(qū)別分析
- 網(wǎng)站模板:如何捕獲和記錄SQL Server中發(fā)生的死鎖
- 基于mysql全文索引的深入理解
- 網(wǎng)站模板:利用Shell腳本實(shí)現(xiàn)遠(yuǎn)程MySQL自動(dòng)查詢
- 使用java處理字符串公式運(yùn)算的方法
- MySQL查詢優(yōu)化:用子查詢代替非主鍵連接查詢實(shí)例介紹
- 相關(guān)鏈接:
復(fù)制本頁(yè)鏈接| 搜索經(jīng)驗(yàn)總結(jié):講解大型數(shù)據(jù)庫(kù)的設(shè)計(jì)準(zhǔn)則(2)
- 教程說(shuō)明:
Mssql數(shù)據(jù)庫(kù)教程-經(jīng)驗(yàn)總結(jié):講解大型數(shù)據(jù)庫(kù)的設(shè)計(jì)準(zhǔn)則(2)
。