powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Непонятки с оптимизатором 2.5.3
25 сообщений из 59, страница 1 из 3
Непонятки с оптимизатором 2.5.3
    #38386750
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сервер LI-V6.3.3.26655 Firebird 2.5
клиент 2.5.1.26351
IBExpert

Есть таблица (лишние поля убрал)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE ACCOUNT_STATE (
    CODE          INTEGER NOT NULL,
    ACCOUNTCODE  BIGINT NOT NULL,
    ENDDATE     DATE,
.......
);

ALTER TABLE ACCOUNT_STATE ADD CONSTRAINT PK_ACCOUNT_STATE PRIMARY KEY (CODE);

CREATE DESCENDING INDEX ACCOUNT_STATE_ACC_ED_DESC ON ACCOUNT_STATE (ACCOUNTCODE, ENDDATE);



Запрос
Код: sql
1.
2.
3.
4.
 select *
  from Account_State
  where Accountcode = :IAccount
    and (Enddate = :Idate1 or Enddate = :Idate2)


показывает план
PLAN (ACCOUNT_STATE INDEX (ACCOUNT_STATE_ACC_ED_DESC))

что для меня несколько неожиданно ибо я ожидал
PLAN (ACCOUNT_STATE INDEX (ACCOUNT_STATE_ACC_ED_DESC, ACCOUNT_STATE_ACC_ED_DESC))

Хочется узнать почему мои ожидания не оправдались. (И небольшое уточнение вопрос не про обходные пути)

зы. записей в таблице 268773
Статистика для обоих индексов 0,000003720611.....

Если нужна еще какая либо информация с удовольствием предоствлю
...
Рейтинг: 0 / 0
Непонятки с оптимизатором 2.5.3
    #38386759
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m7m, на другой версии было иначе?

m7m
Код: sql
1.
CREATE ASCENDING INDEX ACCOUNT_STATE_ACC_ED_DESC ON ACCOUNT_STATE (ACCOUNTCODE, ENDDATE);


М? Так, теоретизирую.
...
Рейтинг: 0 / 0
Непонятки с оптимизатором 2.5.3
    #38386763
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m7m,

1. (Enddate = :Idate1 or Enddate = :Idate2) вырубает использование индекса (если бы он был только по Enddate)
2. Даже если бы там не было выражения, то с чего ты решил что индекс должен задействоваться дважды?
...
Рейтинг: 0 / 0
Непонятки с оптимизатором 2.5.3
    #38386770
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис> 1. (Enddate = :Idate1 or Enddate = :Idate2) вырубает
Симонов Денис> использование индекса (если бы он был только по Enddate)

Ну здрасьте, приехали... Ты чего? :)
Если сложный предикат, а индекс
составной - да, наверное, возможны
нюансы, но не в таком простом кейсе.

P.S. Топик не читал.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Непонятки с оптимизатором 2.5.3
    #38386773
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanm7m, на другой версии было иначе?
Именно этот запрос - без понятия, у меня к сожалению сейчас нет возможности проверить на другой версии
Однако аналогичный запрос на другой таблице (только индекс там трех сегментный) работает ожидаемо для меня
(т.е. в плане дважды упоминается индекс)

wadmanm7m
Код: sql
1.
CREATE ASCENDING INDEX ACCOUNT_STATE_ACC_ED_DESC ON ACCOUNT_STATE (ACCOUNTCODE, ENDDATE);


М? Так, теоретизирую.
нет, никакие манипуляции с индексом, (asc, desc, добавление нового сегмента) не привели к ожидаемым мною результатам
...
Рейтинг: 0 / 0
Непонятки с оптимизатором 2.5.3
    #38386782
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По сабжу - на первое поле индекса нет никаких доп.ограничений, уникальности?

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Непонятки с оптимизатором 2.5.3
    #38386785
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

тьфу блин. Перепутал с другим случаем когда field = :param1 or param1 is null.

Думаю что в этом случае оптимизатор решил что выгодней использовать только часть составного индекса. Тут для отвта нужны сведения по селективности отдельных сегментов.
...
Рейтинг: 0 / 0
Непонятки с оптимизатором 2.5.3
    #38386788
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m7mЕсли нужна еще какая либо информация с удовольствием предоставлю
план на 2.5.2 не помешает. И на 2.5.0 заодно.
...
Рейтинг: 0 / 0
Непонятки с оптимизатором 2.5.3
    #38386790
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m7mСтатистика для обоих индексов 0,000003720611.....
ты забыл, что 2.5 анализирует селективность по всем сегментам композитного индекса, которая может быть хуже, чем суммарная селективность композита. Раньше композиты были вредны именно этим.

