powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Составные индексы с "разной" сортировкой
28 сообщений из 28, показаны все 2 страниц
Составные индексы с "разной" сортировкой
    #34402729
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.

Вопрос такой: есть ли смысл использовать указание направления сортировки в узлах индексов, если они (направления) - разные? Как они работают, я пока-что не заметил. Вот пример:

Код: plaintext
CREATE INDEX i_DocLimits_LoHi ON DocLimits( LowLimit ASC, HighLimit DESC )
оба поля - unsigned int

Так вот, использовать такую сортировку не получается. Запрос типа
Код: plaintext
select * from DocLimits where LowLimit <=  1000000  AND HighLimit >=  1000000 
Не работает по индексу. ( Если вручную указать план - то индекс использоваться будет, но отбираться по нему будет только "половина" таблицы, а по второму полю (HighLimit) будет sequentially.

Никто не сталкивался с подобной проблемой? Если эта фича не работает - посоветуете что-нибудь другое для решения этой проблемы?

Сервер ASA 9.0.2
В таблице - 16 миллионов записей. Результаты запросов, как в примере - 2-4 записи. Данные в полях LowLimit и HighLimit не уникальные, но и сильно не повторяющиеся.

min/мах значение этих полей:
Код: plaintext
1.
2.
3.
4.
5.
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

Код: plaintext
SELECT AVG(HighLimit) FROM DocLimits

46283869

Спасибо большое за любые ответы.
...
Рейтинг: 0 / 0
Составные индексы с "разной" сортировкой
    #34402902
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock пишет:

> Вопрос такой: есть ли смысл использовать указание направления сортировки
> в узлах индексов, если они (направления) - разные? Как они работают, я
> пока-что не заметил. Вот пример:

Смысл это делать есть для поддержки определенных ORDER BY.
Если у вас есть индекс, совпадающий с ORDER BY , то сервер
может выполнять запрос без сортировки, двигаясь по индексу.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Составные индексы с "разной" сортировкой
    #34402934
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
Смысл это делать есть для поддержки определенных ORDER BY.
Если у вас есть индекс, совпадающий с ORDER BY , то сервер
может выполнять запрос без сортировки, двигаясь по индексу.
Posted via ActualForum NNTP Server 1.4

Да, действительно, спасибо. Если пишу так:
Код: plaintext
1.
2.
SELECT *
FROM DocLimits
ORDER BY LowLimit ASC, HighLimit DESC

То идет по "правильному" плану Scan DocLimits using index i_DocLimits_HiLo (all rows)

Но, что... Хоть в ORDER BY и можно, в фильтре - нельзя?
...
Рейтинг: 0 / 0
Составные индексы с "разной" сортировкой
    #34403440
Фотография A.K.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockНо, что... Хоть в ORDER BY и можно, в фильтре - нельзя?
А как вы себе представляете применение этого индекса сразу для проверки ваших двух условий? это было бы возможно, если бы индекс позволял сразу выбрать непрерывный диапазон, записи в котором удовлетворяют обоим условиям, но в вашем случае это совсем не так.

Пусть у вас условие: a=<5 and b>=5

Индексированные по a asc, b desc данные выглядят так (удовлетворяющие условию данные выделены жирным):
ab 3 7 3 6 32 4 6 4 5 4458
...
Рейтинг: 0 / 0
Составные индексы с "разной" сортировкой
    #34403459
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
A.K. YuRockНо, что... Хоть в ORDER BY и можно, в фильтре - нельзя?
А как вы себе представляете применение этого индекса сразу для проверки ваших двух условий? это было бы возможно, если бы индекс позволял сразу выбрать непрерывный диапазон, записи в котором удовлетворяют обоим условиям, но в вашем случае это совсем не так.

Пусть у вас условие: a=<5 and b>=5

Индексированные по a asc, b desc данные выглядят так (удовлетворяющие условию данные выделены жирным):
Да, наверное Вы правы...
...
Рейтинг: 0 / 0
Составные индексы с "разной" сортировкой
    #34403460
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockДа, наверное Вы правы...
Вот только как быть... :\
...
Рейтинг: 0 / 0
Составные индексы с "разной" сортировкой
    #34403514
Фотография A.K.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а в чем проблема? вот вы говорите, что обоим условиям обычно удовлетворяет 2-4 записи.
а каждому из условий по отдельности сколько удовлетворяет?
...
Рейтинг: 0 / 0
Составные индексы с "разной" сортировкой
    #34403749
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
A.K.а в чем проблема? вот вы говорите, что обоим условиям обычно удовлетворяет 2-4 записи.
а каждому из условий по отдельности сколько удовлетворяет?
В среднем - половина записей.
...
Рейтинг: 0 / 0
Составные индексы с "разной" сортировкой
    #34404973
antand
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Думаю в варианте автора манипулированием индексами и планами не обойтись. Данных много, да и условия выборки исключают нормальное использование индексов для достижения приемлимой скорости.
Может подход в корне поменять? Перепроектировать базу немного?
Какая бизнес-логика преследуется в выборке, что храниться в таблице и т.д.?
...
Рейтинг: 0 / 0
Составные индексы с "разной" сортировкой
    #34405383
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
antandДобрый день!
Думаю в варианте автора манипулированием индексами и планами не обойтись. Данных много, да и условия выборки исключают нормальное использование индексов для достижения приемлимой скорости.
Может подход в корне поменять? Перепроектировать базу немного?
Какая бизнес-логика преследуется в выборке, что храниться в таблице и т.д.?
Эх, да если б я ее проектировал...
Логика такая. LowLimit и HighLimit - это диапазон талонов. В каждом таком диапазоне - от 1 до 10 талонов примерно. Вот таких диапазонов - 16 млн. уже.

Ну, единственный выход пока-что я вижу - чтоб не менять логику работы проекта (он огромный и мне не нравится в него лазить :) ) - это создать доп. таблицу, и в нее триггером на INSERT в DocLimits добавлять все строки диапазона и Id записи диапазона. Ну и единоразово в нее все загнать, а затем - этот триггер работать будет. Таким образом можно будет нормальным запросом получить все диапазоны, в которые входит талон.
Правда, в этой таблице получится миллионов 100 записей :(

Но пока на ум ничего больше не пришло...
...
Рейтинг: 0 / 0
Составные индексы с "разной" сортировкой
    #34406534
antand
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще подробнее можно бизнес-логику?
Начиная от описания талонов, диапазонов, их связь, как вставляются записи в таблицы, что нужно на выходе и т.д.
Просто из вашего предыдущего поста не совсем понятно.
...
Рейтинг: 0 / 0
Составные индексы с "разной" сортировкой
    #34406598
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
antandЕще подробнее можно бизнес-логику?
Начиная от описания талонов, диапазонов, их связь, как вставляются записи в таблицы, что нужно на выходе и т.д.

На выходе нужно получить все диапазоны, в которые входит данный талон.

Как добавляются данные в таблицу диапазонов - я не знаю (через документы как-то. Это сейчас не важно)

Так вот, я предлагаю (сейчас это делаю и попробую поюзать) сделать таблицу, в которую будут попадать "развернутые" диапазоны.

Т.е. Если в записи DocLimits такая запись:
Id LowLimit HighLimit
12 1000 1003

то в DocLimitsEx будет так:
Id DocLimitId TalonId
1 12 1000
2 12 1001
3 12 1002
4 12 1003

Вот. А в DocLimitsEx данные буду записывать триггерами на таблицу DocLimits. И все. В итоге необходимый список диапазонов талона можно будет получить очень просто.

Другое дело, что, как я уже заметил эксперементально, кол-во записей в этой таблице получилось 55 миллионов... Многовато, однако... Но, думаю, так и оставлю.
...
Рейтинг: 0 / 0
Составные индексы с "разной" сортировкой
    #34406648
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockНа выходе нужно получить все диапазоны, в которые входит данный талон.

Как добавляются данные в таблицу диапазонов - я не знаю (через документы как-то. Это сейчас не важно)Вот как раз это сейчас и важно. Трудоемкое решение задачи это первый признак плохой постановки задачи. Займись изучением бизнес-логики.
...
Рейтинг: 0 / 0
Составные индексы с "разной" сортировкой
    #34406665
antand
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Примерно ясно. Но раз у Вас нет таблицы талонов, то я бы сделал немного по другому.
Ввел еще одну таблицу - талонов Talons. И связал бы ее с DocLimits через DocLimitsEx
При вставке в DocLimits проверял, есть ли в Talons талон из вставляемого диапазона.
Если нет добавлял бы запись в Talons.
А потом фиксировал новую связь талонов и диапазонов в DocLimitsEx
...
Рейтинг: 0 / 0
Составные индексы с "разной" сортировкой
    #34406694
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl YuRockНа выходе нужно получить все диапазоны, в которые входит данный талон.

Как добавляются данные в таблицу диапазонов - я не знаю (через документы как-то. Это сейчас не важно)Вот как раз это сейчас и важно. Трудоемкое решение задачи это первый признак плохой постановки задачи. Займись изучением бизнес-логики.
Постановка этой задачи если и была, то лет 10 назад, когда я еще университет косил :)
Это сейчас действительно не важно. Мне нужно строить запросы на основе готовых данных. Откуда взялись эти данные - какая уже разница?

