Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Навигация по индексу FB3 / 7 сообщений из 7, страница 1 из 1
21.11.2013, 00:18:59
    #38472162
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Навигация по индексу FB3
В FB 3 снова сделали эффективную навигацию по индексу как в 1.5. Однако оптимизатор путается если для одного столбца созданы сразу ASC и DESC индексы

скрипты
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE T1 (
  ID INTEGER NOT NULL PRIMARY KEY, 
  NUM INTEGER
);

CREATE INDEX T1_IDX_NUM ON T1 (NUM);
CREATE DESCENDING INDEX T1_IDX_DESC_NUM ON T1 (NUM);



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
EXECUTE BLOCK
AS
DECLARE I INTEGER;
BEGIN
  I = 0;
  WHILE (I < 100) DO
  BEGIN
    I = I + 1;
    INSERT INTO T1 (ID, NUM)
    VALUES (:I, :I);
  END
END



Код: sql
1.
2.
3.
4.
5.
select *
from t1
where id < 3
order by id
rows 3



План
PLAN (T1 ORDER RDB$PRIMARY1)
Тут всё хорошо.

Код: sql
1.
2.
3.
4.
5.
select *
from t1
where num < 3
order by num
rows 3



План
PLAN (T1 ORDER T1_IDX_NUM INDEX (T1_IDX_DESC_NUM))
я ожидал
PLAN (T1 ORDER T1_IDX_NUM)

То ли оптимизатор по какой-то причине хватает разнонаправленные индексы, то ли в придачу к навигации по индексу сканирует лишний на мой взгляд индекс T1_IDX_DESC_NUM.

Попробуем поменять запрос на такой

Код: sql
1.
2.
3.
4.
5.
select *
from t1
where num > 3
order by num desc
rows 3



План
PLAN (T1 ORDER T1_IDX_DESC_NUM INDEX (T1_IDX_NUM))

Как видим план зеркально изменился. но всё также использует разнонаправленные индексы. where num > 3 или where num < 3 на план запроса не влияет.

Прав ли я в своих суждениях?
...
Рейтинг: 0 / 0
21.11.2013, 13:34:01
    #38472848
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Навигация по индексу FB3
похоже на недоработку. Разнонаправленность тут вроде бы не причем, если будет два ASC индекса создано, то план тоже будет ORDER-INDEX вместо ORDER.
...
Рейтинг: 0 / 0
28.11.2013, 13:18:59
    #38481654
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Навигация по индексу FB3
исправил, просьба проверить в разных вариациях
...
Рейтинг: 0 / 0
28.11.2013, 13:45:34
    #38481703
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Навигация по индексу FB3
dimitr,

спасибо, потестим.
...
Рейтинг: 0 / 0
30.11.2013, 22:21:29
    #38484675
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Навигация по индексу FB3
dimitr,

теперь стало намного лучше. Оптимизатор правильно разруливает навигацию по индексу даже для многосегментных индексов. Однако это всё хорошо для 1 таблицы. Как только появляется JOIN, то оптимизатор подводит. Вот пример

Код: sql
1.
2.
3.
4.
5.
6.
SELECT SERVICE.CODE_SERVICE
FROM SERVICE
JOIN WEBUSER ON SERVICE.CODE_WEBUSER = WEBUSER.CODE_WEBUSER
WHERE SERVICE.BYDATE > DATEADD(-1 MONTH TO CURRENT_TIMESTAMP)
ORDER BY SERVICE.BYDATE DESC
ROWS 1  



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
План
PLAN SORT (JOIN (WEBUSER NATURAL, SERVICE INDEX (FK_SERVICE_REF_WEBUSER, SERVICE_IDX_BYDATE)))

------ Performance info ------
Prepare time = 0ms
Execute time = 34s 289ms
Avg fetch time = 34 289,00 ms
Current memory = 275 211 016
Max memory = 313 136 160
Memory buffers = 16 384
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = 1 375 325

Код: sql
1.
2.
3.
4.
5.
6.
SELECT SERVICE.CODE_SERVICE
FROM SERVICE
JOIN WEBUSER ON SERVICE.CODE_WEBUSER+0 = WEBUSER.CODE_WEBUSER
WHERE SERVICE.BYDATE > DATEADD(-1 MONTH TO CURRENT_TIMESTAMP)
ORDER BY SERVICE.BYDATE DESC
ROWS 1  



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
План
PLAN JOIN (SERVICE ORDER SERVICE_IDX_BYDATE_DESC, WEBUSER INDEX (PK_WEBUSER))

------ Performance info ------
Prepare time = 0ms
Execute time = 0ms
Avg fetch time = 0,00 ms
Current memory = 275 210 992
Max memory = 313 136 160
Memory buffers = 16 384
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = 55

Т.е. здесь по идее надо было бы поменять порядок соединения таблиц. Помниться где полгода назад, ты выпускал тестовый билд 2.5, где это работало.
...
Рейтинг: 0 / 0
30.11.2013, 22:28:59
    #38484681
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Навигация по индексу FB3
Симонов ДенисКак только появляется JOIN, то оптимизатор подводит.
по сравнению с желаемым или с поведением ФБ 2.5 или 1.5?

Симонов ДенисТ.е. здесь по идее надо было бы поменять порядок соединения таблиц. Помниться где полгода назад, ты выпускал тестовый билд 2.5, где это работало.
это было новое поведение, отсутствующее ранее. Мы сейчас не его тестируем, а восстанавливаем функционал на уровне 1.5 или чуть лучше.
...
Рейтинг: 0 / 0
30.11.2013, 22:36:45
    #38484690
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Навигация по индексу FB3
dimitr,

подвёл по сравнению с желаемым результатом естественно. Сейчас работает однозначно не хуже чем это было в 1.5
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Навигация по индексу FB3 / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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