數據庫設計經驗談
數據庫模型的設計是否合理會極大影響系統的使用性能。筆者依據多年來設計和使用數據庫的經驗,提出以下一些設計原則,供同仁們參考。
慎用游標(Cursor)
游標提供了對特定集合中逐行掃描的手段,一般使用游標來逐行遍歷數據,根據取出數據條件的不同進行不同的操作。而對於多表和大表中定義的游標(大的數據集合)循環很容易使程序進入一個漫長的等待甚至死機,筆者在某市“住房公積金管理系統”進行日終賬戶滾積數計息處理時,對一個10萬個賬戶的游標處理時導致程序進入了一個無限期的等待(後經測算需48小時才能完成)(硬件環境:Alpha/4000 128MB RAM ,SCO Unix ,Sybase 11.0)。經修改程序並改用UPDATE語句後,該處理過程得以在20分鐘之內完成。示例如下:
Declare Mycursor cursor for select count—no from COUNT
Open Mycursor
Fetch Mycursor into @vcount—no
While (@@sqlstatus=0)
Begin
If @vcount—no=′ ′ 條件1
操作1
If @vcount—no=′ ′ 條件2
操作2
...
Fetch Mycursor into @vcount—no
End
...
改為
Update COUNT set 操作1 for 條件1
Update COUNT set 操作2 for 條件2
...
在某些必須使用游標的場合,可考慮將符合條件的數據行轉入臨時表中,再對臨時表定義游標進行操作,這樣,可使性能得到明顯提高。筆者在某地市“電信收費系統”數據庫後台程序設計中,對一個表(3萬行中符合條件的30多行數據)進行游標操作(硬件環境:PC服務器,PⅡ266 64MB RAM ,Windows NT4.0 MS SQL Server 6.5)。
示例如下:
Create #tmp /* 定義臨時表 */
( 字段1
字段2
... )
Insert into #tmp select * from TOTAL where 條件
Declare Mycursor cursor for select * from #tmp /*對臨時表定義游標*/
...
索引(Index)的使用技巧
創建索引一般有兩個目的:維護被索引列的惟一性和提供快速訪問表中數據的策略。大型數據庫有兩種索引,即簇索引和非簇索引,一個沒有簇索引的表是按堆結構存儲數據,所有的數據均添加在表的尾部;而建立了簇索引的表,其數據在物理上會按照簇索引鍵的順序存儲,一個表只允許有一個簇索引,因此,根據B樹結構,可以理解添加任何一種索引均能提高按索引列查詢的速度,但與此同時會降低插入、更新、刪除操作的性能,尤其是當填充因子(Fill Factor)較大時。所以對索引較多的表進行頻繁的插入、更新、刪除操作時,建表和索引時應設置較小的填充因子,以便在各數據頁中留下較多的自由空間,減少頁分割及重新組織的工作。