Если я потрачу несколько дней для того, чтобы в е. PowerBuilder'е найти место (местА), где делаются инсерты в первоначальную таблицу - мне это абсолютно не поможет. Через триггеры будет все-равно лучше, чем в момент добавления диапазона отдельно добавлять записи в новую таблицу, т.к. это просто глупо. Да и убрать диапазоны как таковые (упростить логику) - тоже не совсем оптимально - в DocLimits размер записи довольно большой... Да и боюсь я это делать, и лень :)

В общем-то, я уже все сделал. Размер базы вырос на 25%, зато во многих местах начало летать. Если кто хочет еще что посоветовать - пожалуйста. Пока-что я склоняюсь к тому, чтобы закончить на этом...
...
Рейтинг: 0 / 0
Составные индексы с "разной" сортировкой
    #34406716
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockДа и убрать диапазоны как таковые (упростить логику) - тоже не совсем оптимальноВот как раз это я и предполагал.
Если некий талон всегда попадает в какой-то диапазон, иногда проще заниматься вычислением этого диапазона на лету, чем хранить его в базе... ну ладно.

Есть еще один метод. Добавь в таблицу вычислимое поле примерно так:
low_high char(20) compute(LowLimit || HighLimit)
а потом сделай индекс на это вычислимое поле. И ищи данные по нему.
...
Рейтинг: 0 / 0
Составные индексы с "разной" сортировкой
    #34406717
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
antandПримерно ясно. Но раз у Вас нет таблицы талонов, то я бы сделал немного по другому.
Ввел еще одну таблицу - талонов Talons. И связал бы ее с DocLimits через DocLimitsEx
При вставке в DocLimits проверял, есть ли в Talons талон из вставляемого диапазона.
Если нет добавлял бы запись в Talons.
А потом фиксировал новую связь талонов и диапазонов в DocLimitsEx
Да при чем тут Talons. Такая таблица, как раз, есть :)
Но толку от нее, в ней же не указан список диапазонов, в которые входит данный талон. В ней вообще TalonId - это ПК.
А новая в таблице - TalonId - не уникальное поле.

