select к большой таблице по временному диапазону

Модераторы: kdv, CyberMax

Ответить
Ork Yason
Сообщения: 40
Зарегистрирован: 26 янв 2006, 15:07

select к большой таблице по временному диапазону

Сообщение Ork Yason » 13 мар 2012, 19:05

господа, помогите...

есть база для ДХЦП, таблица leases, где хранятся выданные лизы

Код: Выделить всё

CODE         INTEGER NOT NULL,
DT           TIMESTAMP NOT NULL,
E_DT         TIMESTAMP NOT NULL,
IP           VARCHAR(15),
MAC          VARCHAR(12) NOT NULL,
PORT_NO      INTEGER,
SWITCH_MAC   VARCHAR(12),
CODE_SWITCH  INTEGER,
CODE_NET     INTEGER
регулярно про продлении лизы выполняется запрос вида:

Код: Выделить всё

select max(e_dt)
from leases l
where l.mac = :user_mac and ip <> '0.0.0.0' and l.port_no = :port_no
   and l.dt <= current_timestamp and l.e_dt > current_timestamp
есть индекс на поля mac, ip, port_no, dt, e_dt
он используется, но кол-во чтений к таблице при запросе равно кол-ву строк с данным маком
т.е. я так понимаю он нашел все строки с маком, а потом ищет среди них максимальную дату

это пока все на стадии тестирования, т.е. можно поменять все...

может кто подскажет, может использовать другую логику и структуру - потому как на рабочем объеме сервер загнется очень быстро

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: select к большой таблице по временному диапазону

Сообщение kdv » 14 мар 2012, 00:25

при поиске на неравенство индекс, разумеется, не используется. Он используется только при =, <, >, >=, <=, и то, если его селективность достаточная, и нет других индексов (и условий выборки) с более высокой селективностью.
есть индекс на поля mac, ip, port_no, dt, e_dt
еще хуже. такой индекс будет использоваться только если
- поиск по mac на равенство, больше или меньше
- поиск по mac на равенство, по ip на равенство, больше, меньше
- поиск по mac на равенство, по ip на равенство, по port_no на равенство, больше, меньше

именно в таком порядке. У вас поиск по второму сегменту композитного индекса (это столбец ip) на неравенство, значит сервер может использовать индекс только для поиска mac, а дальше все перебирает уже по записям.

В общем, или создайте несколько одиночных индексов (по одному на столбец, который используется в where), или создайте ваш композитный индекс с другим порядком столбцов.

Ork Yason
Сообщения: 40
Зарегистрирован: 26 янв 2006, 15:07

Re: select к большой таблице по временному диапазону

Сообщение Ork Yason » 14 мар 2012, 10:36

спасибо, Дмитрий, буду пробовать

Ответить