powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Не нравится как работает индексный поиск.
5 сообщений из 5, страница 1 из 1
Не нравится как работает индексный поиск.
    #32521762
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
create table tb_tariff(
 id integer,
 id_category integer,
 st_date date,
 en_date date,
 ...
);

ALTER TABLE TB_TARIFF ADD CONSTRAINT PK_TB_TARIFF PRIMARY KEY (ID);
CREATE INDEX TB_TARIFF_IDX1 ON TB_TARIFF (ID_CATEGORY, ST_DATE, EN_DATE);

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
param_category =  1 ;
param_date = '01-feb-2004';
select t.*
from tb_tariff t
where (t.id_category = :param_category)
   and (:param_date between t.st_date and t.en_date)

результат - одна строка c st_date = '01-jan-2004' и en_date = '30-apr-2004'
В таблице 230 записей.
Индекс TB_TARIFF_IDX1 он использует, но в id_category = 1 всего 35 тарифов с разными диапазонами дат. Эта зараза совершает 35 операций индексированного чтения. Ну на фига, если результат 1-на строка. Можно как-нибудь переделать, чтобы хоть 2-3 операции чтения делал?
Я даже в индекс ещё одно поле добавлял, чтобы уникальным сделать. А он всё равно 35 чтений делает.
...
Рейтинг: 0 / 0
Не нравится как работает индексный поиск.
    #32521832
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так - доэксперементировался. Со стула слетел, блин.

Код: plaintext
1.
CREATE INDEX TB_TARIFF_IDX2 ON TB_TARIFF (ID_CATEGORY, ST_DATE);
CREATE INDEX TB_TARIFF_IDX3 ON TB_TARIFF (ID_CATEGORY, EN_DATE);

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
param_category =  1 ;
param_date = '01-feb-2004';

select t.*
from tb_tariff t
where (t.id_abon_category = :param_category)
   and (:param_date >= t.st_date)
   and (t.id_abon_category = :param_category)
   and (:param_date <= t.en_date)
Результат 1-на запись — одна операция индексного чтения.
Результат 5-ть записей — пять операций индексного чтения.
ЛЕПОТА.
Объясните на низком уровне как оптимизатор интерпретирует одно и как другое?
...
Рейтинг: 0 / 0
Не нравится как работает индексный поиск.
    #32521890
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Твой первый пример вообще был бредовый. Создавать индекс (A, B) и использовать его в предикате F between A and B... это сильно. Ключ в композитных индексах - единый. Для использования сегмента B индекса требуется _равенство_ на сегмент А. В твоем запросе сервер мог использовать только первые два сегмента из трех (A = <value1> и B >= <value2>), отсюда и 35 индексированных чтений.
...
Рейтинг: 0 / 0
Не нравится как работает индексный поиск.
    #32521950
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 /* без between`а — вот так тоже 35 чтений */ 
where (t.id_category = :param_category)
   and (:param_date >= t.st_date)
   and (:param_date <= t.en_date)

 /* а вот именно так — только 1-но чтение */ 
where (t.id_category = :param_category)  /* для одного индекса */ 
   and (:param_date >= t.st_date)
   and (t.id_category = :param_category)  /* для другого индекса */ 
   and (:param_date <= t.en_date)
Ни разу с такими фишками не сталкивался.
...
Рейтинг: 0 / 0
Не нравится как работает индексный поиск.
    #32522000
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор/* без between`а — вот так тоже 35 чтений */
where (t.id_category = :param_category)
and (:param_date >= t.st_date)
and (:param_date <= t.en_date)

Есс-но. BETWEEN оптимизатор преобразует в ту же пару ">=" и "<=".

автор/* а вот именно так — только 1-но чтение */
where (t.id_category = :param_category) /* для одного индекса */
and (:param_date >= t.st_date)
and (t.id_category = :param_category) /* для другого индекса */
and (:param_date <= t.en_date)

Один предикат может быть выполнен только по одному индексу. Оптимизатор не умеет клонировать предикаты, чтобы добиться большего индексного покрытия.

В данном случае ты дал оптимизатору возможность использовать оба индекса, результирующие битовые карты номеров записей были объединены по AND и полученная карта содержит один номер записи. Результат - ровно одно индексированное чтение.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Не нравится как работает индексный поиск.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]