Есть таблица
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
ПОЧЕМУ при добавлении условия, которому уже удовлетворяет первая
попавшаяся запись, сервер продолжает считывать таблицу с диска?
Запросы повторялись многократно, так что кэш на это не влияет.