Quantcast
Channel: SQL.ru: Firebird, InterBase
Viewing all articles
Browse latest Browse all 1677

Странная работа с индексами в FB2.5

$
0
0
Столкнулся со странной работой с индексами. Поправьте пожалуйста, что я делаю не так.
Есть таблица
CREATE TABLE T_CUSTOMER_CONFIRM_ITER1 (
    ID         D_ID /* D_ID = BIGINT NOT NULL */,
    D_ADD      D_DT /* D_DT = TIMESTAMP DEFAULT CURRENT_TIMESTAMP */,
    ROW_ID     D_CH21 /* D_CH21 = VARCHAR(21) */,
    ITER_ID    D_CH21 /* D_CH21 = VARCHAR(21) */,
    STATE      D_CH20 /* D_CH20 = VARCHAR(21) */,
    NOTE       D_CH1024 /* D_CH1024 = VARCHAR(1024) */,
    SR_NUMBER  D_CH21 /* D_CH21 = VARCHAR(21) */
);
ALTER TABLE T_CUSTOMER_CONFIRM_ITER1 ADD CONSTRAINT PK_T_CUSTOMER_CONFIRM_ITER1 PRIMARY KEY (ID);
CREATE INDEX T_CUSTOMER_CONFIRM_ITER1_IDX1 ON T_CUSTOMER_CONFIRM_ITER1 (ITER_ID);
CREATE INDEX T_CUSTOMER_CONFIRM_ITER1_IDX2 ON T_CUSTOMER_CONFIRM_ITER1 (STATE);


В таблице примерно 170 тыс. записей.
1. Выполняю запрос типа
select * from T_CUSTOMER_CONFIRM_ITER1 where state='Назначено'

Получаю вот такой план PLAN (T_CUSTOMER_CONFIRM_ITER1 INDEX (T_CUSTOMER_CONFIRM_ITER1_IDX2))
и статистку
------ Информация о производительности ------
Время подготовки запроса = 297ms
Время выполнения запроса = 31ms
Current memory = 245 924 200
Max memory = 344 115 728
Memory buffers = 2 048
Reads from disk to cache = 59
Writes from cache to disk = 24
Чтений из кэша = 0


2. Выполняю запрос типа
select * from T_CUSTOMER_CONFIRM_ITER1 where state='В процессе'

Получаю вот такой план PLAN (T_CUSTOMER_CONFIRM_ITER1 INDEX (T_CUSTOMER_CONFIRM_ITER1_IDX2))
и статистку
Время подготовки запроса = 187ms
Время выполнения запроса = 27s 722ms
Current memory = 246 139 168
Max memory = 344 115 728
Memory buffers = 2 048
Reads from disk to cache = 13 287
Writes from cache to disk = 5 076

+--------------------------+-----------+-----------+-------------+---------+---------+---------+
|        Table Name        |  Records  |  Indexed  | Non-Indexed | Updates | Deletes | Inserts |
|                          |   Total   |   reads   |    reads    |         |         |         |
+--------------------------+-----------+-----------+-------------+---------+---------+---------+
|  T_CUSTOMER_CONFIRM_ITER1|         0 |     58841 |           0 |       0 |       0 |       0 |
+--------------------------+-----------+-----------+-------------+---------+---------+---------+


3. Но если выполнить запрос типа
select * from T_CUSTOMER_CONFIRM_ITER1 where state starting with 'В процессе%'

Получаю вот такой план PLAN (T_CUSTOMER_CONFIRM_ITER1 INDEX (T_CUSTOMER_CONFIRM_ITER1_IDX2))
и статистку
------ Информация о производительности ------
Время подготовки запроса = 125ms
Время выполнения запроса = 0ms
Current memory = 245 785 008
Max memory = 344 115 728
Memory buffers = 2 048
Reads from disk to cache = 173
Writes from cache to disk = 52
Чтений из кэша = 0


Вопрос, почему в вариантах 2 и 3 такая разница в скорости и почему вариант 2 так долго выполняется?

Viewing all articles
Browse latest Browse all 1677

Trending Articles