Почему не используются индексы при запросе?

Рейтинг: 1Ответов: 2Опубликовано: 17.04.2015

Есть таблица packets в Firebird 2.1.5:

CREATE TABLE PACKETS (
TS        TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
FILTERID  SMALLINT NOT NULL,
PROTO     SMALLINT,
SRC_IP    CHAR(16),
SRC_PORT  INTEGER,
DST_IP    CHAR(16),
DST_PORT  INTEGER,
SENT      INTEGER,
RECV      INTEGER,
ID        INTEGER NOT NULL);
ALTER TABLE PACKETS ADD CONSTRAINT PK_PACKETS PRIMARY KEY (ID);

Для поля ID при создании первичного ключа был создан индекс PK_PACKETS. Есть запрос для подсчета количества строк в таблице:

select count(id) from packets p

а это его план:

PLAN (P NATURAL)

Как видно, индекс не используется и запрос будет выполняться очень долго. Если в запрос добавить условие на поле id, то индекс будет использоваться:

select count(id) from packets p where p.id>0;
PLAN (P INDEX (PK_PACKETS))

Как можно посчитать количество записей в таблице, чтобы использовались индексы? Или это какое-то ограничение СУБД?

Ответы

Ответов пока нет.