Есть таблица
CREATE TABLE CLIENT_FIX (
    NUM        INTEGER NOT NULL,
    DATE_      DATE NOT NULL
/*дальше не важно*/
);
CREATE DESCENDING INDEX SF_CLIENT ON CLIENT_FIX (DATE_, NUM);
в таблице 12 000 000 записей.

Найдем запись с максимальной датой:
select first 1 * from client_fix order by date_ desc

Результат:
NUM     DATE_   
311437  17/08/2007
Обратите внимание, что NUM>0

Plan
PLAN (CLIENT_FIX ORDER SF_CLIENT)
------ Performance info ------
Prepare time = 328ms
Execute time = 16ms
Avg fetch time = 16.00 ms
Current memory = 1 599 104
Max memory = 12 099 684
Memory buffers = 256
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = 7

Теперь добавим условие:
select first 1 * from client_fix where num>0 order by date_ desc
Plan
PLAN (CLIENT_FIX ORDER SF_CLIENT) - план тот же 

результат запроса тот же что и выше,
статистика показывает то же самое 1(одно) индексное чтение,
НО взгляните на время выполнения:

------ Performance info ------
Prepare time = 203ms
Execute time = 27s 172ms                <--------- !!!
Avg fetch time = 2 717.20 ms
Current memory = 10 823 536
Max memory = 10 960 408
Memory buffers = 256
Reads from disk to cache = 29 238       <--------- !!!
Writes from cache to disk = 0
Fetches from cache = 29 267             <--------- !!!

FB 1.5.3 CS
ПОЧЕМУ при добавлении условия, которому уже удовлетворяет первая попавшаяся запись, сервер продолжает считывать таблицу с диска?
Запросы повторялись многократно, так что кэш на это не влияет.

Ответить