powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Зависает запрос
10 сообщений из 10, страница 1 из 1
Зависает запрос
    #38540070
frozzen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не могу понять причину зависания запроса, т.е. сервер уходит в долгое раздумье. Дождаться не вышло результата.
Первая версия была без объединения с -1, потом подумал, что сервер впадает в раздумье за-за того, что подзапрос возвращает null и решил добавить union.
отдельно подзапрос выполняется за приемлемое время. Не могу понять, где подвох и как действовать

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT * from rqrt_bdgt WHERE 
 IDRQRT not in (
       select -1 from uo where iduo=1 union
       select RQRT.IDRQRT from RQRT, RQRTPRC WHERE  
              RQRTPRC.IDRQRT=rqrt.idrqrt  and
              (idmo IN (SELECT idmo FROM mo_temp_frozen)) and
             (RQRT.GUID not in (select guid from rqrt_temp where guid is not null))
        )



План подзапроса
Код: plsql
1.
2.
3.
4.
5.
Plan
PLAN (MO_TEMP_FROZEN NATURAL)
PLAN (RQRT_TEMP NATURAL)
PLAN (UO INDEX (IDUO_PK))
PLAN JOIN (RQRT NATURAL, RQRTPRC INDEX (RQRTPRC_RQRT_IDX))



Общий план

Код: plsql
1.
2.
3.
4.
5.
6.
Plan
PLAN (MO_TEMP_FROZEN NATURAL)
PLAN (RQRT_TEMP NATURAL)
PLAN (UO INDEX (IDUO_PK))
PLAN JOIN (RQRT NATURAL, RQRTPRC INDEX (RQRTPRC_RQRT_IDX))
PLAN (RQRT_BDGT NATURAL)



Такое выполняется тоже
Код: plsql
1.
SELECT * from rqrt_bdgt WHERE  IDRQRT not in (-1)



Это возвращает -1
Код: plsql
1.
2.
3.
4.
5.
select -1 from uo where iduo=1 union
       select RQRT.IDRQRT from RQRT, RQRTPRC WHERE  
              RQRTPRC.IDRQRT=rqrt.idrqrt  and
              (idmo IN (SELECT idmo FROM mo_temp_frozen)) and
             (RQRT.GUID not in (select guid from rqrt_temp where guid is not null))
...
Рейтинг: 0 / 0
Зависает запрос
    #38540074
Замени:
IN-подзапросы на JOIN,
NOT IN - подзапросы на LEFT JOIN ANTI
...
Рейтинг: 0 / 0
Зависает запрос
    #38540120
Фотография peter64
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
прочитай про exists
...
Рейтинг: 0 / 0
Зависает запрос
    #38540522
frozzen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сработал вот такой
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT * from rqrt_bdgt WHERE
IDRQRT not in (
   SELECT Q.IDRQRT FROM (
    select RQRT.IDRQRT, RQRT.GUID from RQRT, rqrtprc, MO_TEMP_FROZEN t
    where
      RQRT.IDRQRT = RQRTPRC.IDRQRT AND
      RQRT.IDMO = t.IDMO

    ) Q LEFT JOIN RQRT_TEMP ON
     Q.GUID = RQRT_TEMP.GUID WHERE RQRT_TEMP.GUID IS NULL
...
Рейтинг: 0 / 0
Зависает запрос
    #38540549
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, frozzen!
You wrote on 28 января 2014 г. 14:29:43:

frozzen> сработал вот такой
судорожное программирование методом научного тыка.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Зависает запрос
    #38543166
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый Э - ЭхNOT IN - подзапросы на LEFT JOIN ANTI
что-то новое?
...
Рейтинг: 0 / 0
Зависает запрос
    #38543290
Док,

отнюдь, старо как мир:
Код: sql
1.
Select t1.* from t1 left join t2 on t1.f1 = t2.f1 where t2.f1 is null


что, по сути, есть аналог такого:
Код: sql
1.
Select t1.* from t1 where t1.f1 not in (select t2.f1 from t2)


(за NULL в поле t2.f1 пока не говорю.)

Сама по себе конструкция LEFT JOIN + WHERE, отсивающей нашедшие соответствие в джойне записи, и называется в народе LEFT JOIN ANTI. Так как оно по факту выбирает записи из Основной таблицы (LEFT JOIN), не нашедшие себе соответствия в левоприсоединяемой таблице (ANTI)
...
Рейтинг: 0 / 0
Зависает запрос
    #38543321
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый Э - Эх называется в народе LEFT JOIN ANTI
про "народ" вы сочиняете.
...
Рейтинг: 0 / 0
Зависает запрос
    #38543327
kdv,

ну, сочиняю не я, допустим, а комитет ANSI. А знать или не знать стандарт - это уже личное дело каждого.
...
Рейтинг: 0 / 0
Зависает запрос
    #38543385
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый Э - Эх,

ok, значит я не в тех кругах вращаюсь.
Нашел вот что
http://technet.microsoft.com/ru-ru/library/ms191171(v=sql.105).aspx
ну и да, ANTI JOIN действительно гуглится, но не как "стандарт ANSI", а именно как это самое определение выборки "несовпадающих" столбцов.

если у вас есть доказательство, что это термин ANSI - приведите пожалуйста.

p.s. про свойства такого запроса я в курсе как минимум лет 15. наиболее удобный способ найти несовпадения в битых базах у таблиц, связанных по FK.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Зависает запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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