|
|
|
Поиск по произвольному набору условий
|
|||
|---|---|---|---|
|
#18+
Может быть вопрос не совсем по теме форума, но поскольку система будет писаться на ASA 9.0.1 и соответственно будут работать особенности оптимизатора запросов именно этого сервера, пишу сюда. :) Описание условий: Классическая стурктура для хранения информации по учету заключения договоров - справочники фирм, справочники физ. лиц, информация о платежах, прочие реквизиты договоров. Основная таблица - договор, который как сам содержит ссылки на участников договора, так и на него ссылаются другие таблицы, например платежи. Задача: Нужно реализовать универсальный механизм поиска данных по произвольному набору реквизитов, касающихся договора, например: по дате заключения; дате рождения человека, заключающего договор; сумме платежа; дате платежа и т.п. Набор возвращаемых полей постоянный, т.е. меняются только условия поиска. Поскольку информация хранится в разных таблицах, первое, что приходит в голову - создать view, в котором выбираются поля для отображения, а условия поиска подключать коррелированными подзапросами с условием and exists (select 1 from table1 where table_id = view_id) Такое было успешно проделано и работает в других системах по сей день. Не устраивает то, что иногда приходится очень сложно описывать эти самые подзапросы и кроме того, если искать по большому набору реквизитов, возникают опасения насчет скорости работы такого запроса при большом объеме базы. Решал ли кто-нибудь подобные задачи и как выходил из положения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2004, 13:47 |
|
||
|
Поиск по произвольному набору условий
|
|||
|---|---|---|---|
|
#18+
Если это будет "Классическая стурктура для хранения информации", то Вам нужен не ASA, а IQ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2004, 17:43 |
|
||
|
Поиск по произвольному набору условий
|
|||
|---|---|---|---|
|
#18+
У меня такое реализовано очень просто: 1. Есть глобальная темповая таблица с полем ID 2. В нее клиент выбирает все подходящие под фильтр ID: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 4. Если подтверждение получено, то далее делаем что надо, используя ID с глобальной временной таблицы. Схема прекрасно работает, не смотря на то, что в запросе перечислены все таблицы и из них может быть в фильтре потребуется только одна. Оптимизатор ASA выкидывает из построения плана запроса ненужные таблицы и соотвествующе скорость работы будет нормальной. Ну а поиск по условиям фильтра естественно разруливается с помощью соответствующих индексов. В клиентской части для Delphi у меня даже написан специальный компонент, который позволяет регистрировать группы условий фильтра, универсально запрашивать параметры каждой группы условий и централизованно все обрабатывать. Сейчас вот буду переписывать его на PB. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2004, 18:47 |
|
||
|
Поиск по произвольному набору условий
|
|||
|---|---|---|---|
|
#18+
ASCRUSСхема прекрасно работает, не смотря на то, что в запросе перечислены все таблицы и из них может быть в фильтре потребуется только одна. Оптимизатор ASA выкидывает из построения плана запроса ненужные таблицы и соотвествующе скорость работы будет нормальной. Примерно такой же вариант я когда-то делал для ASE, но там оптимизатор работает немного иначе и не всегда использовались те индексы, на которые я рассчитывал, приходилось указывать их явно и универсальность постепенно терялась. Здесь вроде бы ситуация с оптимизацией получше. Возник такой вопрос: насколько я знаю, для ASA по умолчанию INNER JOIN = KEY JOIN, т.е. это получается строгий поиск, когда выполняются все условия и данные есть во всех связываемых таблицах. Не совсем ясно, что произойдет, если в одной из объединяемых таблиц нет данных по логической связке и в данном наборе условий поиска ее поля не используются? Например, если в схеме Код: plaintext 1. 2. 3. 4. 5. еще нет платежей, но нужно найти все договора с определенным участником. Выкинет ли оптимизатор эту таблицу и вернет какой-то набор данных или все-таки ничего не вернет? К тому же, "аппетит приходит во время еды" :), заказчик сказал, что было бы неплохо еще реализовать возможность указывать приоритет критерия, по принципу "важно" - "не важно", чтобы одни условия поиска учитывались строго, а другие - нет, в этом случае такой подход, скорее всего, не сработает. Хотя это было просто пожелание, а не требование и в ТЗ не будет включено, хотелось бы найти решение и такой задачи. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2004, 07:29 |
|
||
|
Поиск по произвольному набору условий
|
|||
|---|---|---|---|
|
#18+
авторВозник такой вопрос: насколько я знаю, для ASA по умолчанию INNER JOIN = KEY JOIN, т.е. это получается строгий поиск, когда выполняются все условия и данные есть во всех связываемых таблицах. Не совсем ясно, что произойдет, если в одной из объединяемых таблиц нет данных по логической связке и в данном наборе условий поиска ее поля не используются? Для таких случаев нужно использовать [KEY] LEFT JOIN. Соответствующе если в WHERE ничего на таблицу указано не будет, оптимизатор ее выкинет из плана запроса, если будет, то включит и использует так же, как и INNER JOIN. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2004, 10:00 |
|
||
|
|

start [/forum/topic.php?fid=55&fpage=127&tid=2014585]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
63ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
76ms |
get tp. blocked users: |
1ms |
| others: | 235ms |
| total: | 419ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...