Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4 5   вперед  Ctrl      все
 Exists по двум или более таблицам  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 263
FB3. Вот такой запрос:
select a.sn_mdl
from modul a
where exists ( select b.id_ums
                     from umass b
                             inner join defect c on c.id_ums=b.id_ums
                     where b.id_mdl=a.id_mdl
                  )


Что нужно? Нужно получить все записи в таблице modul, которые имеют записи в таблице defect. Запрос отрабатывает правильно, но долго. Если в exists оставить одну таблицу umass, то поведение exists ожидаемое (читается по одной записи из umass для каждой записи modul). Если в exists две таблицы, то umass весь читается. Вообще таблицы umass и defect большие. Поэтому хочется такого поведения - читаем запись из modul, читаем последовательно umass и defect, если запись есть, то переходим к другой записи modul. Можно ли что-то сделать с exists? Или посмотреть другие техники? Какие?
15 сен 17, 00:35    [20797534]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
Старый плюшевый мишка
Member

Откуда:
Сообщений: 256
А по-крестьянски

select a.sn_mdl
 inner join umass b on b.id_mdl=a.id_mdl
 inner join defect c on c.id_ums=b.id_ums
from modul a


не?
15 сен 17, 01:13    [20797548]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
чччД
Guest
KreatorXXI,

select a.sn_mdl from modul a
  join umass b on b.id_mdl=a.id_mdl
  join detect c on c.id_ums=b.id_ums

?
15 сен 17, 01:16    [20797550]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
чччД
Guest
Хотя, неправ я в общем случае, тут, возможно нужен left join с проверкой на not null, ибо неясно отношение между таблицами: например, если одной записи таблички modul соответствует больше одной записи таблички umass и т.д.
15 сен 17, 01:21    [20797552]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 57674
Да дело не в exist-e, а в индексах, как пить дать.

Posted via ActualForum NNTP Server 1.5

15 сен 17, 01:23    [20797556]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
чччД
Guest
чччД
Хотя, неправ я в общем случае, тут, возможно нужен left join с проверкой на not null, ибо неясно отношение между таблицами: например, если одной записи таблички modul соответствует больше одной записи таблички umass и т.д.

О, Господи, что это я понаписал. Все, спать.
15 сен 17, 01:25    [20797557]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 1587
Старый плюшевый мишка
А по-крестьянски

select a.sn_mdl
 inner join umass b on b.id_mdl=a.id_mdl
 inner join defect c on c.id_ums=b.id_ums
from modul a


не?
По-моему, ты всё написал правильно, но забыл поставить DISTINCT после SELECT:
SELECT DISTINCT a.sn_mdl
 INNER JOIN umass b ON b.id_mdl=a.id_mdl
 INNER JOIN defect c ON c.id_ums=b.id_ums
FROM modul a
15 сен 17, 01:56    [20797570]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
WildSery
Member

Откуда: да, оттуда.
Сообщений: 12910
rdb_dev,

Такие тонкие советы следует давать, когда ты владеешь достаточным объёмом информации о задаче.
Оставь DISTINCT себе.
Поскольку sn_mdl в таблице modul может быть изначально неуникальным.
15 сен 17, 09:13    [20797782]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 1587
WildSery, серийный номер в таблицы модулей может быть неуникален в случае совпадения серийных номеров от разных производителей модулей. Добавление в выборку идентификатора производителя эту проблему решит.
15 сен 17, 09:19    [20797792]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
WildSery
Member

Откуда: да, оттуда.
Сообщений: 12910
rdb_dev,

Продолжаешь решать задачу, условия которой не знаешь, а предполагаешь.
15 сен 17, 09:27    [20797803]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 1587
WildSery, вернее сказать "домысливаю", исходя из очевидных связей сущностей БД.
15 сен 17, 09:39    [20797823]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
WildSery
Member

Откуда: да, оттуда.
Сообщений: 12910
rdb_dev,

Очевидных? Спасибо, поржал.
Давно для себя сделал вывод, что очевидное для меня вовсе не очевидно другим. Разбирая очередную поделку команды "ух" разработчиков, почти каждый раз в этом убеждаюсь.
Потому скепсис - наше всё. Предпочитаю приятно удивляться, что в этот раз сделано правильно разумно.
15 сен 17, 10:41    [20798003]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 263
Старый плюшевый мишка,

