0

私は次のようなテーブル構造を持っています:

user
  id
  name

profile_stat
  id
  name

profile_stat_value
  id
  name

user_profile
  user_id
  profile_stat_id
  profile_stat_value_id

私の質問は:

多くの統計についてprofile_stat_idとprofile_stat_value_idを持つすべてのユーザーを検索するクエリを評価するにはどうすればよいですか?

私は内部自己結合を試みましたが、多くの統計を検索するとすぐに夢中になります。また、実際のuser_profileテーブルでカウントを実行しようとしましたが、それははるかに優れていますが、それでも低速です。

私が見逃している魔法はありますか?user_profileテーブルに約1,000万行あり、クエリに数秒以上かかることはありません。それは可能ですか?

4

2 に答える 2

0

通常、データベースは 1,000 万件のレコードをまともな方法で処理できます。私は主に、大量のデータ (約 3,000 万から 4,000 万行) を持つプロの環境で oracle を使用してきました。

重要なレッスンで、クエリのパフォーマンスが悪いときはいつでも、結合フィールドでインデックスが適切に定義されているかどうかを確認する必要があることに気付きました。たとえば、ここで profile_stat_id と profile_stat_value_id (user_id が主キーであると想定しています) にインデックスを設定するには、インデックスを定義する必要があります。これを行っていない場合、これにより確実にパフォーマンスが向上します。インデックスを定義した後、クエリを 1 回または 2 回実行して、DB にインデックス ツリーとクエリ プランを計算する機会を与えてから、ゲインを確認します。

于 2010-04-20T05:25:47.957 に答える
0

表面的には、自己結合を含まないこれを求めているようです:

SELECT u.name, u.id, s.name, s.id, v.name, v.id
  FROM User_Profile       AS p
  JOIN User               AS u ON u.id = p.user_id
  JOIN Profile_Stat       AS s ON s.id = p.profile_stat_id
  JOIN Profile_Stat_Value AS v ON v.id = p.profile_stat_value_id

対応するテーブルに一致するエントリが必要ない場合は、リストされている結合のいずれかを LEFT OUTER JOIN に変更できます。ここで行うことは、中央の User_Profile テーブルを他の 3 つのテーブルのそれぞれと適切な結合列で結合することだけです。

どこで自己結合が必要だと思いますか?

[ 「多くの統計」でフィルタリングするものは何も含めていません。質問のその部分が何を意味するのか、私にはまったくわかりません。]

于 2010-04-20T05:25:55.130 に答える