powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Informix [игнор отключен] [закрыт для гостей] / problems with descending unique index
19 сообщений из 19, страница 1 из 1
problems with descending unique index
    #33704658
softic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, сегодня у меня (IDS 9.40.FC7) возникла проблема с запросом по убывающему уникальному индексу.

Заключается она в том, что если я явно указываю сортировку по убыванию - запрос выполняется по полдня, а если не указываю - то сразу. Таблица секционирована - три секции.

Кто-нибудь сталкивался с такими проблемами?

Вот какие запросы и таблица:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
-- этот запрос работает вечность:
select first  1  bid,mtmtime 
from marks:mtmhistory
where instriid =  555  and mtmtime < today 
order by mtmtime desc

-- это моментально, хотя выборка та же самая:
select first  1  bid,mtmtime 
from marks:mtmhistory
where instriid =  555  and mtmtime < today 

-- вот индекс:
create unique index pk_mtmhistory on marks:mtmhistory
   (
   instriid, 
   mtmtime desc
   )    
FRAGMENT BY EXPRESSION
(mtmtime >= mdy( 1 , 1 , 2006 ))                             in datdbs1, -- year 2006
(mtmtime >= mdy( 1 , 1 , 2005 ) and mtmtime < mdy( 1 , 1 , 2006 )) in datdbs2, -- year 2005
(mtmtime <  mdy( 1 , 1 , 2005 ))                             in arcdbs   -- remainder part (archive)
;

-- вот таблица (80 миллионов записей):
create table marks:mtmhistory(
    instriid  INT,
    instrid   NCHAR( 10 ),
    mtmtime   DATETIME YEAR TO FRACTION,
    bid       DECIMAL( 32 , 16 ),
    ask       DECIMAL( 32 , 16 )
)
FRAGMENT BY EXPRESSION
(mtmtime >= mdy( 1 , 1 , 2006 ))                             in datdbs1, -- year 2006
(mtmtime >= mdy( 1 , 1 , 2005 ) and mtmtime < mdy( 1 , 1 , 2006 )) in datdbs2, -- year 2005
(mtmtime <  mdy( 1 , 1 , 2005 ))                             in arcdbs   -- remainder part (archive)
;


Вот планы выполнения запросов:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
--Этот запрос отрабатывает моментально (хотя оптимизатор и тут тупит, когда пишет estimated cost):
QUERY:
------
select first  1  bid,mtmtime 
from dv:mtmhistory 
where instriid =  555  and mtmtime < today 
--order by mtmtime desc
Estimated Cost:  925437 
Estimated # of Rows Returned:  1259016 
   1 ) informix.mtmhistory: INDEX PATH
    ( 1 ) Index Keys: instriid mtmtime (desc)   (Serial, fragments: ALL)
        (fragments might be eliminated at runtime because filter contains 
runtime constants)
        Lower Index Filter: (informix.mtmhistory.instriid =  555  AND informix.mtmhistory.mtmtime < TODAY ) 

 
--А этот запрос вообще не отрабатывает:
QUERY:
------
select first  1  bid,mtmtime 
from dv:mtmhistory 
where instriid =  555  and mtmtime < today 
order by mtmtime desc
Estimated Cost:  1729442 
Estimated # of Rows Returned:  1259016 
Temporary Files Required For: Order By  
   1 ) informix.mtmhistory: INDEX PATH
    ( 1 ) Index Keys: instriid mtmtime (desc)   (Serial, fragments: ALL)
        (fragments might be eliminated at runtime because filter contains 
runtime constants)
        Lower Index Filter: (informix.mtmhistory.instriid =  555  AND informix.mtmhistory.mtmtime < TODAY ) 
...
Рейтинг: 0 / 0
problems with descending unique index
    #33704667
softic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, кстати - ВСЕХ С ПРАЗДНИКАМИ! :)
...
Рейтинг: 0 / 0
problems with descending unique index
    #33704695
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
select {+first_rows} first 1 bid,mtmtime

index desc по моему нафиг не нужно в этом случае, а может и вообще.
-----------------------------------------------------------------------------------------------------------------------------------------
нужно делать то что нужно, а то что не нужно -- делать не нужно (перефразируя В-Пуха).
...
Рейтинг: 0 / 0
problems with descending unique index
    #33704703
Ничего удивительного. Индекс у тебя:

-- вот индекс:
create unique index pk_mtmhistory on marks:mtmhistory
(
instriid,
mtmtime desc
)
----------------------
А вот запрос:

