Разная производиетльность при фактически одинаковом плане
Добавлено: 09 авг 2009, 22:21
Была у меня простая табличка (smena) - время работы людей в системе:
userid integer
starttime timestamp
endtime timestamp
по обоим - индексы
и захотелось мне изжить у себя в системе timestamp'ы, жившие в ней со стародавних времен (для всех новых дел использую время в секундах с 2000 года, INTEGER)
добавил я для начала новые поля
starttm integer
endtm integer
сконвертировал данные, сохранив пока для совместимости и старые, переделал запросы и стал тестировать все ...
В процессе тестирования обнаружилось, что один из запросов стал с INTEGER выполняться медленее, чем с timestamp, и в статистике количество fetch радикально другое, при том, что планы - индентичные
вариант с integer:
select b.username,count(*)
from smena a,users b
where b.id=a.userid
and a.endtm >= 284688000
and a.starttm < 284774400
group by b.username order by b.username
PLAN SORT (JOIN (A INDEX (SMENA_STARTTM, SMENA_ENDTM), B INDEX (USER_ID)))
485583 fetches, 0 marks, 0 reads, 0 writes.
0 inserts, 0 updates, 0 deletes, 161981 index, 0 seq.
с timetamp:
select b.username,count(*)
from smena a,users b
where b.id=a.userid
and a.endtime >= '2009-01-08'
and a.starttime < '2009-01-09'
group by b.username order by b.username
PLAN SORT (JOIN (A INDEX (SMENA_STARTTIME, SMENA_ENDTIME), B INDEX (USER_ID)))
2940 fetches, 0 marks, 0 reads, 0 writes.
0 inserts, 0 updates, 0 deletes, 754 index, 0 seq.
На самом деле в оригинале запросы были чуть сложнее, но я их упростил для тестирования.
Имена индексов - это имятаблицы_имяполя
С татистику обновлял. Куда смотреть - не понимаю просто.
userid integer
starttime timestamp
endtime timestamp
по обоим - индексы
и захотелось мне изжить у себя в системе timestamp'ы, жившие в ней со стародавних времен (для всех новых дел использую время в секундах с 2000 года, INTEGER)
добавил я для начала новые поля
starttm integer
endtm integer
сконвертировал данные, сохранив пока для совместимости и старые, переделал запросы и стал тестировать все ...
В процессе тестирования обнаружилось, что один из запросов стал с INTEGER выполняться медленее, чем с timestamp, и в статистике количество fetch радикально другое, при том, что планы - индентичные
вариант с integer:
select b.username,count(*)
from smena a,users b
where b.id=a.userid
and a.endtm >= 284688000
and a.starttm < 284774400
group by b.username order by b.username
PLAN SORT (JOIN (A INDEX (SMENA_STARTTM, SMENA_ENDTM), B INDEX (USER_ID)))
485583 fetches, 0 marks, 0 reads, 0 writes.
0 inserts, 0 updates, 0 deletes, 161981 index, 0 seq.
с timetamp:
select b.username,count(*)
from smena a,users b
where b.id=a.userid
and a.endtime >= '2009-01-08'
and a.starttime < '2009-01-09'
group by b.username order by b.username
PLAN SORT (JOIN (A INDEX (SMENA_STARTTIME, SMENA_ENDTIME), B INDEX (USER_ID)))
2940 fetches, 0 marks, 0 reads, 0 writes.
0 inserts, 0 updates, 0 deletes, 754 index, 0 seq.
На самом деле в оригинале запросы были чуть сложнее, но я их упростил для тестирования.
Имена индексов - это имятаблицы_имяполя
С татистику обновлял. Куда смотреть - не понимаю просто.