Промежуточный commit

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 13 дек 2006, 13:03

Dimitry Sibiryakov писал(а):Да этот-то индекс скорее всего ерунда
Я для себя, моделирую ситуацию.
На 400000 записей у меня удаление за 8 секунд (локальный SS на моей машине), щас пару мульонов накидаю, посмотрю, сколько это должно занимать.
Ну уж никак не 6 часов - адназначна.

Kyarginski
Сообщения: 36
Зарегистрирован: 12 дек 2006, 12:59

Сообщение Kyarginski » 13 дек 2006, 13:15

Да еще я не удивлюсь, если автор создал еще по индексу в дубль к PK и FK.
Удивитесь! Не создал! 8)
Ну уж никак не 6 часов - адназначна.
Да уж... Это точно...

Что, совсем все индексы "убить" кроме PK?

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 13 дек 2006, 13:45

Удивитесь! Не создал!
Удивился.
Что, совсем все индексы "убить" кроме PK?
Угу. Можешь оставить один по GroupField. Хотя его, наверное, стоит заменить на GroupField, aDate DESC (не помню как оптимизируется "<" во втором сегменте...).

Кстати, можно попробовать примерно тот же индекс, но ASC, с запросом

Код: Выделить всё

DELETE FROM Table1 T1
 WHERE EXISTS
  (SELECT * FROM Table1 T2
   WHERE T1.GroupField=T2.GroupField AND T2.aDate>T1.aDate)

Kyarginski
Сообщения: 36
Зарегистрирован: 12 дек 2006, 12:59

Сообщение Kyarginski » 13 дек 2006, 14:22

Угу. Можешь оставить один по GroupField. Хотя его, наверное, стоит заменить на GroupField, aDate DESC (не помню как оптимизируется "<" во втором сегменте...).
Отлично.
Спасибо!
Сейчас попробую... 8)

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 13 дек 2006, 15:27

Dimitry Sibiryakov писал(а): Угу. Можешь оставить один по GroupField.
Я бы как раз не советовал. Нет, если он нужен для каких-то запросов, то ради бога, а вот из группировки исключить хинтом. Он же полный фетч делает. А вот индексы where для delete - это надо посмотреть. Там скорее всего усечение приличное будет от них получаться. Я тоже склоняюсь к тому, что если к индексам с умом подойти, то на всё про всё уйдёт пара минут, со сборкой мусора опосля может пяток.

Kyarginski
Сообщения: 36
Зарегистрирован: 12 дек 2006, 12:59

Сообщение Kyarginski » 13 дек 2006, 15:40

Во, сколько советов!
Супер!

Итак...
  • * в начале отключаю все индексы (кроме PK) - сделал
    * создаю процедуру для удаления - сделал

    Код: Выделить всё

    create procedure DeleteAllExceptMaxDate 
    as 
      declare variable aDate date; 
      declare variable aGroupField varchar(18); 
    begin 
      for select max(MyDATE), GroupField 
        from MY_TABLE 
        group by GroupField 
        into aDate, aGroupField 
      do 
        delete from MY_TABLE 
          where GroupField = :aGroupField and MyDATE < :aDate; 
    end;
    
    * создаю индекс

    Код: Выделить всё

    create desc my_index_4del_idx on MY_TABLE (GroupField, MyDate);
    
    индекс создаётся уже почти час!
    О! Создался за 1 ч 2 мин и 3 сек :)
    * Далее запускаю процедуру и жду небольшое (?) время отработки
Правильно?

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 13 дек 2006, 16:05

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

Kyarginski
Сообщения: 36
Зарегистрирован: 12 дек 2006, 12:59

Сообщение Kyarginski » 13 дек 2006, 17:03

Подозрительно долго создавался индекс. Хорошо бы посмотреть на его статистику...
Вот вот! Всё это очень подозрительно! 8)

Статистика 0.0000001140927992

