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

Откуда:
Сообщений: 196
Да чё вы докопались до Distinct. Пробовать надо. Вряд ли там тысячи дубликатов каждого значения, но вопрошающему виднее. Сортировка резалтсета - не особо затратная операция на умеренном количестве дубликатов.
15 сен 17, 14:14    [20798892]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 26549
rdb_dev
DISTINCT не способен к отбору по индексу

distinct еще с ИБ 6.0 делается исключительно через SORT. Даже если бы он был "по индексу", то не отбором, а проходом, через table order index (как group by, order by...).
15 сен 17, 14:26    [20798930]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
WildSery
Member

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

Автор написал, что до 100. Да, это мало. И сортировка быстрая.
Вот только "родительских" записей сейчас уже почти три миллиона. А провести три миллиона сортировок - это уже совсем другая история.
15 сен 17, 14:27    [20798933]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
WildSery
Member

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

Если это такой частый запрос, тут самое место для хранимого агрегата.
15 сен 17, 14:29    [20798938]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 247
WildSery
Гаджимурадов Рустам
Там 1-30-100. Не вариант справа налево.
Рустам, пусть автор ответит.
Это максимально плохое соотношение. Но пока из его речи следует, что только таблица дефектов не наполнена, остальные, значит, в более-менее рабочем состоянии, и текущее соотношение 1:3

А что автор ответит? Какая-то нестандартная схема работы? Описать бизнес процесс? Мне представляется невозможным просчитывать соотношения количества записей в таблицах. Все таблицы растут, defect явно меньше umass. Пусть планировщик FB сам решает по какому пути пойти. Естественно, ни о каком ручном подборе плана не может идти речи. И фильтров, собственно, нет. И, самое главное, почему Exists? Надо знать - Есть записи или нет. А какие они там - другой вопрос.
15 сен 17, 14:30    [20798941]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
kdv
Member

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

с точки зрения множеств, тут хоть тресни - либо modul + (umass + defect), либо (modul + umass) + defect
т.е. из трех множеств получить 2, и их уже склеить. Более быстрым вариантом, на мой взгляд, при имеющемся соотношении записей является
modul + (umass + defect).
Не пробовал вариант - from modul where exists (from umass where exists (defect)) ?
15 сен 17, 14:37    [20798964]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 1495
kdv
rdb_dev
DISTINCT не способен к отбору по индексу

distinct еще с ИБ 6.0 делается исключительно через SORT. Даже если бы он был "по индексу", то не отбором, а проходом, через table order index (как group by, order by...).
Правильно поправил - именно проходом. Странно, что в ФБ до сих пор DISTINCT только по натуралу.
15 сен 17, 14:40    [20798978]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
Симонов Денис
Member

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

во-первых не по натуралы, а внешней сортировкой. Во-вторых distinct применяется ко всем полям в предложении select. А в-третьих с чего ты взял что навигация по индексы будет быстрее при полном фетче?
15 сен 17, 14:47    [20799007]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
чччД
Guest
rdb_dev
...Странно, что в ФБ до сих пор DISTINCT только по натуралу.

А как еще, если все поля учитываются? Рассказывай.
15 сен 17, 14:48    [20799010]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
Старый плюшевый мишка
Member

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

с точки зрения множеств, тут хоть тресни - либо modul + (umass + defect), либо (modul + umass) + defect
т.е. из трех множеств получить 2, и их уже склеить. Более быстрым вариантом, на мой взгляд, при имеющемся соотношении записей является
modul + (umass + defect).
Не пробовал вариант - from modul where exists (from umass where exists (defect)) ?


Кто такой умасс я не догадываюсь, но слова модуль и дефект таки порождают смутные ассоциации из объективной реальности. И что-то мне шепчет, что у реального модуля вряд ли бывает больше пяти типов возможных дефектов. А вот один и тот же дефект (например, "не фурычит") может иметь чортова прорва типов модулей. То есть, количество возможных типов дефектов, по сравнению со всевозможными модулями, скорее всего, зело ограниченное. Начинать перебор от них мне представляется разумным. Хотя могу быть введён в заблуждение семантическими экивоками.
15 сен 17, 14:51    [20799029]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 1495
Симонов Денис
rdb_dev,

во-первых не по натуралы, а внешней сортировкой.
А "внешняя сортировка" в плане как выглядит? PLAN SORT(table NATURAL) - сортировка по значениям всех полей в SELECT записей, отобранных без использования индекса?

Симонов Денис
Во-вторых distinct применяется ко всем полям в предложении select. А в-третьих с чего ты взял что навигация по индексы будет быстрее при полном фетче?
Если все указанные в SELECT поля попадают в индекс, что мешает планировщику использовать именно индекс? Всего лишь отсутствие такой возможности, не так ли?
15 сен 17, 14:58    [20799062]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 247
kdv
Не пробовал вариант - from modul where exists (from umass where exists (defect)) ?

Примерно тоже самое.
Необычный результат получается, если попробовать использовать конструкцию "first 1". Может попробовать перебрать возможные варианты с ней? А?
15 сен 17, 15:01    [20799078]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 57221
Старый плюшевый мишка
слова модуль и дефект таки порождают смутные ассоциации из объективной реальности. И что-то мне шепчет, что у реального модуля вряд ли бывает больше пяти типов возможных дефектов. А вот один и тот же дефект (например, "не фурычит") может иметь чортова прорва типов модулей. То есть, количество возможных типов дефектов, по сравнению со всевозможными модулями, скорее всего, зело ограниченное. Начинать перебор от них мне представляется разумным. Хотя могу быть введён в заблуждение семантическими экивоками.