Возможно, что по второму сегменту селективность плохая, и поэтому оптимизатор решил не париться, два раза сканируя весь индекс, а потом объединяя битмапы по OR, а просто отобрать записи по первому сегменту, причем один раз.
В принципе, я бы и от предыдущих оптимизаторов ожидал подобного поведения.
...
Рейтинг: 0 / 0
Непонятки с оптимизатором 2.5.3
    #38386803
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrm7mЕсли нужна еще какая либо информация с удовольствием предоставлю
план на 2.5.2 не помешает. И на 2.5.0 заодно.
Немного проблематично :(
(постараюсь завтра-послезавтра)

и еще одно уточнение

запрос
Код: sql
1.
2.
3.
4.
select *
  from Account_State
  where (Accountcode = :IAccount and Enddate = :Idate1) or
  (Accountcode = :IAccount and Enddate = :Idate2)


работает ожидаемо
...
Рейтинг: 0 / 0
Непонятки с оптимизатором 2.5.3
    #38386816
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m7m,

Выполни следующий запрос

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT SEG.RDB$INDEX_NAME AS INDEX_NAME,
       SEG.RDB$FIELD_NAME AS FIELD_NAME,
       SEG.RDB$STATISTICS AS STAT
FROM RDB$INDEX_SEGMENTS SEG
WHERE SEG.RDB$INDEX_NAME = 'ACCOUNT_STATE_ACC_ED_DESC'
UNION ALL
SELECT I.RDB$INDEX_NAME AS INDEX_NAME,
       NULL AS FIELD_NAME,
       I.RDB$STATISTICS AS STAT
FROM RDB$INDICES I
WHERE I.RDB$INDEX_NAME = 'ACCOUNT_STATE_ACC_ED_DESC'



Результат выложи сюда
...
Рейтинг: 0 / 0
Непонятки с оптимизатором 2.5.3
    #38386838
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m7m> работает ожидаемо

Забавненько. ДЕ, оптимизатор такие обманы пока не умеет замечать?

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Непонятки с оптимизатором 2.5.3
    #38386841
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m7m,

кол-во индексных чтений и записей в результате отличаются ?
...
Рейтинг: 0 / 0
Непонятки с оптимизатором 2.5.3
    #38386859
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамДЕ, оптимизатор такие обманы пока не умеет замечать?
смотря что ты считаешь обманом :-) Второй вариант абсолютно понятен оптимизатору, а первый "обман" - нет. Один и тот же предикат нельзя использовать для двух индексных выборок, отсюда и результат в первом посте. Уверен что во всех версиях ФБ план будет такой же, т.е. используется лишь первый сегмент. А развернуть свернутую бинарную логику оптимизатор не умеет.
...
Рейтинг: 0 / 0
Непонятки с оптимизатором 2.5.3
    #38386892
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladm7m,

кол-во индексных чтений и записей в результате отличаются ?
Да

запрос
Код: sql
1.
2.
3.
4.
 select *
   from Account_State
  where Accountcode = 240472
    and (Enddate = date '01.01.2013' or Enddate = date '31.01.2013')


возвращает 0 записей 16 индексных чтений

запрос
Код: sql
1.
2.
3.
4.
 select *
   from Account_State
  where (Accountcode = 240472 and Enddate = date '01.01.2013') OR
           (Accountcode = 240472 and Enddate = date '31.01.2013')


возвращает 0 записей 0 индексных чтений
...
Рейтинг: 0 / 0
Непонятки с оптимизатором 2.5.3
    #38386917
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисm7m,

Выполни следующий запрос

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT SEG.RDB$INDEX_NAME AS INDEX_NAME,
       SEG.RDB$FIELD_NAME AS FIELD_NAME,
       SEG.RDB$STATISTICS AS STAT
FROM RDB$INDEX_SEGMENTS SEG
WHERE SEG.RDB$INDEX_NAME = 'ACCOUNT_STATE_ACC_ED_DESC'
UNION ALL
SELECT I.RDB$INDEX_NAME AS INDEX_NAME,
       NULL AS FIELD_NAME,
       I.RDB$STATISTICS AS STAT
FROM RDB$INDICES I
WHERE I.RDB$INDEX_NAME = 'ACCOUNT_STATE_ACC_ED_DESC'



Результат выложи сюда