По-крестьянски поинтереснее. Только вот так, конечно:
select a.sn_mdl
from modul a
     inner join umass b on b.id_mdl=a.id_mdl
     inner join defect c on c.id_ums=b.id_ums


Но мне сейчас не нравится план:
автор
План
PLAN JOIN (C NATURAL, B INDEX (PK_UMASS), A INDEX (PK_MODUL))


Почему defect по натуралу? Хотя может из-за того, что таблица defect на данный момент меньше двух других. Если так, то в корне неправильно. Таблица defect склонна к сильному росту. И всю её сканировать неправильно.
15 сен 17, 10:44    [20798009]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
WildSery
Member

Откуда: да, оттуда.
Сообщений: 12910
KreatorXXI,

Воспользуйся волшебным +0
А вообще, как только она разрастётся, то план сам поменяется же.
15 сен 17, 10:45    [20798015]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 7412
KreatorXXI,

как вырастет пересчитаешь статистику и план изменится. Не вижу в этом проблемы
15 сен 17, 10:47    [20798021]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 57674
KreatorXXI> И всю её сканировать неправильно.

Ну а первоначальный план какой был?

Posted via ActualForum NNTP Server 1.5

15 сен 17, 10:47    [20798022]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 7412
KreatorXXI,

судя по плану запрос не будет эквивалентом exists. defect соединяется не по уникальному ключу, а следовательно будет давать дубликаты записей
15 сен 17, 10:50    [20798032]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 1587
WildSery
rdb_dev,

Очевидных? Спасибо, поржал.
Давно для себя сделал вывод, что очевидное для меня вовсе не очевидно другим. Разбирая очередную поделку команды "ух" разработчиков, почти каждый раз в этом убеждаюсь.
Потому скепсис - наше всё. Предпочитаю приятно удивляться, что в этот раз сделано правильно разумно.
В крайнем случае, можно полагаться на уникальность идентификатора модуля. Такой вариант должен соответствовать:
SELECT sn_mdl
  FROM (
      SELECT DISTINCT a.id_mdl, a.sn_mdl
        FROM modul a
          INNER JOIN umass b ON b.id_mdl=a.id_mdl
          INNER JOIN defect c ON c.id_ums=b.id_ums)
15 сен 17, 10:59    [20798062]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 263
Народ, давайте снова.

Таблица umass большая, defect тоже. Какой смысл сканировать в лоб всё, если мне нужно узнать только наличие дочерних записей?
15 сен 17, 11:02    [20798073]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 7412
KreatorXXI,

покажи план который был в изначальном запросе с exists
15 сен 17, 11:10    [20798114]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 1587
KreatorXXI, так укажи запросу тот план, что считаешь правильным.
15 сен 17, 11:10    [20798117]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 57674
KreatorXXI> Какой смысл сканировать в лоб всё

Зачем ты начинаешь вещать рассуждать, не понимая азов?
Повторяю - покажи план изначального запроса.

Posted via ActualForum NNTP Server 1.5

15 сен 17, 11:22    [20798175]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 263
План первого запроса:
автор
План
PLAN JOIN (B INDEX (FK_UMASS_RELATIONS_MODUL), C INDEX (DEFECT_IDX1))
PLAN (A NATURAL)

DEFECT_IDX1 - это индекс по id_ums.
15 сен 17, 11:51    [20798303]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 7412
KreatorXXI,

попробуй вот так

SELECT a.sn_mdl
FROM modul a
 JOIN umass b ON b.id_mdl=a.id_mdl
WHERE EXISTS(SELECT * FROM defect c ON c.id_ums=b.id_ums)
15 сен 17, 11:56    [20798328]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 57674
KreatorXXI> План первого запроса:

В нём что-то не устраивает? Маленькая сканится, большие по индексу.

Posted via ActualForum NNTP Server 1.5

15 сен 17, 12:12    [20798403]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4 5   вперед  Ctrl      все
Все форумы / Firebird, InterBase Ответить