powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Exists по двум или более таблицам
25 сообщений из 108, страница 1 из 5
Exists по двум или более таблицам
    #39521427
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FB3. Вот такой запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
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? Или посмотреть другие техники? Какие?
...
Рейтинг: 0 / 0
Exists по двум или более таблицам
    #39521431
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А по-крестьянски

Код: sql
1.
2.
3.
4.
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



не?
...
Рейтинг: 0 / 0
Exists по двум или более таблицам
    #39521433
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI,

Код: sql
1.
2.
3.
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


?
...
Рейтинг: 0 / 0
Exists по двум или более таблицам
    #39521435
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя, неправ я в общем случае, тут, возможно нужен left join с проверкой на not null, ибо неясно отношение между таблицами: например, если одной записи таблички modul соответствует больше одной записи таблички umass и т.д.
...
Рейтинг: 0 / 0
Exists по двум или более таблицам
    #39521437
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да дело не в exist-e, а в индексах, как пить дать.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Exists по двум или более таблицам
    #39521438
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДХотя, неправ я в общем случае, тут, возможно нужен left join с проверкой на not null, ибо неясно отношение между таблицами: например, если одной записи таблички modul соответствует больше одной записи таблички umass и т.д.
О, Господи, что это я понаписал. Все, спать.
...
Рейтинг: 0 / 0
Exists по двум или более таблицам
    #39521442
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Старый плюшевый мишкаА по-крестьянски

Код: sql
1.
2.
3.
4.
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:
Код: sql
1.
2.
3.
4.
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
...
Рейтинг: 0 / 0
Exists по двум или более таблицам
    #39521528
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

Такие тонкие советы следует давать, когда ты владеешь достаточным объёмом информации о задаче.
Оставь DISTINCT себе.
Поскольку sn_mdl в таблице modul может быть изначально неуникальным.
...
Рейтинг: 0 / 0
Exists по двум или более таблицам
    #39521532
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery, серийный номер в таблицы модулей может быть неуникален в случае совпадения серийных номеров от разных производителей модулей. Добавление в выборку идентификатора производителя эту проблему решит.
...
Рейтинг: 0 / 0
Exists по двум или более таблицам
    #39521541
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

Продолжаешь решать задачу, условия которой не знаешь, а предполагаешь.
...
Рейтинг: 0 / 0
Exists по двум или более таблицам
    #39521548
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery, вернее сказать "домысливаю", исходя из очевидных связей сущностей БД.
...
Рейтинг: 0 / 0
Exists по двум или более таблицам
    #39521605
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

Очевидных? Спасибо, поржал.
Давно для себя сделал вывод, что очевидное для меня вовсе не очевидно другим. Разбирая очередную поделку команды "ух" разработчиков, почти каждый раз в этом убеждаюсь.
Потому скепсис - наше всё. Предпочитаю приятно удивляться, что в этот раз сделано правильно разумно.
...
Рейтинг: 0 / 0
Exists по двум или более таблицам
    #39521607
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Старый плюшевый мишка,

По-крестьянски поинтереснее. Только вот так, конечно:
Код: sql
1.
2.
3.
4.
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 склонна к сильному росту. И всю её сканировать неправильно.
...
Рейтинг: 0 / 0
Exists по двум или более таблицам
    #39521608
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI,

Воспользуйся волшебным +0
А вообще, как только она разрастётся, то план сам поменяется же.
...
Рейтинг: 0 / 0
Exists по двум или более таблицам
    #39521609
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI,

как вырастет пересчитаешь статистику и план изменится. Не вижу в этом проблемы
...
Рейтинг: 0 / 0
Exists по двум или более таблицам
    #39521610
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI> И всю её сканировать неправильно.

Ну а первоначальный план какой был?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Exists по двум или более таблицам
    #39521611
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI,

судя по плану запрос не будет эквивалентом exists. defect соединяется не по уникальному ключу, а следовательно будет давать дубликаты записей
...
Рейтинг: 0 / 0
Exists по двум или более таблицам
    #39521620
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSeryrdb_dev,

Очевидных? Спасибо, поржал.
Давно для себя сделал вывод, что очевидное для меня вовсе не очевидно другим. Разбирая очередную поделку команды "ух" разработчиков, почти каждый раз в этом убеждаюсь.
Потому скепсис - наше всё. Предпочитаю приятно удивляться, что в этот раз сделано правильно разумно.В крайнем случае, можно полагаться на уникальность идентификатора модуля. Такой вариант должен соответствовать:
Код: sql
1.
2.
3.
4.
5.
6.
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)
...
Рейтинг: 0 / 0
Exists по двум или более таблицам
    #39521624
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Народ, давайте снова.

Таблица umass большая, defect тоже. Какой смысл сканировать в лоб всё, если мне нужно узнать только наличие дочерних записей?
...
Рейтинг: 0 / 0
Exists по двум или более таблицам
    #39521638
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI,

покажи план который был в изначальном запросе с exists
...
Рейтинг: 0 / 0
Exists по двум или более таблицам
    #39521639
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI, так укажи запросу тот план, что считаешь правильным.
...
Рейтинг: 0 / 0
Exists по двум или более таблицам
    #39521649
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI> Какой смысл сканировать в лоб всё

Зачем ты начинаешь вещать рассуждать, не понимая азов?
Повторяю - покажи план изначального запроса.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Exists по двум или более таблицам
    #39521678
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
План первого запроса:
авторПлан
PLAN JOIN (B INDEX (FK_UMASS_RELATIONS_MODUL), C INDEX (DEFECT_IDX1))
PLAN (A NATURAL)

DEFECT_IDX1 - это индекс по id_ums.
...
Рейтинг: 0 / 0
Exists по двум или более таблицам
    #39521685
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI,

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

Код: sql
1.
2.
3.
4.
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)
...
Рейтинг: 0 / 0
Exists по двум или более таблицам
    #39521710
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI> План первого запроса:

В нём что-то не устраивает? Маленькая сканится, большие по индексу.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 108, страница 1 из 5
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Exists по двум или более таблицам
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]