Код: plaintext
1.
2.
3.
4.
INDEX_NAME	             FIELD_NAME	                 STAT
-----------------------------------------------------------------
ACCOUNT_STATE_ACC_ED_DESC	ENDDATE    	3.72061185771599E-6
ACCOUNT_STATE_ACC_ED_DESC	ACCOUNTCODE	7.78846515459009E-6
ACCOUNT_STATE_ACC_ED_DESC              		3.72061185771599E-6
...
Рейтинг: 0 / 0
Непонятки с оптимизатором 2.5.3
    #38386938
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m7m,
после поста dimitr 14794983 всё уже понятно. Может быть в трёшке оптимизатор будет умнее в таких случаях.
...
Рейтинг: 0 / 0
Непонятки с оптимизатором 2.5.3
    #38386942
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrГаджимурадов РустамДЕ, оптимизатор такие обманы пока не умеет замечать?
смотря что ты считаешь обманом :-) Второй вариант абсолютно понятен оптимизатору, а первый "обман" - нет. Один и тот же предикат нельзя использовать для двух индексных выборок, отсюда и результат в первом посте. Уверен что во всех версиях ФБ план будет такой же, т.е. используется лишь первый сегмент. А развернуть свернутую бинарную логику оптимизатор не умеет.

Ну вот немного другая ситуация

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE TABLE ACCOUNT_SERVICE (
    CODE              INTEGER NOT NULL ,
    ACCOUNTCODE       BIGINT NOT NULL ,
    SERVICE         INTEGER NOT NULL,
    ACCOUNT_PIPECODE   INTEGER NOT NULL ,
    ENDDATE        DATE,
.......
);

ALTER TABLE ACCOUNT_SERVICE ADD CONSTRAINT PK_ACCOUNT_SERVICE PRIMARY KEY (CODE);

CREATE DESCENDING INDEX ACCOUNT_SERVICE_ACC_ENDDATE ON ACCOUNT_SERVICE (ACCOUNTCODE, ACCOUNT_PIPECODE, ENDDATE);
CREATE INDEX ACCOUNT_SERVICE_PIPE_SERVICE ON ACCOUNT_SERVICE (ACCOUNT_PIPECODE, SERVICE);




запрос
Код: sql
1.
2.
3.
4.
5.
select *
  from Account_Service
  where Accountcode = 251696
    and Account_Pipecode = 307817
    and (Enddate = date '01.01.2013' or Enddate = date '31.01.2013')



PLAN (ACCOUNT_SERVICE INDEX (ACCOUNT_SERVICE_ACC_ENDDATE, ACCOUNT_SERVICE_ACC_ENDDATE))

и получается что развернуть свернутую бинарную логику оптимизатор умеет
...
Рейтинг: 0 / 0
Непонятки с оптимизатором 2.5.3
    #38386958
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисm7m,
после поста dimitr 14794983 всё уже понятно. Может быть в трёшке оптимизатор будет умнее в таких случаях.

ну оно вроде так, однако 14795294 практически тоже (ну другая таблица, ну три сегмента, но оптимизатор разобрался)
и если-бы он здесь не разобрался то исходный вопрос не поднимался бы

(хронологически сначала был разбор полетов с запросом 14795294 , а потом с 14794643 )
...
Рейтинг: 0 / 0
Непонятки с оптимизатором 2.5.3
    #38386962
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m7m,

Это не тоже самое. Здесь у тебя оптимизатор выбрал план по отдельным сегментам индекса
ACCOUNT_SERVICE_ACC_ENDDATE один для поля ACCOUNTCODE, второй - ACCOUNT_PIPECODE
...
Рейтинг: 0 / 0
Непонятки с оптимизатором 2.5.3
    #38386969
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr,

а в трёшке в плане будет как-нибудь отражено какой именно сегмент индекса был выбран в таких случаях?
...
Рейтинг: 0 / 0
Непонятки с оптимизатором 2.5.3
    #38386983
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

да, будет (в расширенном плане)
...
Рейтинг: 0 / 0
Непонятки с оптимизатором 2.5.3
    #38386988
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисm7m,

Это не тоже самое. Здесь у тебя оптимизатор выбрал план по отдельным сегментам индекса
ACCOUNT_SERVICE_ACC_ENDDATE один для поля ACCOUNTCODE, второй - ACCOUNT_PIPECODE
какое тогда будет объяснение для
Код: sql
1.
2.
3.
4.
5.
select *
  from Account_Service
  where Accountcode = 251696
    and Account_Pipecode = 307817
    and Enddate = date '01.01.2013'


PLAN (ACCOUNT_SERVICE INDEX (ACCOUNT_SERVICE_ACC_ENDDATE))
...
Рейтинг: 0 / 0
Непонятки с оптимизатором 2.5.3
    #38386992
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m7m,

ну а здесь всё понятно оптимизатор выбрал индекс целиком, а не по сегментам (раскрывать ничего не потребовалось)
...
Рейтинг: 0 / 0
Непонятки с оптимизатором 2.5.3
    #38386995
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m7mи получается что развернуть свернутую бинарную логику оптимизатор умеет
гммм, ты меня в тупик поставил :) Может я и ошибся выше. Примеры обоих случаев можешь предоставить?
...
Рейтинг: 0 / 0
25 сообщений из 59, страница 1 из 3
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Непонятки с оптимизатором 2.5.3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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