powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Выявление новой сущности.
16 сообщений из 16, страница 1 из 1
Выявление новой сущности.
    #32393106
Antony Borovin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что бы не путаться с терминологией, буду говорить на физическом уровне.
Есть две таблицы (t1, t2) одинаковой структуры. Необходимо в t2 найти все такие записи которые отсутствуют в t1.
Первое что приходит в голову:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Select * from t2
Where not exists 
(select * from t1
where  t1.f1 = t2.f2 and
           t1.f2 = t2.f2 and
………..
           t1.fn = t2.fn)


но сами понимаете что сильно тормозит. На 10000 записях минуту работает.
Понимаю что подобная задача в общем случае так и решается. Но может быть при каких ни будь условиях, можно добиться большой производительности? Кто что думает.
Кстати делаю на FB 1.5, хотя это не принципиально.
...
Рейтинг: 0 / 0
Выявление новой сущности.
    #32393195
Ermak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если Primary key - это одно поле, то можно например так

Код: plaintext
1.
2.
Select * From t2 
 Where PK_field not in (Select PK_field From t1);
Select * From tmpDstProd;


И если конечно же авторНеобходимо в t2 найти все такие записи которые отсутствуют в t1
...
Рейтинг: 0 / 0
Выявление новой сущности.
    #32393231
Jinn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извечная проблема NOT EXISTS

Необходим(ы) индекс(ы) по ключевым полям.

Затем такой запрос:

Код: plaintext
1.
2.
3.
4.
5.
6.
select t2.field_id
from table2 t2
where
(select count(t1.field_id)
from table1 t1
where t1.field_id=t2.field_id)= 0 


На миллоне записей работает шустро :)
...
Рейтинг: 0 / 0
Выявление новой сущности.
    #32393237
Antony Borovin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, в том и беда что реальный (не сурогатный) PK это все поля.
Я вообщем то понимаю что SQL не оптимален в этой задаче.
Даже готов тягать все на клиента. Но опять же не могу придумать ни одного умного алгоритма...
...
Рейтинг: 0 / 0
Выявление новой сущности.
    #32393456
Фотография Павел Воронцов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
 -- далее запись <t1> = <t2> означает перечисление
 
 -- t1.fld1 = t2.fld2 and ... and t1.fldN = t2.fldN
 
select * from t2 where not exists (select  1  from t2 where <t2> = <t1>);

select t1.*
from t1 left outer join t2 on <t1> = <t2>
where t2.<some fld> is null;

select * from t1 where  0  = (select count(*) from t2 where <t2>=<t1>)

select * from t1
minus
select * from t2
-- если конечно диалект SQL  это позволяет


Antony BorovinЯ вообщем то понимаю что SQL не оптимален в этой задаче
Ошибаетесь. Реляционная теория, на основе которой построен SQL и которой он в идеале должен следовать, включает операцию MINUS. К сожалению далеко не все вендоры СУБД эту операцию реализуют..
...
Рейтинг: 0 / 0
Выявление новой сущности.
    #32393560
Antony Borovin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Павел Воронцов
Ошибаетесь. Реляционная теория, на основе которой построен SQL и которой он в идеале должен следовать, включает операцию MINUS. К сожалению далеко не все вендоры СУБД эту операцию реализуют..


Я согласен с вами. Я имел ввиду что все известные мне реализации SQL в конкретных продуктах мало пригодны для этого.
А какие СУБД поддерживают MINUS?
(это слово, кстати, даже вон не выделяется цветом на форуме :)
...
Рейтинг: 0 / 0
Выявление новой сущности.
    #32393605
bas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А какие СУБД поддерживают MINUS?
(это слово, кстати, даже вон не выделяется цветом на форуме :)

Oracle
...
Рейтинг: 0 / 0
Выявление новой сущности.
    #32393626
Фотография Павел Воронцов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DB2 тоже поддерживает MINUS, только он там по другому называется (кажется EXCEPT)
...
Рейтинг: 0 / 0
Выявление новой сущности.
    #32393627
Andyn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из мощных и недорогих - в Sybase ASA 9 есть EXCEPT - Computes the difference between the result sets of two or more queries.
...
Рейтинг: 0 / 0
Выявление новой сущности.
    #32393793
Ermak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНет, в том и беда что реальный (не сурогатный) PK это все поля.


У Вас в таблице сколько полей? 10? 20? 30?

