powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Скорость SELECT-запроса и составной индекс по INTEGER и TIMESTAMP
8 сообщений из 8, страница 1 из 1
Скорость SELECT-запроса и составной индекс по INTEGER и TIMESTAMP
    #39502611
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеется таблица "Транзакции", в которой поля "ID карты" (CARD_ID INTEGER) и "время транзакции" (TRANTIME TIMESTAMP) входят в составной индекс, примерно так:
Код: sql
1.
CREATE INDEX TRAN_IDX1 ON TRAN (CARD_ID, TRANTIME);



за период с 1.01.2017 по 9.08.2017 в таблице TRAN накоплено 367 тыс. транзакций по 11 тыс. картам, однако по карте с CARD_ID=100 всего лишь 2 транзакции.

Если я пишу запрос:

Код: sql
1.
2.
SELECT * FROM TRAN WHERE CARD_ID=100 AND 
TRANTIME BETWEEN '2017-01-01' AND '2017-08-09'



то он возвращает 2 транзакции, причем запрос выполняется в среднем 46 мс.
При этом IBExpert показывает:
Fetches from cache = 1 867


Если в запросе интервал времени небольшой (транзакции были 25 и 29 марта):
Код: sql
1.
2.
SELECT * FROM TRAN WHERE CARD_ID=100 AND 
TRANTIME BETWEEN '2017-03-25' and '2017-03-30'



то запрос выполняется за 0 мс (редко 16 мс).
При этом IBExpert показывает:
Fetches from cache = 78

Разница - десятки раз!

Для меня это оказалось сюрпризом, поскольку я считал, что указание в индексе первым полем CARD_ID сужает интервал поиска и транзакции по другим картам не влияют на скорость выборки по конкретной карте, а по факту выходит, что влияют, и очень здорово.

Данная проблема снижения производительности свойственна только Firebird или это общая проблема, свойственная всем СУБД. В версиях Firebird 2.5 и 3.0 ситуация та же?

P.S. Версия Firebird 2.1.5 (SuperServer).
...
Рейтинг: 0 / 0
Скорость SELECT-запроса и составной индекс по INTEGER и TIMESTAMP
    #39502621
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer,

ты действительно считаешь 46 мс повод для беспокойства?

Чтобы лучше понять внутреннюю кухню читай http://www.ibase.ru/dataaccesspaths/
...
Рейтинг: 0 / 0
Скорость SELECT-запроса и составной индекс по INTEGER и TIMESTAMP
    #39502626
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer,

оба плана используют TRAN_IDX1 и только его?
...
Рейтинг: 0 / 0
Скорость SELECT-запроса и составной индекс по INTEGER и TIMESTAMP
    #39502644
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисты действительно считаешь 46 мс повод для беспокойства?


Потребовалось разработать EXECUTE BLOCK, который должен обработать все транзакции за указанный промежуток времени по каждой карте, а он работает жутко долго.

Симонов ДенисЧтобы лучше понять внутреннюю кухню читай http://www.ibase.ru/dataaccesspaths/

Знал, что дадут эту ссылку :)
На все случаи жизни.
Хорошо, попробую покопаться в этой статье.

dimitrоба плана используют TRAN_IDX1 и только его?


Фантастика!
Обнаружил, что у меня в SQL есть еще ORDER BY по полю TRANTIME.
Убрал его, запрос стал выполняться моментально.
По полю TRANTIME есть отдельный индекс :)
...
Рейтинг: 0 / 0
Скорость SELECT-запроса и составной индекс по INTEGER и TIMESTAMP
    #39502648
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer,

+0 в выражении сортировки отключит тебе индекс
...
Рейтинг: 0 / 0
Скорость SELECT-запроса и составной индекс по INTEGER и TIMESTAMP
    #39502651
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSerОбнаружил, что у меня в SQL есть еще ORDER BY по полю TRANTIME.
и план небось был (TRAN ORDER <индекс по TRANTIME>)? Что за привычка утаивать планы, телепатию нам прокачивать?

DmSerУбрал его, запрос стал выполняться моментально
достаточно ORDER BY TRANTIME+0
...
Рейтинг: 0 / 0
Скорость SELECT-запроса и составной индекс по INTEGER и TIMESTAMP
    #39502652
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
+0 в выражении сортировки отключит тебе индекс

Да, помогло!

Еще, как оказалось, при сортировке по полю DATA использовался составной индекс, включающий в себя 5 полей.
...
Рейтинг: 0 / 0
Скорость SELECT-запроса и составной индекс по INTEGER и TIMESTAMP
    #39502659
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что за привычка утаивать планы, телепатию нам прокачивать?

Сорри!

+1 тебе к телепатии :)
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Скорость SELECT-запроса и составной индекс по INTEGER и TIMESTAMP
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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