Масштабируемый способ самостоятельного объединения со многими за многими столами - PullRequest
0 голосов
/ 20 апреля 2010

У меня есть структура таблицы, подобная следующей:

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, и это намного лучше, но все же медленно.

Есть ли какая-то магия, по которой я скучаю? У меня около 10 миллионов строк в таблице user_profile и я хочу, чтобы запрос занимал не более нескольких секунд. Это возможно?

Ответы [ 2 ]

0 голосов
/ 20 апреля 2010

Внешне вы, кажется, просите об этом, что не включает в себя самостоятельные соединения:

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 с каждой из трех других таблиц в соответствующем соединяющем столбце.

Где, по вашему мнению, вам нужно присоединиться?

[ Я не включил ничего, чтобы отфильтровать «много статистики»; мне совершенно не ясно, что означает эта часть вопроса. ]

0 голосов
/ 20 апреля 2010

Обычно базы данных способны обрабатывать 10 миллионов записей достойным образом. Я в основном использовал oracle в нашей профессиональной среде с большими объемами данных (около 30-40 миллионов строк), и даже на выполнение запросов к объединению таблиц никогда не уходило больше одной или двух секунд.

На ВАЖНОМ уроке я понимал, что когда производительность запросов была плохой, нужно было видеть, правильно ли определены индексы в полях соединения. Например. Здесь наличие индексов для profile_stat_id и profile_stat_value_id (user_id, я предполагаю, является первичным ключом) должно иметь определенные индексы. Это определенно даст вам хороший прирост производительности, если вы этого не сделали. После определения индексов выполните запрос один или два раза, чтобы дать БД возможность рассчитать дерево индексов и план запроса, прежде чем проверять выигрыш

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...