Запросы, планы, оптимизация запросов, ...
Модераторы: 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.
Удивитесь! Не создал!
Ну уж никак не 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 (не помню как оптимизируется "<" во втором сегменте...).
Отлично.
Спасибо!
Сейчас попробую...

-
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 сек
* Далее запускаю процедуру и жду небольшое (?) время отработки
Правильно?
-
Kyarginski
- Сообщения: 36
- Зарегистрирован: 12 дек 2006, 12:59
Сообщение
Kyarginski » 13 дек 2006, 17:03
Подозрительно долго создавался индекс. Хорошо бы посмотреть на его статистику...
Вот вот! Всё это очень подозрительно!
Статистика 0.0000001140927992
-
Kyarginski
- Сообщения: 36
- Зарегистрирован: 12 дек 2006, 12:59
Сообщение
Kyarginski » 13 дек 2006, 17:34
Выполняю вышеуказанную процедуру...
Уже почти 2 часа... полёт нормальный...
15 млн - неделю будет перелопачивать что ли?

-
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
Один умывает руки...
Больше никто помочь не может?
-
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?
-
dimitr
- Разработчик Firebird
- Сообщения: 888
- Зарегистрирован: 26 окт 2004, 16:20
Сообщение
dimitr » 14 дек 2006, 14:30
а размер страницы не 1К часом?