-- этот запрос работает вечность:
select first 1 bid,mtmtime
from marks:mtmhistory
where instriid = 555 and mtmtime < today
order by mtmtime desc
--------------------------
order by по второму полю индекса. Во втором запросе, кстати, нет order by, поэтому и быстро. Доваь еще индекс по полю mtmtime для первого запроса или поле instriid в order by
...
Рейтинг: 0 / 0
problems with descending unique index
    #33704713
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр Федоренко....
order by по второму полю индекса. Во втором запросе, кстати, нет order by, поэтому и быстро. Доваь еще индекс по полю mtmtime для первого запроса или поле instriid в order by+1
...
Рейтинг: 0 / 0
problems with descending unique index
    #33704778
softic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Александр Федоренко
order by по второму полю индекса. Во втором запросе, кстати, нет order by, поэтому и быстро. Доваь еще индекс по полю mtmtime для первого запроса или поле instriid в order by

Александр, спасибо за помощь!
Однако, если я делаю запрос с указанием instriid в order by
Код: plaintext
1.
2.
3.
4.
select first  1  bid,mtmtime 
from marks:mtmhistory h
where instriid =  555  and mtmtime < today 
order by instriid, mtmtime desc
то он всё равно долго работает.

Получается, либо делать, как написал Денис (т.е. хинт --+first_rows), либо перезалить индекс на новый, так? (видимо, последнее более просто...)
...
Рейтинг: 0 / 0
problems with descending unique index
    #33704802
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softic
Получается, либо делать, как написал Денис (т.е. хинт --+first_rows), либо перезалить индекс на новый, так? (видимо, последнее более просто...)Чего перезалить, куда, не поможет. first_rows это не хинт, это необходимость, субд не может догадаться что вы хотите только первые строки.
Если не нравится хинт, можно "set optimization first_rows" выполнить перед запросом, а после all_rows.
...
Рейтинг: 0 / 0
problems with descending unique index
    #33704815
Ну хинт на первые записи по-любому не помешает, раз тебе только первая запись и нужна.
Я вот не уверен, что без order by ВСЕГДА нужный результат ты получишь. Если только через дерективы принудительно использовать индекс заставить. Да и то неправильно по-моему.
А при добавлении в ордер бай первого поля план выполнения смотрел? Статистику, кстати, обновлял давно?
...
Рейтинг: 0 / 0
problems with descending unique index
    #33704821
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр Федоренко
Я вот не уверен, что без order by ВСЕГДА нужный результат ты получишь. Если Не получишь, только order by гарантирует тот порядок который нужен.
...
Рейтинг: 0 / 0
problems with descending unique index
    #33704876
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Любопытно, какая стоимость при +first_rows и вообще план?

-----------------------------------------------------------------------------------------------------------------------------------------
нужно делать то что нужно, а то что не нужно -- делать не нужно (перефразируя В-Пуха).
...
Рейтинг: 0 / 0
problems with descending unique index
    #33704910
softic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Журавлев ДенисЛюбопытно, какая стоимость при +first_rows и вообще план?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
QUERY:        (FIRST_ROWS OPTIMIZATION)

------
select --+first_rows index(h, pk_mtmhistory)
first  1  bid,mtmtime 
from marks:mtmhistory h
where instriid =  555  and mtmtime < today 
order by mtmtime desc

DIRECTIVES FOLLOWED: 
FIRST_ROWS 
INDEX ( h pk_mtmhistory )
DIRECTIVES NOT FOLLOWED: 

Estimated Cost:  925437 
Estimated # of Rows Returned:  1259016 

   1 ) accente.h: INDEX PATH

    ( 1 ) Index Keys: instriid mtmtime (desc)   (Serial, fragments: ALL)
        (fragments might be eliminated at runtime because filter contains 
runtime constants)
        Lower Index Filter: (accente.h.instriid =  555  AND accente.h.mtmtime < TODAY ) 



QUERY:        (FIRST_ROWS OPTIMIZATION)

------
select --+first_rows index(h, pk_mtmhistory)
first  1  bid,mtmtime 
from marks:mtmhistory h
where instriid =  555  and mtmtime < today

DIRECTIVES FOLLOWED: 
FIRST_ROWS 
INDEX ( h pk_mtmhistory )
DIRECTIVES NOT FOLLOWED: 

Estimated Cost:  925437 
Estimated # of Rows Returned:  1259016 

   1 ) accente.h: INDEX PATH

    ( 1 ) Index Keys: instriid mtmtime (desc)   (Serial, fragments: ALL)
        (fragments might be eliminated at runtime because filter contains 
runtime constants)
        Lower Index Filter: (accente.h.instriid =  555  AND accente.h.mtmtime < TODAY ) 
...
Рейтинг: 0 / 0
problems with descending unique index
    #33704922
