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 表中有大约 1000 万行,并且希望查询时间不超过几秒钟。那可能吗?

4

2 回答 2

0

通常,数据库能够以体面的方式处理 1000 万条记录。我主要在我们的专业环境中使用 oracle 来处理大量数据(也有大约 30-4000 万行),甚至对表进行连接查询也不会花费超过一两秒的时间来运行。

在重要的课程中,我意识到,每当查询性能不佳时,就是查看索引是否在连接字段上正确定义。例如,这里有关于 profile_stat_id 和 profile_stat_value_id 的索引(我假设 user_id 是主键)应该定义索引。如果您没有这样做,这肯定会给您带来很好的性能提升。定义索引后,运行一次或两次查询,让数据库有机会在验证增益之前计算索引树和查询计划

于 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 表与其他三个表中的每一个连接起来。

您认为哪里需要自我加入?

[我没有包含任何过滤“许多统计数据”的内容;我完全不清楚问题的这一部分是什么意思。]

于 2010-04-20T05:25:55.130 回答