Конференция "Базы" » Еще вопрос по оптимизации запроса. [FB 1.0]
 
  • Дмитрий Белькевич (10.06.10 22:33) [0]
    Есть две таблицы - 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.
  • Игорь Шевченко © (10.06.10 22:41) [1]
    курсор для связки таблиц и DELETE WHERE CURRENT OF ?


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


    странно.
  • Дмитрий Белькевич (10.06.10 23:07) [2]

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


    ХП + цикл с курсором по images_sel?
  • Дмитрий Белькевич (10.06.10 23:08) [3]
    >Таблица image_uid состоит из одного поля - image_uid.

    читать: Таблица images_sel состоит из одного поля - image_uid.
  • turbouser © (10.06.10 23:13) [4]

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


    > where image_uid in (select

    IN лучше не использовать. тормоза обеспечены. тем более в fb1.0
    EXISTS - должно помочь
  • Игорь Шевченко © (10.06.10 23:27) [5]
    Дмитрий Белькевич   (10.06.10 23:07) [2]

    Цикл с курсором по связке таблиц.
  • Дмитрий Белькевич (11.06.10 10:02) [6]

    > 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)
  • Кщд © (11.06.10 10:13) [7]
    >Дмитрий Белькевич   (11.06.10 10:02) [6]
    >без изменений - читается весь images неиндексированно
    разумеется

    удаление в цикле по images_sel, как Вам предлагали ранее, попробовали?
    каков результат?
  • Дмитрий Белькевич (11.06.10 13:38) [8]

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


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

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

    ничего не подходит.
  • Кщд © (11.06.10 15:02) [9]
    >Дмитрий Белькевич   (11.06.10 13:38) [8]
    >Синтаксис не знаю.
    ibase.ru
  • turbouser © (11.06.10 15:03) [10]
    for select image_uid from images_sel into :uid
    do
     begin
       delete from images where image_uid = :uid
     end

  • Дмитрий Белькевич (11.06.10 16:28) [11]

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


    Таки да. Всем спасибо за обсуждение.
  • Игорь Шевченко © (11.06.10 20:36) [12]
    Все-таки недоделанный он, этот Firebird. Нормальные СУБД умеют обрабатывать запрос в [0] (с IN) быстро и безболезененно
  • turbouser © (11.06.10 21:50) [13]

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


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

    Доделанный уже. FB1.0 это, по сути тот же IB6
  • Игорь Шевченко © (11.06.10 22:30) [14]
    turbouser ©   (11.06.10 21:50) [13]

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

    И с тех пор у него проблема с оптимизацией подзапросов.
  • turbouser © (11.06.10 22:31) [15]

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

    в текущих версиях вроде нормально
  • Игорь Шевченко © (11.06.10 23:55) [16]
    turbouser ©   (11.06.10 22:31) [15]

    Я рад за разработчиков, но мы как в свое время наткнулись, так избегали писать запросы определенного вида в системе, ориентированной на IB6/FBx. Не переписывать же каждый раз запросы при появлении новых версий СУБД, верно ?
  • Дмитрий Белькевич (13.06.10 00:27) [17]
    Это всё я в 2.1.1 тестировал, если что. Просто мне совместимость с 1.0 нужна. А так - то и в 2.1.1 работает всё так же.
  • Petr V. Abramov © (15.06.10 16:12) [18]

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

    а оптимизатор об этом знает?
    может, статистики собрать?
 
Конференция "Базы" » Еще вопрос по оптимизации запроса. [FB 1.0]
Есть новые Нет новых   [134433   +22][b:0][p:0.001]