А связывать DocLimitsEx теперь, естественно, можно с чем угодно будет...
...
Рейтинг: 0 / 0
Составные индексы с "разной" сортировкой
    #34406735
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlЕсть еще один метод. Добавь в таблицу вычислимое поле примерно так:
low_high char(20) compute(LowLimit || HighLimit)
а потом сделай индекс на это вычислимое поле. И ищи данные по нему.

Интересно. Попробую.
...
Рейтинг: 0 / 0
Составные индексы с "разной" сортировкой
    #34406749
antand
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRock
Да при чем тут Talons. Такая таблица, как раз, есть :)

Так вот с этого и надо было начинать.
В таком случае в DocLimitsEx можно оставить только DocLimitId и TalonId как первичный ключ
...
Рейтинг: 0 / 0
Составные индексы с "разной" сортировкой
    #34406759
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
antand
Так вот с этого и надо было начинать.
В таком случае в DocLimitsEx можно оставить только DocLimitId и TalonId как первичный ключ
Тю, ну можно, конечно. Ну а что изменится? (в данной задаче)
...
Рейтинг: 0 / 0
Составные индексы с "разной" сортировкой
    #34406768
antand
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да ничего, с точки зрения бизнес-локиги.
Только база станет на 16 миллионов*(размер поля id ) поменьше.
Примерно конечно.
...
Рейтинг: 0 / 0
Составные индексы с "разной" сортировкой
    #34406780
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
antandДа ничего, с точки зрения бизнес-локиги.
Только база станет на 16 миллионов*(размер поля id ) поменьше.
Примерно конечно.
Ну это немного. А вот если в будущем понадобиться это Id - будет уже интересней :)
...
Рейтинг: 0 / 0
Составные индексы с "разной" сортировкой
    #34406790
