Регистрация

Статья: "ABL триггеры и индексы"

Готовим статьи для FAQ
Администратор
Аватара пользователя
Сообщения: 1873
Зарегистрирован: Пт мар 25, 2005 6:05 pm
Откуда: Progress Technologies

Статья: "ABL триггеры и индексы"

Сообщение Arelav » Пн июн 29, 2009 10:18 pm


Старожил
Сообщения: 104
Зарегистрирован: Сб ноя 05, 2005 2:18 pm

Сообщение koff » Вт июн 30, 2009 12:10 pm

Ниче так. Кое о чем не знал, особенно про триггеры.

Старожил
Аватара пользователя
Сообщения: 2871
Зарегистрирован: Ср май 12, 2004 6:03 pm
Откуда: Питер

Re: Статья: "ABL триггеры и индексы"

Сообщение George » Вт июн 30, 2009 3:33 pm

Валера, мои комментарии не в плане критики, а просто мысли по поводу... Да что там - просто занудные и незначительные уточнения. :)

Arelav писал(а):Если индекс содержит неизвестное значение (?), то при сортировке AVM оценивает их выше, чем любое другое значение.

На самом деле в Progress'е есть еще три специфических значения (они, вообще-то, не должны быть доступны в 4GL, но таки доступны). Два из этих трех значений сортируются выше неопределенного значения. Третье значение ("минус бесконечность") сортируется ниже любого другого.
Однако запрос ниже отобразит нулевые записи, потому что Cust-num это выбранный для запроса индекс. Так как индекс ZIP не является выбранным индексом, неизвестное значение (?) не будет сортироваться, и вторая часть запроса будет ложью. Никакие записи не возвращаются, когда одна часть AND это FALSE:
[code]
FOR EACH cust WHERE cust-num >10 AND cust-num <AND>0 AND zip </code>10), но в окончательную выборку они не попадут (т.е. не будут доступны клиенту) потому, что в этом случае условие WHERE оценивается в конце еще и как просто 4GL выражение, а сравнение (больше/меньше) любого значение с неопределнным всегда не-TRUE.

Вообщем лучше всего не играть с исключительностью неопределенного значения при сортировках, а то можно нарваться на сюрпризы. :wink:
Значения для индексированных полей обычно сохраняются как все прописные буквы.

Значения всех полей сохраняются как они были указаны при вводе. Ты наверно имеешь ввиду значение компонент в индексном ключе. Для символьных полей компонента индекса равна значению самого поля пропущенного через collation tables (case-insensitive-sort/case-sensitive-sort в _tran.df), т.е. индексная компонента - это весовой коэффициент значения поля. Утилиты вроде idxfix могут дешифровать эти индесные компоненты обратно в значение поля. Значения поля, нечувствительные к регистру, при этом восстанавливаются в верхнем регистре, но лишь потому, что одному и тому же весовому коэффициенту (в индексной компоненте) соответствует более одного символа (может и более двух) и Progress выбирает первый из них. При стандартной таблице case-insensitive-sort первым оказывается символ в верхнем регистре. Можно "поколдовать" над таблицей case-insensitive-sort и компоненты будут "дешифровываться" уже в нижнем регистре.

А вот при работе оператора BEGINS значение поля сначало действительно преобразуется в верхний регистр. Но если таблицы в _tran.df правильные, то нам это и не заметно. :roll:

Старожил
Аватара пользователя
Сообщения: 1016
Зарегистрирован: Чт авг 04, 2005 5:19 pm
Откуда: Pennsylvania, USA

Сообщение dmitri » Вт июн 30, 2009 7:39 pm

Эта особенность прогресса, что значение компонент в индексном ключе case-insensitive, приводит к осложнениям в работе DataServer-ов. Oracle и иже с ним, имеют case-sensitive data and indexes. Таким образом Progress DataServer приходится строить отдельно case-insensitive index для эмуляции работы как будто обычный Прогресс.

Старожил
Сообщения: 174
Зарегистрирован: Ср апр 20, 2005 5:21 pm

Сообщение sign » Ср июл 01, 2009 2:08 am

Спасибо, интересная статья.

Может быть имеет смысл упомянуть про некоторые "особенности" прогресс.

Про логические поля, что для них нужно указывать явный знак равенства. По условию "where logical-field" индекс не включится. По условию "where logical-field = true" индекс включится.

Про то, что использование can-find отключает множественное использование индексов.

Может быть имеет смысл явно указать, про преобразование запросов, чтобы включалось множественное использование индексов. Например для индекса по двум полям a, b, преобразуем запрос where a = "a1" and ((b = "b1") or (b = "b2")) в запрос where (a = "a1" and b = "b1") or (a = "a1" or b = "b2")

Про "бесконечный" for each который может возникнуть в случае, если мы попытаемся обновлять поле, входящее в индекс, используемый в запросе for each.

Про то, что содержимое записи может не соответствовать условию поиска при поиске вида find table no-lock where field = value. Мы можем в результате такого поиска получить в буфере запись, у которой значение field будет отлично от value.

Администратор
Аватара пользователя
Сообщения: 1873
Зарегистрирован: Пт мар 25, 2005 6:05 pm
Откуда: Progress Technologies

Сообщение Arelav » Ср июл 01, 2009 8:43 am

Спасибо всем за отзывы!

Ура! Наконец-то хоть какая-то статья вызвала реакцию народа :)
Спасибо!

Теперь о главном.
Как говорится "один в поле не воин". Поэтому есть предложение к George`у и к Sign`у, давайте я вышлю Вам оригинал статьи, вы ее отредактируете, или скажем, просто вышлите мне ваш текст с указанием в какую часть статьи внедрить эту информацию.
Я внесу изменения, и укажу Вас в качестве редакторов. Таким образом, совместно у нас получится хороший материал.

Как Вам идея?

Старожил
Аватара пользователя
Сообщения: 2871
Зарегистрирован: Ср май 12, 2004 6:03 pm
Откуда: Питер

Сообщение George » Ср июл 01, 2009 9:48 am

Валера, если бы у меня оставалось внутренняя энергия на подобные проекты, то я бы предпочел, например, реализовать программные проекты, которые пытался инициировать здесь же на форуме. А помимо озвученных тем есть еще и другие идеи по инструментарию, который можно было бы написать. По трудозатратам это было бы сопоставимо с написанием статей. Но, как видно, не судьба... :cry:

Старожил
Аватара пользователя
Сообщения: 1016
Зарегистрирован: Чт авг 04, 2005 5:19 pm
Откуда: Pennsylvania, USA

Сообщение dmitri » Ср июл 01, 2009 7:52 pm

Похоже нужен творческий отпуск. Такое практикуется на 1/6 части планеты ?

Старожил
Сообщения: 174
Зарегистрирован: Ср апр 20, 2005 5:21 pm

Сообщение sign » Чт июл 02, 2009 10:52 pm

Arelav писал(а):Спасибо всем за отзывы!

Ура! Наконец-то хоть какая-то статья вызвала реакцию народа :)
Спасибо!

Теперь о главном.
Как говорится "один в поле не воин". Поэтому есть предложение к George`у и к Sign`у, давайте я вышлю Вам оригинал статьи, вы ее отредактируете, или скажем, просто вышлите мне ваш текст с указанием в какую часть статьи внедрить эту информацию.
Я внесу изменения, и укажу Вас в качестве редакторов. Таким образом, совместно у нас получится хороший материал.

Как Вам идея?


Спасибо за предложение.

К сожалению, непосредственно в написании статьи помочь не смогу. Это требует времени больше, чем я мог бы на это выделить.

Вернуться в СТАТЬИ

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1