В мире RDBMS
я бы не стал беспокоиться о избыточности, эффективность здесь важнее.
В вашем случае я бы UNION
ответил на все четыре запроса, используя A
в качестве верхнего условия, например:
SELECT *
FROM mytable
WHERE A1 AND B AND C
UNION
SELECT *
FROM mytable
WHERE A2 AND B AND C AND D AND E AND F1 AND G
…
Я не изучал Sybase
более 7
лет, но во всех основных RDBMS
UNION
более эффективны, чем OR
.
См. Эту статью в моем блоге для подхода к проблеме силимара в Oracle
:
, а также эта статья для сравнения UNION
против OR
в MySQL
:
- Выбор друзей : эффективность
UNION
по сравнению с OR
в MySQL
Я думаю, что эти подходы будут хорошо работать и для Sybase
.
Вам также необходимо создать индексы для столбцов, используемых в ваших условиях, чтобы воспользоваться UNION
Обновление:
Поскольку условие G
является подзапросом, вероятно, может потребоваться HASH JOIN
для быстрого выполнения. HASH JOIN
требует полного сканирования всех нефильтрованных значений, поэтому может быть лучше отфильтровать все значения в одном полном сканировании, а затем выполнить HASH JOIN
:
SELECT *
FROM (
SELECT *
FROM foo
WHERE condition_set_1
UNION
SELECT *
FROM foo
WHERE condition_set_2_but_no_g
…
) q
WHERE G
Чтобы сделать какие-либо дальнейшие суждения, будет действительно лучше увидеть сам запрос.