softic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Журавлев Денис Александр Федоренко
Я вот не уверен, что без order by ВСЕГДА нужный результат ты получишь. Если Не получишь, только order by гарантирует тот порядок который нужен.

Денис, даже если всегда используется отсортированный индекс?

Про перезаливку индекса - я имел ввиду заменить текущий индекс на ascending индекс.
...
Рейтинг: 0 / 0
problems with descending unique index
    #33704943
softic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Александр ФедоренкоНу хинт на первые записи по-любому не помешает, раз тебе только первая запись и нужна.
Я вот не уверен, что без order by ВСЕГДА нужный результат ты получишь. Если только через дерективы принудительно использовать индекс заставить. Да и то неправильно по-моему.
А при добавлении в ордер бай первого поля план выполнения смотрел? Статистику, кстати, обновлял давно?

План смотрел,
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
QUERY:
------
select first  1  instriid,bid,mtmtime 
from marks:mtmhistory h
where instriid =  555  and mtmtime < today 
order by instriid, mtmtime desc

Estimated Cost:  1725416 
Estimated # of Rows Returned:  1259016 
Temporary Files Required For: Order By  

Статистику обновлял только-только, HIGH MODE по индексированным полям.
Даже проверял (#dbschema -hd) - статистика собрана корректно.

Может, и не правильно, но (насколько я знаю) выборка при index-scan сортируется в соответствии с порядком сортировки полей индекса. Разве это не так?
...
Рейтинг: 0 / 0
problems with descending unique index
    #33705112
softic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Журавлев ДенисЛюбопытно, какая стоимость при +first_rows и вообще план?
Денис, меня очень интересует вопрос - почему запрос с ORDER BY при возрастающем индексе работал отлично? Т.е.
Код: plaintext
1.
2.
3.
select first  1  bid,mtmtime 
from marks:mtmhistory
where instriid =  555  and mtmtime < today 
order by mtmtime desc
при индексе
Код: plaintext
1.
2.
3.
4.
create index pk_mtmhistory on marks:mtmhistory
   (
   instriid, 
   mtmtime
   )  
работал быстро? (такой индекс использовался раньше, до перестройки его по полю mtmtime в descending)

Может есть какие-нибудь идеи, почему такой индекс быстро давал результат?
...
Рейтинг: 0 / 0
problems with descending unique index
    #33705403
Выбегалло
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softic
Может, и не правильно, но (насколько я знаю) выборка при index-scan сортируется в соответствии с порядком сортировки полей индекса. Разве это не так?

Нет. Порядок гарантируется только использованием ORDER BY
...
Рейтинг: 0 / 0
problems with descending unique index
    #33705619
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softic...
Может, и не правильно, но (насколько я знаю) выборка при index-scan сортируется в соответствии с порядком сортировки полей индекса. Разве это не так?Вас обманули. Используйте order by.
...
Рейтинг: 0 / 0
problems with descending unique index
    #33705623
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softic
...Может есть какие-нибудь идеи, почему такой индекс быстро давал результат?Нет никакой разницы как обходить битри-дерево в сторону возрастания или в сторону убывания.
...
Рейтинг: 0 / 0
problems with descending unique index
    #33705632
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
--order by mtmtime desc
Estimated Cost:  925437 
Estimated # of Rows Returned: 1259016

order by mtmtime desc
Estimated Cost:  1729442 
Estimated # of Rows Returned: 1259016
Temporary Files Required For: Order By  

select --+first_rows index(h, pk_mtmhistory)
Estimated Cost:  925437 
Estimated # of Rows Returned: 1259016

Нда, понять это невозможно, еще более невозможно объяснить это техподдержке. Тут Квизатц Хадерах нужен. Надо слепить синтетический повторяемый тест и написать в сди.
...
Рейтинг: 0 / 0
problems with descending unique index
    #33705964
softic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Журавлев Денис
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
--order by mtmtime desc
Estimated Cost:  925437 
Estimated # of Rows Returned: 1259016

order by mtmtime desc
Estimated Cost:  1729442 
Estimated # of Rows Returned: 1259016
Temporary Files Required For: Order By  

select --+first_rows index(h, pk_mtmhistory)
Estimated Cost:  925437 
Estimated # of Rows Returned: 1259016

Нда, понять это невозможно, еще более невозможно объяснить это техподдержке. Тут Квизатц Хадерах нужен. Надо слепить синтетический повторяемый тест и написать в сди.

Денис, спасибо большое за помощь!
Думаю, вопрос пока закрыт, когда будут результаты запроса в техподдержку - дам знать (скорее всего, это будет нескоро).

Пока что есть только одна идея - глюк оптимизатора при использовании фрагментирования на таблице.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Informix [игнор отключен] [закрыт для гостей] / problems with descending unique index
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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