Отличающиеся планы

Запросы, планы, оптимизация запросов, ...

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

Ответить
mg
Сообщения: 1
Зарегистрирован: 09 окт 2006, 12:57

Отличающиеся планы

Сообщение mg » 09 окт 2006, 13:34

Есть таблица words c индексами по полям ID и WRD

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

CREATE TABLE WORDS (
    ID   INTEGER NOT NULL,
    WRD  VARCHAR(50) NOT NULL
);
ALTER TABLE WORDS ADD CONSTRAINT PK_WORDS PRIMARY KEY (ID);
CREATE UNIQUE INDEX WORDS_IDX1 ON WORDS (WRD);

Этап 1.

Делаю запрос с параметром :par

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

select id, wrd from words where wrd like :par||'%'
IBExpert старательно спрашивает значение параметра. Указываю букву "А". В результате получаю исполненный запрос и план с информацией

Plan
PLAN (WORDS NATURAL)

Adapted Plan
PLAN (WORDS NATURAL)

------ Performance info ------
Prepare time = 15ms
Execute time = 32ms
Avg fetch time = 3,56 ms
Current memory = 3 067 048
Max memory = 3 201 964
Memory buffers = 12 048
Reads from disk to cache = 65
Writes from cache to disk = 6
Fetches from cache = 15 150

Этап 2.
Убираю из запроса параметр и прописываю условие в явном виде

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

select id, wrd from words where wrd like 'А%'
В результате получаю

Plan
PLAN (AUTHORS INDEX (AUTHORS_IDX1))

Adapted Plan
PLAN (AUTHORS INDEX (AUTHORS_IDX1))

------ Performance info ------
Prepare time = 0ms
Execute time = 31ms
Avg fetch time = 7,75 ms
Current memory = 3 112 648
Max memory = 3 247 564
Memory buffers = 12 048
Reads from disk to cache = 10
Writes from cache to disk = 6
Fetches from cache = 293
================
Посему вопрос. Почему планы различаются? Ведь п сути запросы абсолютно одинаковы.
Это баг или фича.

FB Server 1.5.3

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 09 окт 2006, 13:55

По сути это разные запросы. FB не обладает проскопией и менять план каждый раз при запуске ей тоже обломно.
RTFM STARTING WITH

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

Сообщение kdv » 09 окт 2006, 13:56

Посему вопрос. Почему планы различаются? Ведь п сути запросы абсолютно одинаковы.
Это баг или фича.
план формируется при prepare. соответственно, в момент prepare сервер не в курсе, что за значение будет внутри параметра. там может быть и %a. в итоге запрос будет содержать where field like '%a%'.
для случая поиска с начала стольбца и чтобы индекс подхватился, нужно вместо LIKE использовать STARTING WITH:

where field statring with :param

Ответить