Sql 2008 (それ以前は '05) で、ほぼ 3 年間、データベースを運用しています。うまくいきましたが、あまりパフォーマンスが高くありません。そのため、スキーマとクエリを微調整して、いくつかの処理を高速化しています。また、メイン テーブルのスコアには、テーブルごとに約 1 ~ 3 ミルの行が含まれています (サイズの推定値を与えるため)。
サンプルのデータベース ダイアグラムを次に示します (Soz、NDA に基づいているため、元の図を表示できません) :-
代替テキスト http://img11.imageshack.us/img11/4608/dbschemaexample.png
注意すべきこと(これは私の問題に直接関係しています):-
- ビークルには 0 (NULL) または 1 つのラジオがあります。(左外部結合)
- 車両には 0 (NULL) または 1 つのカップホルダー (左外側結合) を設定できます。
- 車両には 1 つのタイヤ タイプ (内部結合) があります。
まず、これは正規化されたデータベース スキーマのように見えます。私はDB理論が嫌いなので、これは(少なくとも)3NFだと思います...有名な最後の言葉:)
これら 2 つの外部結合と内部結合が頻繁に呼び出され、多くのステートメントでさらにいくつかの結合が行われるため、データベースのパフォーマンスが低下しています。
これを修正するために、 indexed viewを試してみようと思いました。ビューの作成は簡単です。しかし、インデックスを作成しても機能しません->結合または自己参照テーブルを使用してインデックス付きビューを作成できません(別の問題:( )。
それで、私は何時間も泣いて(そして/ wrists 、髪を染めて、それについてのエモソングを書いて、それをmyfailspaceに載せました)、次のことをしました...
- 「オプション」の各外部結合テーブル (この例では、ラジオとカップホルダー) に新しい行を追加しました。ID = 0、残りのデータ = 'Unknown Blah' または 0's.
- 親テーブルを更新して、NULL データが 0 になるようにします。
- 外部結合から内部結合への関係を更新します。
これで動作します。インデックス付きビューを作成することもできます。これは現在非常に高速です。
だから...私は苦しんでいます。これは、私が教えられてきたことすべてに反しています。汚い気がします。1人。感染した。
これは悪いことですか?これは、パフォーマンスのためにデータベースを非正規化する一般的なシナリオですか?
これについていくつか考えてみたいと思います:)
PS。Google がランダムに見つけたこれらの画像は、私ではありません。