Kyarginski
Сообщения: 36
Зарегистрирован: 12 дек 2006, 12:59

Сообщение Kyarginski » 13 дек 2006, 17:34

Выполняю вышеуказанную процедуру...
Уже почти 2 часа... полёт нормальный...

15 млн - неделю будет перелопачивать что ли? :roll:

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 13 дек 2006, 20:51

Сначала таки полезно слегонца подумать головом над тем, что тебе говорят, и разобраться, а не копипастить код. Разберись сначала с группировкой, а потом гоняй процедуры. Выполни селектный запрос с полным фетчем с индексом и без и почувствуй разницу. Добьёшся десятков секунд - тогда переходи к апдейту. То есть выполни селект по условиям апдейта, посмотри план и время, подумай, пооптимизируй, если хреновый получается, а не запускай чорный ящик с ожиданием у моря погоды. Что за железо-то, кстати, и что за тип поля GroupField? Varchar 150 поди? Индекс действительно создаётся ненормально долго. Всё на одном медленном диске живёт - и ось и база и темп?

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 14 дек 2006, 07:51

Kyarginski писал(а):Статистика 0.0000001140927992
Это не статистика, это селективность (или как бишь ее там)... То, что выводится по 'gstat -i' несколько более информативно.

Kyarginski
Сообщения: 36
Зарегистрирован: 12 дек 2006, 12:59

Сообщение Kyarginski » 14 дек 2006, 11:14

По поводу отработки ф-ии - более 12-ти часов - безрезультатно!
Думаю, какие бы не были индексы и планы - должно бы уже было отработать! :(

Начинаю грешить уже на посторонние факторы - типа фаервола (Norton Internet Security) и т.п.
Что за железо-то, кстати, и что за тип поля GroupField?
Железо?
О-о-о...
Это отдельная песня...
Ноутбук с процессором Intel Core Duo
памяти 1 ГБ
диск (вероятно) 5200 об.

Сервер установлен локально.

Запросы SELECT отрабатывают быстро.

Тип поля GroupField - varchar( 18 ) ...

Kyarginski
Сообщения: 36
Зарегистрирован: 12 дек 2006, 12:59

Сообщение Kyarginski » 14 дек 2006, 12:45

Да... и ещё сервер работает в режиме Классик.
(Попытка использовать двухъядерность процессора)

Это может как то влиять?

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 14 дек 2006, 12:56

I wash my hands (C)

Kyarginski
Сообщения: 36
Зарегистрирован: 12 дек 2006, 12:59

Сообщение Kyarginski » 14 дек 2006, 13:05

I wash my hands (C)
-1 8)

Один умывает руки...
:wink:

Больше никто помочь не может?

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 14 дек 2006, 13:14

Помоги себе сам. Сначала почитай статьи по оптимизации запросов и использованию индексов. Потом начинай подбирать нужные тебе инндексы. Сначала для селекта (он должен отрабатывать в пределах секунды-двух), потом для делита (он должен быть еще быстрее). Если окажется что требования конфликтуют - подрулишь один из запросов хинтами.

Kyarginski
Сообщения: 36
Зарегистрирован: 12 дек 2006, 12:59

Сообщение Kyarginski » 14 дек 2006, 13:44

Спасибо.

Про хинты где почитать?
И про оптимизацию запросов для FireBird?

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 14 дек 2006, 13:52

Угадай с трех раз. Правильно, http://ibase.ru.

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 14 дек 2006, 14:30

а размер страницы не 1К часом?

Kyarginski
Сообщения: 36
Зарегистрирован: 12 дек 2006, 12:59

Сообщение Kyarginski » 14 дек 2006, 14:51

Размер страницы 16 К

Угадай с трех раз. Правильно, http://ibase.ru.
:) :) :)
Плавали... знаем! (с) :)
Даже на http://ibase.ru/develop.htm заходили...

Про хинты не нашёл... :roll:

Ответить