powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Помогите оптимизировать запрос
14 сообщений из 14, страница 1 из 1
Помогите оптимизировать запрос
    #38772504
fedorov2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть примитивный запрос, вида:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
for select s_id 
from sTable 
where Fld=1
into sid
do begin

delete from mytable mt
where mt.row_id not in (select rt.row_id from rowtable rt where rt.s_id=:sid)

...
end;
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #38772505
fedorov2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возможно ли его оптимизировать, ну уж очень долго выполняется
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #38772507
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Удалить из table_two все записи, которых (при отборе по условию) нет в table_one"?
merge.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #38772512
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovmergeБез поправки на (неуказанную) версию сервера.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #38772514
fedorov2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. SidorovBasil A. SidorovmergeБез поправки на (неуказанную) версию сервера.
FB 2.5 у меня
1. что имелось ввиду под "merge"?
2. table_two это какая, вот такой у меня запрос, если быть точным:

for select id1, id2
from Table1
where Fld1=1
into :lk_id1, lk_id2
do begin

delete from table2 t2
where (t2.id1=:lk_id1) and (t2.q_id not in (select t3.q_id from table3 t3 where t3.id2=:lk_id2))

...
end;
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #38772515
fedorov2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Забыл выделить в подсветку

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
for select id1, id2
from Table1
where Fld1=1
into :lk_id1, lk_id2
do begin

delete from table2 t2
where (t2.id1=:lk_id1) and (t2.q_id not in (select t3.q_id from table3 t3 where t3.id2=:lk_id2))

...
end;
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #38772572
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fedorov2012Забыл выделить в подсветку

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
for select id1, id2
from Table1
where Fld1=1
into :lk_id1, lk_id2
do begin

delete from table2 t2
where (t2.id1=:lk_id1) and (t2.q_id not in (select t3.q_id from table3 t3 where t3.id2=:lk_id2))

...
end;



Если правильно понял и нигде не промазал
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
  delete from table2 t2
  where  
    exists (select * from Table1 t1 
               where t1.Fld1=1 
                  and t1.id1=t2.id1 
                  and  not exists (select * from table3 t3 
                                          where t3.id2=t1.id2 
                                              and t3.q_id =t2.q_id
            )

...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #38772618
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fedorov20121. что имелось ввиду под "merge"? http://www.firebirdsql.org/refdocs/langrefupd21-merge.html
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #38772659
Basil A. Sidorov" Удалить из table_two все записи, которых (при отборе по условию) нет в table_one"?
merge.
Каким боком тут можно заюзать Merge, если оно умеет только Update or Insert?
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #38772665
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НиФигаНеПонял,

в тройке моно.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #38774510
fedorov2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
m7m , спасибо - попробую, по результатам отпишусь
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #38775315
fedorov2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fedorov2012 m7m , спасибо - попробую, по результатам отпишусь
поставил эксперимент, на больших данных for select на порядки быстрее выполняется. Так что не удалось оптимизация через exists . Народ какие еще будут предложения
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #38775398
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fedorov2012fedorov2012 m7m , спасибо - попробую, по результатам отпишусь
поставил эксперимент, на больших данных for select на порядки быстрее выполняется. Так что не удалось оптимизация через exists . Народ какие еще будут предложения

Ну таки да, в моём варианте по table2 всегда будет идти натуралом,
а у тебя по всей видимости в table2 на поле id1 построен индекс

зы. покажи планы запросов
Код: sql
1.
2.
delete from mytable mt
  where mt.row_id not in (select rt.row_id from rowtable rt where rt.s_id=:sid)


и
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
  delete from table2 t2
  where  
    exists (select * from Table1 t1 
               where t1.Fld1=1 
                  and t1.id1=t2.id1 
                  and  not exists (select * from table3 t3 
                                          where t3.id2=t1.id2 
                                              and t3.q_id =t2.q_id
            )
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #38776116
Фотография TPAKTOPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если не FB не 3.0,
1. insert into <временную таблицу> select <ID удаляемих>
2. удалять на совпадение с временной таблицей
Будет в 10-100 раз лучше, чем not exists .

или FOR переделать так, что би нету not in

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


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