Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Еще вопрос по оптимизации запроса. [FB 1.0]


Дмитрий Белькевич ©   (2010-06-10 22:33:00) 

Есть две таблицы - images и images_sel.

Таблицы объединены по пк images.image_uid и внешнему ключу images_sel.image_uid. Таблица image_uid состоит из одного поля - image_uid.

Нужно придумать запрос, который бы удаял записи в images, которые присутствуют в images_sel.

Делаю так:

delete from images where image_uid in (select image_uid from images_sel)

медленно, из-за PLAN (IMAGES NATURAL)

Вынести в отдельное поле в images не предлагать, как раз от этого пытаюсь избавиться.

Записей в images может быть десятки миллионов, в images_sel обычно 10-100.


Petr V. Abramov   (2010-06-15 16:12:00) [1]


> Записей в images может быть десятки миллионов, в images_sel
> обычно 10-100.

а оптимизатор об этом знает?
может, статистики собрать?


Дмитрий Белькевич   (2010-06-13 00:27:00) [2]

Это всё я в 2.1.1 тестировал, если что. Просто мне совместимость с 1.0 нужна. А так - то и в 2.1.1 работает всё так же.


Игорь Шевченко   (2010-06-11 23:55:00) [3]

turbouser ©   (11.06.10 22:31) [15]

Я рад за разработчиков, но мы как в свое время наткнулись, так избегали писать запросы определенного вида в системе, ориентированной на IB6/FBx. Не переписывать же каждый раз запросы при появлении новых версий СУБД, верно ?


turbouser   (2010-06-11 22:31:00) [4]


> Игорь Шевченко ©   (11.06.10 22:30) [14]

в текущих версиях вроде нормально


Игорь Шевченко   (2010-06-11 22:30:00) [5]

turbouser ©   (11.06.10 21:50) [13]

Это я в курсе слегка. FB появился, когда Borland исходники IB6 выложил в открытый доступ.

И с тех пор у него проблема с оптимизацией подзапросов.


turbouser   (2010-06-11 21:50:00) [6]


> Игорь Шевченко ©   (11.06.10 20:36) [12]


> Все-таки недоделанный он, этот Firebird.

Доделанный уже. FB1.0 это, по сути тот же IB6


Игорь Шевченко   (2010-06-11 20:36:00) [7]

Все-таки недоделанный он, этот Firebird. Нормальные СУБД умеют обрабатывать запрос в [0] (с IN) быстро и безболезененно


Дмитрий Белькевич   (2010-06-11 16:28:00) [8]


> for select image_uid from images_sel into :uiddo  begin
>    delete from images where image_uid = :uid  end


Таки да. Всем спасибо за обсуждение.


turbouser   (2010-06-11 15:03:00) [9]

for select image_uid from images_sel into :uid
do
 begin
   delete from images where image_uid = :uid
 end


Кщд   (2010-06-11 15:02:00) [10]

>Дмитрий Белькевич   (11.06.10 13:38) [8]
>Синтаксис не знаю.
ibase.ru


Дмитрий Белькевич   (2010-06-11 13:38:00) [11]


> удаление в цикле по images_sel, как Вам предлагали ранее,
>  попробовали?


Синтаксис не знаю. Попробовал несколько отсюда:

http://google.com/codesearch?hl=ru&start=70&sa=N&filter=0&q=%22WHERE+CURRENT+OF%22+lang:sql

ничего не подходит.


Кщд   (2010-06-11 10:13:00) [12]

>Дмитрий Белькевич   (11.06.10 10:02) [6]
>без изменений - читается весь images неиндексированно
разумеется

удаление в цикле по images_sel, как Вам предлагали ранее, попробовали?
каков результат?


Дмитрий Белькевич   (2010-06-11 10:02:00) [13]


> EXISTS - должно помочь


Пробую так:


delete from images where EXISTS (select image_uid from images_sel where images_sel.image_uid = images.image_uid)


без изменений - читается весь images неиндексированно

PLAN (IMAGES_SEL INDEX (FK_IMAGES_SEL_1))
PLAN (IMAGES NATURAL)


Игорь Шевченко   (2010-06-10 23:27:00) [14]

Дмитрий Белькевич   (10.06.10 23:07) [2]

Цикл с курсором по связке таблиц.


turbouser   (2010-06-10 23:13:00) [15]


> Дмитрий Белькевич   (10.06.10 22:33)  


> where image_uid in (select

INлучше не использовать. тормоза обеспечены. тем более в fb1.0
EXISTS - должно помочь


Дмитрий Белькевич   (2010-06-10 23:08:00) [16]

>Таблица image_uid состоит из одного поля - image_uid.

читать: Таблица images_sel состоит из одного поля - image_uid.


Дмитрий Белькевич   (2010-06-10 23:07:00) [17]


> курсор для связки таблиц и DELETE WHERE CURRENT OF ?


ХП + цикл с курсором по images_sel?


Игорь Шевченко   (2010-06-10 22:41:00) [18]

курсор для связки таблиц и DELETE WHERE CURRENT OF ?


> delete from images where image_uid in (select image_uid
> from images_sel)
>
> медленно, из-за PLAN (IMAGES NATURAL)


странно.


Наверх

Титульная страница Поиск, карта сайта Написать письмо