Кстати, да, +1.

KreatorXXI> Мне представляется невозможным просчитывать
KreatorXXI> соотношения количества записей в таблицах.

Гм... Ну если сам не можешь просчитать - хоть аналитика
постановщика вашего спроси/попроси.

KreatorXXI> И фильтров, собственно, нет.

Да ладно врать... ОК, вот выбрал ты записи каким-то макаром,
получил из ляма 15 тыщ - дальше с ними что собрался делать?

Posted via ActualForum NNTP Server 1.5

15 сен 17, 15:06    [20799110]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 57221
KreatorXXI> Необычный результат получается

Чем же он необычный? Быстрее или результат отличается?

> Может попробовать перебрать возможные варианты с ней? А?

Не может. "first 1" с Exist-ом не нужен.

Posted via ActualForum NNTP Server 1.5

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

Откуда: с болот
Сообщений: 1495
Вариант "а-ля DISTINCT" использующий индексы.
SELECT m.id_mdl
  FROM (SELECT id_ums, Count(*) FROM defect GROUP BY id_ums) d
    INNER JOIN umass um ON um.id_ums = d.id_ums
    INNER JOIN modul m ON m.id_mdl = um.id_mdl
15 сен 17, 17:12    [20799601]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
Симонов Денис
Member

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

не правильный запрос. У него defect->umass->modul
Т.е. производную таблицу с GROUP BY надо делать по связке двух таблиц. Я этот вариант уже приводил через CTE
15 сен 17, 17:18    [20799617]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 1495
Симонов Денис
rdb_dev,
Т.е. производную таблицу с GROUP BY надо делать по связке двух таблиц. Я этот вариант уже приводил через CTE
Согласен!
Проглядел приведенный тобой код.
15 сен 17, 21:51    [20800042]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
vvvait
Member

Откуда:
Сообщений: 19
а так?
select a.sn_mdl
from modul a
where exists ( select *
               from umass b
               left join defect c on c.id_ums=b.id_ums
               where b.id_mdl=a.id_mdl
                 and c.id_ums is not null)
16 сен 17, 02:17    [20800234]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 247
Старый плюшевый мишка
Хотя могу быть введён в заблуждение семантическими экивоками.

Именно так. В defect пишутся выявленные проблемы в изделии.

vvvait
а так?
select a.sn_mdl
from modul a
where exists ( select *
               from umass b
               left join defect c on c.id_ums=b.id_ums
               where b.id_mdl=a.id_mdl
                 and c.id_ums is not null)

По барабану, всё также. Что называется - "От перемены мест слагаемых сумма не меняется".

Попробовал через хранимку, через "for select". Банально, находится запись в defect, выходим из хранимки. С точки зрения количества сканированных записей получен очень хороший результат, раз в 30 меньше. Но с точки зрения времени выполнения - очень плохо. Время уходит на подготовку "for select"? Или сам вызов хранимки?
17 сен 17, 17:54    [20801680]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 43631

KreatorXXI
Банально, находится запись в defect, выходим из хранимки.

Это ничем не отличается от exists, только тормознее.

Posted via ActualForum NNTP Server 1.5

17 сен 17, 18:00    [20801685]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 57221
KreatorXXI> В defect пишутся выявленные проблемы в изделии.

А umass что?

> Попробовал через хранимку, через "for select". Банально, находится
> запись в defect, выходим из хранимки.

Во-первых, если делать хранимку, то делать весь запрос в хранимке,
а не его часть. Во-вторых, хранимка тут вряд ли чем-то поможет,
слишком простой случай. В-третьих, "находим-выходим" - это как
тупой exists, он именно так и работает.

> С точки зрения количества сканированных записей получен очень
> хороший результат, раз в 30 меньше.

Не похоже на правду. Показывай текст хранимки, планы и
время + количество фетчей.

Posted via ActualForum NNTP Server 1.5

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

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

а как ты это количество сканированных записей определяешь?
Трейсом что ли?
17 сен 17, 18:01    [20801687]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 26549
vvvait
where exists ( select *
from umass b
left join defect


так получится, что umass left join defect выдаст ВСЕ записи из umass для проверки на exists, а без defect они к делу не относятся.
17 сен 17, 18:05    [20801693]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
Старый плюшевый мишка
Member

Откуда:
Сообщений: 196
SELECT DISTINCT a.sn_mdl
FROM defect c
 JOIN umass b ON c.id_ums+0=b.id_ums
 JOIN  modul a ON b.id_mdl+0=a.id_mdl


?

Предполагается, что все индексы имеют место быть.
17 сен 17, 18:49    [20801762]     Ответить | Цитировать Сообщить модератору
 Re: Exists по двум или более таблицам  [new]
чччД
Guest
Старый плюшевый мишка
SELECT DISTINCT a.sn_mdl
FROM defect c
 JOIN umass b ON c.id_ums+0=b.id_ums
 JOIN  modul a ON b.id_mdl+0=a.id_mdl

?

Предполагается, что все индексы имеют место быть.

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