powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Простой запрос со "сложным Планом" ;)
13 сообщений из 13, страница 1 из 1
Простой запрос со "сложным Планом" ;)
    #32464210
Максим (m-axic)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здаров !

Вот такой вопрос. Не пойму в чем дело.
Есть две таблицы в БД: class, document.
в Document поля : document_id (PK), name и т.д.
в CLASS: class_id, document_id (FK)^

Так вот надо мне выбрать все документы из таблицы document которые не упоминаются в CLASS (по полю document_id).

Код: plaintext
1.
2.
3.
SELECT document.document_id FROM
document LEFT OUTER JOIN class ON (class.document_id = document.document_id)
where class.document_id is null


Вот эта простая сволочь дает такой План

Код: plaintext
1.
2.
3.
4.
5.
План
PLAN JOIN (DOCUMENT NATURAL,CLASS INDEX (RDB$FOREIGN216))

Адаптированный план
PLAN JOIN (DOCUMENT NATURAL,CLASS INDEX (FK_CLASS))


в Document - 50000 записей - очень долго выбирает.

ПОЧЕМУ ТАК ????
...
Рейтинг: 0 / 0
Простой запрос со "сложным Планом" ;)
    #32464244
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может, я что не понял:

SELECT document.document_id FROM document LEFT OUTER JOIN class ON (class.document_id = document.document_id)
where class.document_id is null

давай заменим на

SELECT document.document_id FROM document where document_id is null

???
...
Рейтинг: 0 / 0
Простой запрос со "сложным Планом" ;)
    #32464273
Максим (m-axic)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to mv:

Ты не правильно понял, куда ты дел таблицу Class то?

Выбрать все записи из Document которые не упоминаються в таблице Class!
Т.е. чтобы document.document_id не было в class.document_id

Проще конечно написать

Код: plaintext
1.
2.
select document_id from document where document_id not in 
(select class.document_id from class)


Но так получаеться то же самое PLAN DOCUMENT NATURAL
...
Рейтинг: 0 / 0
Простой запрос со "сложным Планом" ;)
    #32464274
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А какой план ты ожидал увидеть? В этом запросе нет никакой возможности применить индекс по document.
...
Рейтинг: 0 / 0
Простой запрос со "сложным Планом" ;)
    #32464500
Максим (m-axic)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to: Dimitr

Привет. Слушай а как же тогда быть ?
т.е. в принципе нельзя сделать запрос быстрее ? или как то подругому выборку можнос сделать.

Я так понял что через "not in" и "outer Join" без Natural plan'а не получиться ? :(
...
Рейтинг: 0 / 0
Простой запрос со "сложным Планом" ;)
    #32464549
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, раз очень нужно - то вот вариант:

- в таблицу Document добавить поле Class_Count

- при добавлении/удалении/перемещении между документами экземпляров таблицы Class - соответственно модифицировать это поле с условием "... where document_id = ...".

Например, с помощью триггеров.

Индексирует по этому полю, и выбираем все, у которых это Class_Count = 0.

Выборка будет - быстрее некуда.
Select Sum(*) from Document where Class_Count = 0
...
Рейтинг: 0 / 0
Простой запрос со "сложным Планом" ;)
    #32464551
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняюсь, вернее:
Select Document_Id from Document where Class_Count = 0
...
Рейтинг: 0 / 0
Простой запрос со "сложным Планом" ;)
    #32464552
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так должно бы быть побыстрее
Код: plaintext
1.
2.
SELECT A.document_id 
FROM document A
WHERE NOT (A.document_id = SOME (SELECT B.document_id FROM class B))
...
Рейтинг: 0 / 0
Простой запрос со "сложным Планом" ;)
    #32464569
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Один черт по Document план натуральный будет. А в моем варианте - по индексу.
...
Рейтинг: 0 / 0
Простой запрос со "сложным Планом" ;)
    #32464898
Максим (m-axic)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Johnmen
та же матрена в другом сарафане получается. PLAN :(

to mv

Щас попробую - не плохой вариант, хотя и громоздкий ! Спасибо
...
Рейтинг: 0 / 0
Простой запрос со "сложным Планом" ;)
    #32464946
FreemanZAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иногда в таких сучаях Exists не плохо работает:
SELECT A.document_id

FROM document A
WHERE NOT EXISTS (SELECT 1 FROM class B WHERE B.document_id
=A.document_id )
...
Рейтинг: 0 / 0
Простой запрос со "сложным Планом" ;)
    #32465030
Максим (m-axic)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to FreemanZAV

Код: plaintext
1.
2.
3.
4.
5.
План
PLAN (B INDEX (RDB$FOREIGN216))
PLAN (A NATURAL)

Адаптированный план
PLAN (B INDEX (FK_CLASS)) PLAN (A NATURAL)


Вообще говоря мне кажется это не логичным - почему через PLAN то, мля!!!!???
...
Рейтинг: 0 / 0
Простой запрос со "сложным Планом" ;)
    #32465092
FreemanZAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что не логичного?
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Простой запрос со "сложным Планом" ;)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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