antand
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот в будущем как раз и можно добавить без проблем.
...
Рейтинг: 0 / 0
Составные индексы с "разной" сортировкой
    #34406852
antand
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кстати без поля id в DocLimitsEx база будет не на 16 миллионов*(размер поля id ) поменьше, а на 16 миллионов*(размер поля id )*<среднее кол-во талонов в диапазоне>.
Автор пишет: "В каждом таком диапазоне - от 1 до 10 талонов примерно". Пусть ~ 5
Итого 80 миллионов*(размер поля id ). Опять же примерно.
И зачем спрашивается?
...
Рейтинг: 0 / 0
Составные индексы с "разной" сортировкой
    #34406870
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
antandКстати без поля id в DocLimitsEx база будет не на 16 миллионов*(размер поля id ) поменьше, а на 16 миллионов*(размер поля id )*<среднее кол-во талонов в диапазоне>.
Автор пишет: "В каждом таком диапазоне - от 1 до 10 талонов примерно". Пусть ~ 5
Итого 80 миллионов*(размер поля id ). Опять же примерно.
И зачем спрашивается?
Ну не жалко мне 300 метров :)
А Id у записи должно быть всегда, я так думаю. Принципиально. Он в автообмене распределенки потом работать будет очень хорошо... Да и вообще - это неплохой стиль, когда у всех таблиц есть ПК... Ну, это мое мнение.
...
Рейтинг: 0 / 0
Составные индексы с "разной" сортировкой
    #34406921
antand
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да дело не в "жалко" дискового пространства, а в грамотном проектировании.
Вы посчитайте сколько ваш сервер будет данных молотить без толку.
Я же Вам первичный ключ не предлагаю убрать с таблицы.
Про "распределенку" Вы вообще только сейчас сказали, хотя в данном случае не вижу проблем без id.
Вобщем в следующий раз постарайтесь, пожалуйста, сразу "красиво" все описать, чтобы людям понятно было, со всеми ньюансами. И решения "красивые" будут.
...
Рейтинг: 0 / 0
Составные индексы с "разной" сортировкой
    #34407074
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, не получается ничего с вычисляемыми полями. Но это, наверное, и не удивительно. Невозможно, наверное... Т.к. я даже теоретически (уже :)) не представляю, как такую выборку (как в первоначальном вопросе) по индексу выбрать...
...
Рейтинг: 0 / 0
Составные индексы с "разной" сортировкой
    #34409974
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В принципе, у меня возникала похожая задача. Ввиду того, что в АСА нет
встроенного полнотекстового поиска я его соорудил сам. Так вот там была
такая таблица "вхождение словоформ в предложение", предложения - это вторая
таблица, словоформы - третья. Поиск по двум очень популярным словам, но
которые встречаются вместе крайне редко шел очень продолжительное время. Для
таких ситуаций нужно видимо промежуточный слой представления создавать, типа
"парные словосочетания"...Ну мне лень городить такое, так как такого рода
запросы редки и положился на АСА, у него есть своя статистика - пусть сам
выбирает себе дорогу...


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
28 сообщений из 28, показаны все 2 страниц
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Составные индексы с "разной" сортировкой
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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