![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Составные индексы с "разной" сортировкой [Sybase ASA 9]
YuRock © (2007-03-20 13:44:00)Добрый день.
Вопрос такой: есть ли смысл использовать указание направления сортировки в узлах индексов, если они (направления) - разные? Как они работают, я пока-что не заметил. Вот пример:
CREATE INDEX i_DocLimits_LoHi ON DocLimits( LowLimit ASC, HighLimit DESC )
оба поля - unsigned int
Так вот, использовать такую сортировку не получается. Запрос типа
select * from DocLimits where LowLimit <= 1000000 AND HighLimit >= 1000000
Не работает по индексу. ( Если вручную указать план - то индекс использоваться будет, но отбираться по нему будет только "половина" таблицы, а по второму полю (HighLimit) будет sequentially.
Никто не сталкивался с подобной проблемой? Если эта фича не работает - посоветуете что-нибудь другое для решения этой проблемы?
Сервер ASA 9.0.2
В таблице - 16 миллионов записей. Результаты запросов, как в примере - 2-4 записи. Данные в полях LowLimit и HighLimit не уникальные, но и сильно не повторяющиеся.
min/мах значение этих полей:
select
( select min(LowLimit) from doclimits ) as minlo,
( select max(LowLimit) from doclimits ) as maxlo,
( select min(HighLimit) from doclimits ) as minhi,
( select max(HighLimit) from doclimits ) as maxhi
from dummy
minlo,maxlo,minhi,maxhi
1048577,231735297,1048577,231740120
SELECT AVG(HighLimit) FROM DocLimits
46283869
Спасибо большое за любые ответы.
Sergey13 (2007-03-20 13:58:00) [21]> Так вот, использовать такую сортировку не получается. Запрос типа
> select * from DocLimits where LowLimit <= 1000000 AND HighLimit >= 1000000
> Не работает по индексу.
И не получится наверное. Ибо в условии не четкое равенство. Другими словами записей, удовлетворяющих условию, может быть и миллион и два и больше. Индекс при этом будет только мешать из-за дополнительного чтения. Поэтому оптимизатор видимо (справедливо) посчитал, что фул скан будет производительнее.
> select
> ( select min(LowLimit) from doclimits ) as minlo,
> ( select max(LowLimit) from doclimits ) as maxlo,
> ( select min(HighLimit) from doclimits ) as minhi,
> ( select max(HighLimit) from doclimits ) as maxhi
> from dummy
Почему не просто
select min(LowLimit),max(LowLimit),min(HighLimit),max(HighLimit) from doclimits
? Все выберется за один проход вместо 4-х.
ЗЫ: Все исключительно ИМХО, с указанным сервером не встречался