|
Скорость SELECT-запроса и составной индекс по INTEGER и TIMESTAMP
|
|||
---|---|---|---|
#18+
Имеется таблица "Транзакции", в которой поля "ID карты" (CARD_ID INTEGER) и "время транзакции" (TRANTIME TIMESTAMP) входят в составной индекс, примерно так: Код: sql 1.
за период с 1.01.2017 по 9.08.2017 в таблице TRAN накоплено 367 тыс. транзакций по 11 тыс. картам, однако по карте с CARD_ID=100 всего лишь 2 транзакции. Если я пишу запрос: Код: sql 1. 2.
то он возвращает 2 транзакции, причем запрос выполняется в среднем 46 мс. При этом IBExpert показывает: Fetches from cache = 1 867 Если в запросе интервал времени небольшой (транзакции были 25 и 29 марта): Код: sql 1. 2.
то запрос выполняется за 0 мс (редко 16 мс). При этом IBExpert показывает: Fetches from cache = 78 Разница - десятки раз! Для меня это оказалось сюрпризом, поскольку я считал, что указание в индексе первым полем CARD_ID сужает интервал поиска и транзакции по другим картам не влияют на скорость выборки по конкретной карте, а по факту выходит, что влияют, и очень здорово. Данная проблема снижения производительности свойственна только Firebird или это общая проблема, свойственная всем СУБД. В версиях Firebird 2.5 и 3.0 ситуация та же? P.S. Версия Firebird 2.1.5 (SuperServer). ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2017, 14:25 |
|
Скорость SELECT-запроса и составной индекс по INTEGER и TIMESTAMP
|
|||
---|---|---|---|
#18+
DmSer, ты действительно считаешь 46 мс повод для беспокойства? Чтобы лучше понять внутреннюю кухню читай http://www.ibase.ru/dataaccesspaths/ ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2017, 14:33 |
|
Скорость SELECT-запроса и составной индекс по INTEGER и TIMESTAMP
|
|||
---|---|---|---|
#18+
DmSer, оба плана используют TRAN_IDX1 и только его? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2017, 14:38 |
|
Скорость SELECT-запроса и составной индекс по INTEGER и TIMESTAMP
|
|||
---|---|---|---|
#18+
Симонов Денисты действительно считаешь 46 мс повод для беспокойства? Потребовалось разработать EXECUTE BLOCK, который должен обработать все транзакции за указанный промежуток времени по каждой карте, а он работает жутко долго. Симонов ДенисЧтобы лучше понять внутреннюю кухню читай http://www.ibase.ru/dataaccesspaths/ Знал, что дадут эту ссылку :) На все случаи жизни. Хорошо, попробую покопаться в этой статье. dimitrоба плана используют TRAN_IDX1 и только его? Фантастика! Обнаружил, что у меня в SQL есть еще ORDER BY по полю TRANTIME. Убрал его, запрос стал выполняться моментально. По полю TRANTIME есть отдельный индекс :) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2017, 14:57 |
|
Скорость SELECT-запроса и составной индекс по INTEGER и TIMESTAMP
|
|||
---|---|---|---|
#18+
DmSer, +0 в выражении сортировки отключит тебе индекс ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2017, 14:59 |
|
Скорость SELECT-запроса и составной индекс по INTEGER и TIMESTAMP
|
|||
---|---|---|---|
#18+
DmSerОбнаружил, что у меня в SQL есть еще ORDER BY по полю TRANTIME. и план небось был (TRAN ORDER <индекс по TRANTIME>)? Что за привычка утаивать планы, телепатию нам прокачивать? DmSerУбрал его, запрос стал выполняться моментально достаточно ORDER BY TRANTIME+0 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2017, 15:02 |
|
Скорость SELECT-запроса и составной индекс по INTEGER и TIMESTAMP
|
|||
---|---|---|---|
#18+
+0 в выражении сортировки отключит тебе индекс Да, помогло! Еще, как оказалось, при сортировке по полю DATA использовался составной индекс, включающий в себя 5 полей. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2017, 15:02 |
|
|
start [/forum/topic.php?fid=40&msg=39502644&tid=1561465]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
174ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
36ms |
get tp. blocked users: |
1ms |
others: | 365ms |
total: | 616ms |
0 / 0 |