Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Выявление новой сущности. / 16 сообщений из 16, страница 1 из 1
30.01.2004, 09:37
    #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
30.01.2004, 10:18
    #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
30.01.2004, 10:34
    #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
30.01.2004, 10:36
    #32393237
Antony Borovin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выявление новой сущности.
Нет, в том и беда что реальный (не сурогатный) PK это все поля.
Я вообщем то понимаю что SQL не оптимален в этой задаче.
Даже готов тягать все на клиента. Но опять же не могу придумать ни одного умного алгоритма...
...
Рейтинг: 0 / 0
30.01.2004, 12:13
    #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
30.01.2004, 12:59
    #32393560
Antony Borovin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выявление новой сущности.
Павел Воронцов
Ошибаетесь. Реляционная теория, на основе которой построен SQL и которой он в идеале должен следовать, включает операцию MINUS. К сожалению далеко не все вендоры СУБД эту операцию реализуют..


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

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


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

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

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

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

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

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

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


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


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

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

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

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

Что значит "не дает выигрыша"? Хеш-функция срабатывает в триггере по инсерту и апдейту и формирует PK. А затем этот PK используешь. И все, время запроса сократится до минимума.
...
Рейтинг: 0 / 0
03.02.2004, 09:56
    #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]