私はそのmysqlのmssqlについてもっと知っていますが、あなたが話している結合の数や行の数が、適切なインデックスであまりにも多くの問題を引き起こすとは思わない。クエリプランを分析して、不足していないかどうかを確認しましたか?
http://dev.mysql.com/doc/refman/5.0 /en/explain.html
そうは言っても、インデックスに満足し、他のすべての手段を使い果たしたら、非正規化が正しい答えかもしれません。問題のあるクエリが1つか2つしかない場合は、手動によるアプローチがおそらく適切ですが、データキューブを開発するためのプラットフォームを作成するには、ある種のデータウェアハウスツールの方が適している場合があります。
これが私が見つけたこのテーマに触れているサイトです:
http://www.meansandends.com / mysql-data-warehouse /?link_body%2Fbody =%7Bincl%3AAggregation%7D
これは、一度にいくつかのクエリを実行している場合に、クエリの非正規化を単純に保つために使用できる簡単な手法です(OLTPテーブルを置き換えるのではなく、レポート用に新しいテーブルを作成するだけです)。アプリケーションに次のクエリがあるとします:
select a.name, b.address from tbla a
join tblb b on b.fk_a_id = a.id where a.id=1
非正規化されたテーブルを作成して、ほぼ同じクエリを入力できます:
create table tbl_ab (a_id, a_name, b_address);
-- (types elided)
下線が使用するテーブルエイリアスと一致していることに注意してください
insert tbl_ab select a.id, a.name, b.address from tbla a
join tblb b on b.fk_a_id = a.id
-- no where clause because you want everything
次に、新しい非正規化テーブルを使用するようにアプリを修正するには、アンダースコアのドットを切り替えます。
select a_name as name, b_address as address
from tbl_ab where a_id = 1;
巨大なクエリの場合、これにより多くの時間を節約でき、データの出所が明確になり、既存のクエリを再利用できます。
覚えておいてください、私はこれを最後の手段としてのみ提唱しています。私はあなたを助けるであろういくつかのインデックスがあるに違いない。また、非正規化するときは、ディスク上の余分なスペースを考慮することを忘れないでください。また、クエリを実行して新しいテーブルにデータを入力するタイミングを把握してください。これはおそらく夜、または活動が少ないときはいつでもあるはずです。もちろん、そのテーブルのデータが正確に最新になることはありません。
[さらに別の編集]作成する新しいテーブルにもインデックスを付ける必要があることを忘れないでください。良い点は、一括挿入を除いて、テーブルには選択のみが表示されるため、更新ロックの競合を気にせずに、心ゆくまでインデックスを作成できることです。