powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / firebird 2.5 разница полей timestamp соседних строк
11 сообщений из 11, страница 1 из 1
firebird 2.5 разница полей timestamp соседних строк
    #40022679
SilverShield
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день! Коллеги, буду благодарен за совет.
Есть таблица вида (для удобства сократил ее)
Код: sql
1.
2.
3.
4.
5.
CREATE TABLE T1 (
    ID           INTEGER NOT NULL,
    DATETIME     TIMESTAMP,
    PATH         VARCHAR(1000)
);



Мне надо в хранимой процедуре выдать содержимое таблицы, плюс сделать вычисления, для которых мне надо иметь значение datetime текущей и следующей строки. Вычисления это получить разницу значений datetime этих строк и из другой таблицы сделать выборку значений, которые больше datetime текущей строки, но меньше datetime следующей строки.

Реализую так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
for select id, datetime, path from T1
where (datetime >= :dtbeg) and (datetime <= :dtend)
order by datetime 
into :tid2, :OEVENTTIME, :OPATH do
begin
            NEXT_EVENTTIME = null;
            select first 1 datetime from T1 where (datetime >= :oeventtime)
                and (datetime <= :dtend) and (id > :tid2)
                order by datetime, id into :NEXT_EVENTTIME;
            if (NEXT_EVENTTIME is null) then NEXT_EVENTTIME = :dtend;

           -- тут вычисления
           OATIME = (:NEXT_EVENTTIME - :OEVENTTIME)*24*60*60;
           tidle = 0;     
           execute procedure COUNT_FROM_OTHER_TABLE(:OEVENTTIME, :NEXT_EVENTTIME) returning_values :tidle;
           OATIME = :OATIME - :tidle;

           suspend;
end



Т.е. для каждой строки делаю select first 1 следующую строку по времени.
На поле datetime настроен индекс, поэтому все чтения получаются по индексу.

В таблице Т1 порядка 2 млн записей. Под условия с которыми запускается хранимая процедура попадает порядка 1000 записей

Хочу повысить производительность процедуры. Есть ли способ сделать лучше чем внутренними select first ?

В приложении я бы просто загнал значения таблицы в массив и обращался к элементам по индексу. В хранимой процедуре в FB 2.5 как я понимаю массивы я не смогу использовать так.

Как можно это реализовать более оптимально? Заранее благодарен за конструктивные ответы и конструктивную критику.
...
Рейтинг: 0 / 0
firebird 2.5 разница полей timestamp соседних строк
    #40022693
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SilverShield,

индекс по datetime + id есть?
...
Рейтинг: 0 / 0
firebird 2.5 разница полей timestamp соседних строк
    #40022703
SilverShield
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdv, благодарю за вопрос!
Индексы на них раздельные...
На поле id поставлен PRIMARY KEY, а на поле datetime просто индекс.

Точнее, сама таблица имеет больше полей, в частности поле ctype типа int. И индекс идет по полям ctype и datetime (это наиболее частое сочетание при других выборках из таблицы).

Итого: на поле id - primary key.
на полях ctype, datetime - индекс.

Сделать еще один индекс именно на поля id, datetime ?
...
Рейтинг: 0 / 0
firebird 2.5 разница полей timestamp соседних строк
    #40022705
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как известно, количество чтений данных в подавляющем большинстве задач, как правило, на пару порядков минимум превышает количество их записи/модификаций. Отсюда вытекают разнообразные архитектурные решения, позволяющие перенести рутинную постоянную нагрузку с чтения на запись в качестве однократной или выполняющейся счётное на пальцах двух ног количество раз. В данном случае - ввести в таблицу поле nextdatetime и вести его на триггерах этим самым first.
...
Рейтинг: 0 / 0
firebird 2.5 разница полей timestamp соседних строк
    #40022711
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SilverShield

Сделать еще один индекс именно на поля id, datetime ?


Композитный индекс может быть оптимальнее раздельных по полям, но он естественным образом не работает при условиях/сортировках, не включающих поля, предшествующие потребным запросу в этом индексе. Так что исходя из характера запросов надо ещё подумать - id, datetime или datetime, id.
...
Рейтинг: 0 / 0
firebird 2.5 разница полей timestamp соседних строк
    #40022738
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SilverShield,

Отсортируй по DATETIME по убыванию
и обрабатывай их последовательно запоминая DATETIME
текущей записи для использования в следующей
...
Рейтинг: 0 / 0
firebird 2.5 разница полей timestamp соседних строк
    #40022743
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SilverShieldСделать еще один индекс именно на поля id, datetime ?
рекомендую посмотреть видео про оптимизацию order vs sort, не смотря на то что у вас 2.5, а видео про 3.0
https:// www.youtube.com/watch?v=vZUj0j156dg

там расписано как работает order by без индекса или с индексом.

Насчет индекса - я умышленно написал не про "id, datetime", а про "datetime + id", именно так у вас написано в order by, и именно в таком порядке эти столбцы должны быть указаны в композитном индексе для использования в order by.
First или нет, без соответствующего индекса по столбцам order by будут отсортированы ВСЕ записи, попадающие под where, а уже потом после first 1 сервер просто прекратит дальше выбирать записи.
...
Рейтинг: 0 / 0
firebird 2.5 разница полей timestamp соседних строк
    #40022748
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Старый плюшевый мишкаТак что исходя из характера запросов надо ещё подумать - id, datetime или datetime, id.
нечего там думать. по id у него индекс есть, по datetime тоже. Значит с оптимизацией where всё замечательно. Другое дело, сколько записей выбирается. Если много, то индекс по datetime+id поможет (имея в виду order by).
А вот индекс id+datetime нахрен не нужен, совершенно (опять же, исходя из условий в where).
...
Рейтинг: 0 / 0
firebird 2.5 разница полей timestamp соседних строк
    #40022851
SilverShield
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Благодарю за ответы и видео по оптимизации!
По индексу в процессе эксперимента. Пока не понимаю почему, но с индексом datetime, id количество чтений увеличивается в 5 раз. С 315348 до 1617587. Отключаю индекс - снова 315348. Если же id убрать из условия order (для соответствия уже имеющемуся индексу), то ожидаемо количество чтений уменьшается, до 85439.
...
Рейтинг: 0 / 0
firebird 2.5 разница полей timestamp соседних строк
    #40022857
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SilverShield,

план запроса надо смотреть. ну и курить
http://www.ibase.ru/dataaccesspaths/

и смотреть видео про оптимизатор
https:// www.youtube.com/watch?v=0KITHwMNDtw

и вообще.
...
Рейтинг: 0 / 0
firebird 2.5 разница полей timestamp соседних строк
    #40024054
SilverShield
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdv, благодарю за подсказки и направления изучения! Восхищаюсь Вашим опытом
Коллеги, Благодарю всех за участие и советы!
По результатам оптимизации и экспериментов с индексами сократил время выполнения процедуры (в полном варианте) в 5 раз.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / firebird 2.5 разница полей timestamp соседних строк
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]