データベース設計経験
データベースモデルの設計が合理的かどうかは、システムのパフォーマンスに大きく影響します。著者は、データベースの設計と使用における長年の経験に基づいて、同僚の参考のために次の設計原則を提案します。
カーソルの使用には注意してください
カーソルは、特定のコレクション内で行ごとにデータを走査し、データを取得するためのさまざまな条件に基づいてさまざまな操作を実行するために使用されます。複数のテーブルや大きなテーブルで定義されたカーソル (大規模なデータ収集) ループの場合、プログラムが長時間待機したり、クラッシュしたりすることが簡単に発生します。某都市の「積立金管理システム」において、10万口座のカーソル処理時にプログラムが無期限待機状態(後から計算すると完了までに48時間かかる)が発生した(ハードウェア環境:Alpha/4000 128MB RAM、SCO Unix、Sybase 11.0) 。プログラムを変更し、代わりに UPDATE ステートメントを使用すると、プロセスは 20 分以内に完了しました。例は次のとおりです。
Declare Mycursorcursor for select count—no from COUNT
Open Mycursor
Fetch Mycursor into @vcount—no
while (@@sqlstatus=0)
Begin
If @vcount—no='''' 条件 1
Operation 1
If @vcount—no='''' Condition 2
Operation 2
...
Fetch Mycursor into @vcount—no
End
...
Changed to
Update COUNT set Operation 1 for Condition 1
Update COUNT set 条件 2 の操作 2
...
カーソルを使用する必要がある状況では、条件を満たすデータ行を一時表に転送し、一時表上で操作するカーソルを定義することを検討できます。このようにして、パフォーマンスを大幅に向上させることができます。ある都市の「テレコム課金システム」データベースのバックグラウンドプログラム設計において、筆者はテーブル(30,000行中30行以上の条件を満たすデータ)に対してカーソル操作を実行しました(ハードウェア環境:PCサーバー、PⅡ266 64MB RAM、 Windows NT4.0 MS SQL Server 6.5)。
例は以下の通り:
Create #tmp /*一時テーブル定義*/
(Field 1
Field 2
...)
Insert into #tmp select * from TOTAL where 条件
Declare Mycursor Cursor for select * from #tmp /* 一時テーブルにカーソルを定義します */
...
インデックスを使用するためのヒント (インデックス)
インデックスの作成には、一般に 2 つの目的があります。1 つはインデックス付きの列の一意性を維持すること、もう 1 つはインデックス付きの列のデータに素早くアクセスするための戦略を提供することです。テーブル。大規模なデータベースには、クラスター インデックスと非クラスター インデックスの 2 種類のインデックスがあり、クラスター インデックスのないテーブルではデータがヒープ構造に格納され、すべてのデータがテーブルの最後に追加されます。は、データをデータベースに物理的に格納します。したがって、テーブルには 1 つのクラスタ インデックスのみが許可されます。インデックスを使用すると、インデックス列によるクエリの速度が向上しますが、同時に、特にフィル ファクタ (Fill Factor) が大きい場合、挿入速度、更新および削除操作のパフォーマンスが低下します。したがって、多くのインデックスを持つテーブルで挿入、更新、削除操作を頻繁に実行する場合は、各データ ページにより多くの空き領域を残し、ページの分割やページ分割を減らすために、テーブルとインデックスの作成時にフィル ファクタをより小さく設定する必要があります。再組織の仕事。