|
firebird 2.5 разница полей timestamp соседних строк
|
|||
---|---|---|---|
#18+
Добрый день! Коллеги, буду благодарен за совет. Есть таблица вида (для удобства сократил ее) Код: sql 1. 2. 3. 4. 5.
Мне надо в хранимой процедуре выдать содержимое таблицы, плюс сделать вычисления, для которых мне надо иметь значение datetime текущей и следующей строки. Вычисления это получить разницу значений datetime этих строк и из другой таблицы сделать выборку значений, которые больше datetime текущей строки, но меньше datetime следующей строки. Реализую так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Т.е. для каждой строки делаю select first 1 следующую строку по времени. На поле datetime настроен индекс, поэтому все чтения получаются по индексу. В таблице Т1 порядка 2 млн записей. Под условия с которыми запускается хранимая процедура попадает порядка 1000 записей Хочу повысить производительность процедуры. Есть ли способ сделать лучше чем внутренними select first ? В приложении я бы просто загнал значения таблицы в массив и обращался к элементам по индексу. В хранимой процедуре в FB 2.5 как я понимаю массивы я не смогу использовать так. Как можно это реализовать более оптимально? Заранее благодарен за конструктивные ответы и конструктивную критику. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2020, 10:58 |
|
firebird 2.5 разница полей timestamp соседних строк
|
|||
---|---|---|---|
#18+
SilverShield, индекс по datetime + id есть? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2020, 11:40 |
|
firebird 2.5 разница полей timestamp соседних строк
|
|||
---|---|---|---|
#18+
kdv, благодарю за вопрос! Индексы на них раздельные... На поле id поставлен PRIMARY KEY, а на поле datetime просто индекс. Точнее, сама таблица имеет больше полей, в частности поле ctype типа int. И индекс идет по полям ctype и datetime (это наиболее частое сочетание при других выборках из таблицы). Итого: на поле id - primary key. на полях ctype, datetime - индекс. Сделать еще один индекс именно на поля id, datetime ? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2020, 11:53 |
|
firebird 2.5 разница полей timestamp соседних строк
|
|||
---|---|---|---|
#18+
Как известно, количество чтений данных в подавляющем большинстве задач, как правило, на пару порядков минимум превышает количество их записи/модификаций. Отсюда вытекают разнообразные архитектурные решения, позволяющие перенести рутинную постоянную нагрузку с чтения на запись в качестве однократной или выполняющейся счётное на пальцах двух ног количество раз. В данном случае - ввести в таблицу поле nextdatetime и вести его на триггерах этим самым first. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2020, 11:54 |
|
firebird 2.5 разница полей timestamp соседних строк
|
|||
---|---|---|---|
#18+
SilverShield Сделать еще один индекс именно на поля id, datetime ? Композитный индекс может быть оптимальнее раздельных по полям, но он естественным образом не работает при условиях/сортировках, не включающих поля, предшествующие потребным запросу в этом индексе. Так что исходя из характера запросов надо ещё подумать - id, datetime или datetime, id. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2020, 12:00 |
|
firebird 2.5 разница полей timestamp соседних строк
|
|||
---|---|---|---|
#18+
SilverShield, Отсортируй по DATETIME по убыванию и обрабатывай их последовательно запоминая DATETIME текущей записи для использования в следующей ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2020, 12:34 |
|
firebird 2.5 разница полей timestamp соседних строк
|
|||
---|---|---|---|
#18+
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 сервер просто прекратит дальше выбирать записи. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2020, 12:50 |
|
firebird 2.5 разница полей timestamp соседних строк
|
|||
---|---|---|---|
#18+
Старый плюшевый мишкаТак что исходя из характера запросов надо ещё подумать - id, datetime или datetime, id. нечего там думать. по id у него индекс есть, по datetime тоже. Значит с оптимизацией where всё замечательно. Другое дело, сколько записей выбирается. Если много, то индекс по datetime+id поможет (имея в виду order by). А вот индекс id+datetime нахрен не нужен, совершенно (опять же, исходя из условий в where). ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2020, 12:52 |
|
firebird 2.5 разница полей timestamp соседних строк
|
|||
---|---|---|---|
#18+
Благодарю за ответы и видео по оптимизации! По индексу в процессе эксперимента. Пока не понимаю почему, но с индексом datetime, id количество чтений увеличивается в 5 раз. С 315348 до 1617587. Отключаю индекс - снова 315348. Если же id убрать из условия order (для соответствия уже имеющемуся индексу), то ожидаемо количество чтений уменьшается, до 85439. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2020, 17:53 |
|
firebird 2.5 разница полей timestamp соседних строк
|
|||
---|---|---|---|
#18+
SilverShield, план запроса надо смотреть. ну и курить http://www.ibase.ru/dataaccesspaths/ и смотреть видео про оптимизатор https:// www.youtube.com/watch?v=0KITHwMNDtw и вообще. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2020, 18:08 |
|
firebird 2.5 разница полей timestamp соседних строк
|
|||
---|---|---|---|
#18+
kdv, благодарю за подсказки и направления изучения! Восхищаюсь Вашим опытом Коллеги, Благодарю всех за участие и советы! По результатам оптимизации и экспериментов с индексами сократил время выполнения процедуры (в полном варианте) в 5 раз. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2020, 19:41 |
|
|
start [/forum/topic.php?fid=40&fpage=10&tid=1560177]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
57ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
67ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 183ms |
0 / 0 |