3 つのテーブルがあるとします:
-Buildings
-Rooms
-People
建物には 1 から 30 の部屋 (平均は 3 としましょう)
を持つことができ、建物には 0 から 30 人 (平均は 3 とします) を
持つことができます。部屋と人は 1 つの建物にしか所属できません。
毎月、約 50.000 の新しい建物とその部屋と人々がデータベースに追加されます。
2 年以上前のデータを削除できるため、建物の行は約 120 万になります。
主な問題は、通常 (常にではないが) 少なくとも 2 つのテーブル (常に存在する建物) を含むデータを検索して返す必要があるため、結合を実行する必要があることです。
私は3つの解決策を研究しました。
- 正規化されたデータを持つ (結合によるパフォーマンスの低下とスケーラビリティの低下)
- Rooms and People テーブルの建物データを複製します。(高速ですが、一般的に非正規化は好きではありません)
- Oracle クラスタ テーブル。(良いパフォーマンスを提供しているようで、データはまだ正規化されています)
質問は次のとおり
です。Oracle Cluster はこの状況に適していますか?
このようなクラスターに連続して行を追加しても問題ありませんか?
クラスターをお勧めしない場合、なぜ、そして何がより適しているのでしょうか?
詳細:
集まる:
SELECT *
FROM
(SELECT *
/*+ FIRST_ROWS(200)*/
FROM BUILDING_C R
INNER JOIN PEOPLE_C C
ON (R.BUILDING_id = C.BUILDING_id)
INNER JOIN ROOM_C S
ON (S.BUILDING_id = R.BUILDING_id)
WHERE S.OPEN_DATE >= SYSDATE - 60 -1
AND S.OPEN_DATE <= SYSDATE - 60
ORDER BY S.OPEN_DATE
)
WHERE rownum < 200;--17 consistent gets
正規化:
SELECT *
FROM
(SELECT *
/*+ FIRST_ROWS(200)*/
FROM BUILDING_N R
INNER JOIN PEOPLE_N C
ON (R.BUILDING_id = C.BUILDING_id)
INNER JOIN ROOM_N S
ON (S.BUILDING_id = R.BUILDING_id)
WHERE S.OPEN_DATE >= SYSDATE - 60 -1
AND S.OPEN_DATE <= SYSDATE - 60
ORDER BY S.OPEN_DATE
)
WHERE rownum < 200;--44 consistent gets