Всё таки, Primary key есть или его нет?
Если нет, то необходимо что бы он появился. Придумайте алгоритм по которому можно на основании информации хранящейся в записи таблицы сформировать искусственный (вычисляемый) PK.

Хотя возможно, что формирование этого PK может занять время сопоставимое или даже большее чем в Вашем варианте.

Отсутствие естественного PK на мой взгляд есть наглядный пример плохого дизайна. Как бы Вы не выкрутились, но структуру таблиц я бы посоветовал Вам изменить.
...
Рейтинг: 0 / 0
Выявление новой сущности.
    #32394287
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Antony Borovin.
Причем тут проектирование БД? Рутинный запрос, сто раз обсосаный на всех форумах. Напишите, на какой базе Вы работаете, и я его перекину в соответсвующий форум. Если Вы не умеете пользоваться поиском, то всегда найдется парочка альтруистов, которые это сделают за Вас.
...
Рейтинг: 0 / 0
Выявление новой сущности.
    #32395011
Jinn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ermak
Всё таки, Primary key есть или его нет?
Если нет, то необходимо что бы он появился. Придумайте алгоритм по которому можно на основании информации хранящейся в записи таблицы сформировать искусственный (вычисляемый) PK.

Хеш-функция явно будет рулить.
...
Рейтинг: 0 / 0
Выявление новой сущности.
    #32395217
Antony Borovin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ermak
У Вас в таблице сколько полей? 10? 20? 30?

Всё таки, Primary key есть или его нет?
Если нет, то необходимо что бы он появился. Придумайте алгоритм по которому можно на основании информации хранящейся в записи таблицы сформировать искусственный (вычисляемый) PK.

Хотя возможно, что формирование этого PK может занять время сопоставимое или даже большее чем в Вашем варианте.


В таблице 11 полей, 4 из них VARCHAR. В том и беда что все они в совокупности однозначно определяют сущность, то есть являются PK.
О хэше конечно же подумал в первую очередь - время действительно сопоставимо. Так что на моих объемах данных он не дает выигрыша.
...
Рейтинг: 0 / 0
Выявление новой сущности.
    #32395251
Antony Borovin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cat2
Причем тут проектирование БД?


Да собственно потому и сюда написал, что на чудо надеялся. Может кто
подскажет что ни будь, о чем я по своей глупости даже и не подозревал. :)
Нет, чудес не бывает...
Собственно, Павел Воронцов, уже все сказал. Больше спасибо - на глаз вариант с left join работает побыстрее. Зря я его сразу отбросил.

Cat2
Рутинный запрос, сто раз обсосаный на всех форумах. Напишите, на какой базе Вы работаете, и я его перекину в соответсвующий форум. Если Вы не умеете пользоваться поиском, то всегда найдется парочка альтруистов, которые это сделают за Вас.

Спасибо за Ваше предложение! Если Вы имели ввиду, что дадите мне ссылку на толковый тред, то я работаю под FB 1.5. Однако, естественно, я пошерстил форум прежде чем задавать вопрос. Надеюсь я что-то пропустил, на что Вы обратите мое внимание. :) Если Вы предлагаете создать новый тред, то не стоит - думаю тут уже все сказали.

Всем, спасибо - узнал много нового.
...
Рейтинг: 0 / 0
Выявление новой сущности.
    #32395507
Jinn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Antony Borovin О хэше конечно же подумал в первую очередь - время действительно сопоставимо. Так что на моих объемах данных он не дает выигрыша.

Что значит "не дает выигрыша"? Хеш-функция срабатывает в триггере по инсерту и апдейту и формирует PK. А затем этот PK используешь. И все, время запроса сократится до минимума.
...
Рейтинг: 0 / 0
Выявление новой сущности.
    #32396153
Antony Borovin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Jinn
Что значит "не дает выигрыша"? Хеш-функция срабатывает в триггере по инсерту и апдейту и формирует PK. А затем этот PK используешь. И все, время запроса сократится до минимума.


Нет в общем случае конечно дает, спора нет. Но только на моем объеме данных (достаточно небольшом ~10-15 тыс) это не существенно. Было бы 10~15 млн, тогда да. Кроме того тригер тоже мимо - заливка идет одной порцией.
Вообщем то я ССЗБ - надо было формулировать вопрос нормально. :)
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Выявление новой сущности.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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