|
分類:[データベース全般]
SqlServer2000とVB2005で社内向け販売分析の仕組みを作成しています。
基幹システムは外注であり、情報システム部の事務員プログラマーのため、周りに相談相手がいません。 DB設計の定石などについて教えて頂ければと思います。 クエリーの抽出スピードをあげたいのですが、たまにTableScanをしているかのように遅くなることがあります。
■状況 店舗レジから吸い上げた売上データが、1日あたり約12万レコード(CSV)発生します。 これを売上明細テーブル(下記)に夜間バッチにてBulkInsertしています。週に一度、インデックスの再構築(DBCC DBREINDEX)はしています。 売上明細を集約したテーブルは別途用意せず、売上明細テーブル(トラン)から抽出する範囲内で常時最速でクエリー抽出したいと考えています。
■売上明細テーブル 日付、店舗コード、レジ番号、レシート番号、行番号、販売員、時刻、JANコード、売上数、税抜売上、原単価
PK(クラスタ化、一意):日付、店舗コード、レジ番号、レシート番号、行番号 IX1(非クラスタ化):店舗コード、日付
分析時の抽出条件(組合せ)としては、「日付」「店舗」「分類(商品マスタ)」「JANコード」等があります。
質問1 インデックスの張り方についてですが、 IX1:店舗コード、日付 IX2:店舗コード、JANコード、日付 IX3:JANコード、日付、店舗 などと、抽出時の組合せを意識してインデックスを作成するのが良いのか?それとも IX1:日付 IX2:店舗コード IX3:JANコード のように抽出条件になるカラム全てに単体で張るのが良いのでしょうか?
質問2 スピードアップの観点からの正規化についてです。 イメージ的に検索するテーブルが数珠つなぎになると遅くなる気がします。 売上明細のような(今後変更されない)元データに関しても必要でしょうか?
質問3 抽出条件の日付範囲が変わるだけで遅くなることがあります。 「Ymd BETWEEN '20110801' AND '20110831」なら、例えば10秒かからないのに、 「Ymd BETWEEN '20110901' AND '20110930'」では60秒以上かかることがあります。 日付を変えただけなのに推定実行プランも変わっています。そういうものなのでしょうか?
以上です。 漠然とした疑問ですが、自分ならこうDB設計する等、考えをお聞かせ下さい。
|