Поиск по нескольким (1-n) таблицам отношений - PullRequest
1 голос
/ 08 августа 2011

Я усвоил сложный способ, что я не должен хранить сериализованные данные в таблице, когда мне нужно сделать ее доступной для поиска.

Итак, я сделал 3 таблицы базовой и две таблицы отношений 1-n.

enter image description here

Итак, вот запрос, который я получаю, если я хочу выбрать конкретную деятельность.

SELECT
jdc_organizations_activities.id
FROM
jdc_activity_sector ,
jdc_activity_type
INNER JOIN jdc_organizations_activities ON jdc_activity_type.activityId = jdc_organizations_activities.id 
AND 
jdc_activity_sector.activityId = jdc_organizations_activities.id
WHERE
jdc_activity_sector.activitySector = 5 AND
jdc_activity_type.activityType = 3

Вопросы:

1- Какие типы индексов я могу добавить в таблицу отношений 1-n, у меня уже есть уникальная комбинация (ActivityId - ActivitySector) & (ActivityId -ActivityType)

2 - Есть ли лучший способ написать запрос для повышения производительности?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 08 августа 2011

Я бы реорганизовал запрос, чтобы избежать перекрестного продукта, вызванного использованием нотации ,.

Кроме того, вы эффективно используете только таблицы sector и type в качестве фильтров.Поэтому сначала поставьте activity стол, а затем присоединитесь к другим вашим столам.

Некоторые могут предложить это;первое объединение в идеале должно быть объединением, которое, скорее всего, наиболее ограничит ваши результаты, оставляя минимальный объем работы для второго объединения.На самом деле, движок sql может на самом деле перестроить ваш запрос при создании плана, но он помогает мыслить таким образом, чтобы помочь вам подумать об усилиях, на которые движок sql должен пойти.

Наконец,Есть индексы на каждой таблице.Я бы на самом деле предложил поменять местами индексы ...
- ActivitySector THEN ActivityId
- ActivityType THEN ActivityId

Это именно потому, что механизм sql манипулирует вашим запросом.Он может принять предложение WHERE и сказать «включать только записи из таблицы Sector, где ActivitySector = 5», и аналогично для таблицы типов.Наличие в индексе Sector и Type идентифицирует FIRST, и эта фильтрация таблиц может быть выполнена намного быстрее, и тогда объединениям будет гораздо меньше работы.

SELECT
  [activity].id
FROM
  jdc_organizations_activities    AS [activity]
INNER JOIN
  jdc_activity_sector             AS [sector]
    ON [activity].id = [sector].activityId
INNER JOIN
  jdc_activity_type               AS [type]
    ON [activity].id = [type].activityId
WHERE
  [sector].activitySector = 5
  AND [type].activityType = 3

Или потому, что вы нефактически использовать содержимое таблицы действий ...

SELECT
  [sector].activityId
FROM
  jdc_activity_sector             AS [sector]
INNER JOIN
  jdc_activity_type               AS [type]
    ON [sector].activityId = [type].activityId
WHERE
  [sector].activitySector = 5
  AND [type].activityType = 3

или ...

SELECT
  [activity].id
FROM
  jdc_organizations_activities    AS [activity]
WHERE
  EXISTS (SELECT * FROM jdc_activity_sector WHERE activityId = [activity].id AND activitySector = 5)
  AND EXISTS (SELECT * FROM jdc_activity_type WHERE activityId = [activity].id AND activityType = 3)
1 голос
/ 08 августа 2011

Я бы не советовал смешивать старый стиль from table1, table2 и новый стиль from table1 inner join table2 ... в одном запросе. И вы можете создавать псевдонимы таблиц, используя table1 as t1, сокращая длинные имена таблиц до легко запоминающегося мнемного:

select    a.id
from      jdc_organizations_activities a
join      jdc_activity_sector as
on        as.activityId = a.Id
join      jdc_activity_type as at
on        at.activityId = a.Id
where     as.activitySector = 5
          and at.activityType = 3

Или даже более читабельно, используя IN:

select    a.id
from      jdc_organizations_activities a
where     a.id in 
          (
          select  activityId 
          from    jdc_activity_sector 
          where   activitySector = 5
          )
          and a.id in 
          (
          select  activityId 
          from    jdc_activity_type 
          where   activityType = 3
          )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...