Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Поиск по произвольному набору условий / 6 сообщений из 6, страница 1 из 1
18.03.2004, 13:47
    #32447231
Andyn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по произвольному набору условий
Может быть вопрос не совсем по теме форума, но поскольку система будет писаться на ASA 9.0.1 и соответственно будут работать особенности оптимизатора запросов именно этого сервера, пишу сюда. :)

Описание условий:

Классическая стурктура для хранения информации по учету заключения договоров - справочники фирм, справочники физ. лиц, информация о платежах, прочие реквизиты договоров. Основная таблица - договор, который как сам содержит ссылки на участников договора, так и на него ссылаются другие таблицы, например платежи.

Задача:

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

Поскольку информация хранится в разных таблицах, первое, что приходит в голову - создать view, в котором выбираются поля для отображения, а условия поиска подключать коррелированными подзапросами с условием

and exists (select 1 from table1 where table_id = view_id)

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

Решал ли кто-нибудь подобные задачи и как выходил из положения?
...
Рейтинг: 0 / 0
18.03.2004, 17:43
    #32447888
Guset
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по произвольному набору условий
Если это будет "Классическая стурктура для хранения информации", то Вам нужен не ASA, а IQ.
...
Рейтинг: 0 / 0
18.03.2004, 18:47
    #32448050
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по произвольному набору условий
У меня такое реализовано очень просто:
1. Есть глобальная темповая таблица с полем ID
2. В нее клиент выбирает все подходящие под фильтр ID:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
INSERT INTO  "Filter"  (ID)
SELECT DISTINCT Table1.ID
FROM Table1
  INNER JOIN Table2
  INNER JOIN Table3
  ...и так далее
WHERE ... сюда пишутся все нужные условия клиентом

SELECT @@ROWCOUNT AS RowCount; // кол-во выбранных
3. Если чего то выбрано, клиент спрашивает подтверждение у пользователя
4. Если подтверждение получено, то далее делаем что надо, используя ID с глобальной временной таблицы.

Схема прекрасно работает, не смотря на то, что в запросе перечислены все таблицы и из них может быть в фильтре потребуется только одна. Оптимизатор ASA выкидывает из построения плана запроса ненужные таблицы и соотвествующе скорость работы будет нормальной. Ну а поиск по условиям фильтра естественно разруливается с помощью соответствующих индексов.

В клиентской части для Delphi у меня даже написан специальный компонент, который позволяет регистрировать группы условий фильтра, универсально запрашивать параметры каждой группы условий и централизованно все обрабатывать. Сейчас вот буду переписывать его на PB.
...
Рейтинг: 0 / 0
19.03.2004, 07:29
    #32448357
Andyn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по произвольному набору условий
ASCRUSСхема прекрасно работает, не смотря на то, что в запросе перечислены все таблицы и из них может быть в фильтре потребуется только одна. Оптимизатор ASA выкидывает из построения плана запроса ненужные таблицы и соотвествующе скорость работы будет нормальной.

Примерно такой же вариант я когда-то делал для ASE, но там оптимизатор работает немного иначе и не всегда использовались те индексы, на которые я рассчитывал, приходилось указывать их явно и универсальность постепенно терялась. Здесь вроде бы ситуация с оптимизацией получше.

Возник такой вопрос: насколько я знаю, для ASA по умолчанию INNER JOIN = KEY JOIN, т.е. это получается строгий поиск, когда выполняются все условия и данные есть во всех связываемых таблицах. Не совсем ясно, что произойдет, если в одной из объединяемых таблиц нет данных по логической связке и в данном наборе условий поиска ее поля не используются?

Например, если в схеме

Код: plaintext
1.
2.
3.
4.
5.
Участники договора
   |
Договор - Платежи
   |
Условия договора


еще нет платежей, но нужно найти все договора с определенным участником. Выкинет ли оптимизатор эту таблицу и вернет какой-то набор данных или все-таки ничего не вернет?

К тому же, "аппетит приходит во время еды" :), заказчик сказал, что было бы неплохо еще реализовать возможность указывать приоритет критерия, по принципу "важно" - "не важно", чтобы одни условия поиска учитывались строго, а другие - нет, в этом случае такой подход, скорее всего, не сработает. Хотя это было просто пожелание, а не требование и в ТЗ не будет включено, хотелось бы найти решение и такой задачи. :)
...
Рейтинг: 0 / 0
19.03.2004, 10:00
    #32448540
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по произвольному набору условий
авторВозник такой вопрос: насколько я знаю, для ASA по умолчанию INNER JOIN = KEY JOIN, т.е. это получается строгий поиск, когда выполняются все условия и данные есть во всех связываемых таблицах. Не совсем ясно, что произойдет, если в одной из объединяемых таблиц нет данных по логической связке и в данном наборе условий поиска ее поля не используются?
Для таких случаев нужно использовать [KEY] LEFT JOIN. Соответствующе если в WHERE ничего на таблицу указано не будет, оптимизатор ее выкинет из плана запроса, если будет, то включит и использует так же, как и INNER JOIN.
...
Рейтинг: 0 / 0
19.03.2004, 11:48
    #32448895
Andyn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по произвольному набору условий
2 ASCRUS

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


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