요구 사항 변경으로 인해 복잡한 SQL where 절이 생겼습니다. 네 가지 기본 사례 집합이 있으며 각각 다른 요소의 다른 조합이 있습니다. 네 가지 경우를 where 절의 별도 분기로 사용하고 각 분기마다 중복 기준을 반복하는 것이 더 읽기 쉽습니다. 그러나 데이터베이스 엔진이 얼마나 잘 최적화 할 것인지 잘 모릅니다.복잡한 SQL where 절 : 논리를 계수 할 것인지 여부
다음은 중복 형식의 표현입니다. 나는 실제 기준을 문자로 바꿨다. A는 네 가지 형태로 제공되는 "분기 (branching)"기준입니다. 별도로 명시하지 않는 한 모든 표현식은 field='value'
형식입니다.
A1 AND B AND C AND D
OR A2 AND B AND C AND D AND E AND F1 AND G
OR A3 AND A3a AND B AND C AND D AND E AND F1 AND G
OR A4 AND B AND C AND D AND F2
A4의 A는 모두 field in ('value1','value2')
입니다. D는 field > 'value'
입니다. G는 field not in (subquery)
의 형식입니다.
다음은 최소한의 중복 양식을 고려한 표현입니다.
B AND C AND D AND (
A1
OR (
E AND F1 AND G AND (
A2
OR (A3 AND A3a)
)
)
OR (A4 AND F2)
내 질문은 내가 가장 간단한 (이상 중복)에이 표현 논리적 양식을 고려하거나 더 중복뿐만 아니라 더 읽을 수있는 형태의에서 그것을 유지하기 위해 확인을인지해야하는지 여부입니다. 대상 데이터베이스는 Sybase이지만 일반적으로 RDMBS에 대한 대답을 알고 싶습니다.
좋습니다. 조건 G가 하위 쿼리를 사용한다는 사실은 UNION 접근법의 효율성이 떨어지게 될까요 (이론적으로 두 개의 SELECT에서 발생하기 때문에), 아니면 데이터베이스 엔진이 이러한 유형의 것을 최적화합니까? –
G의 경우 판단을 내리기 위해 쿼리 자체를 보는 것이 필요합니다. 하위 쿼리가 복잡하면 G는 분리 된 UNION 쿼리에 사용 된 인덱스의 모든 이점을 제거 할 수 있습니다. 어쩌면 전체 테이블 스캔이 더 나을 수도 있습니다. – Quassnoi
하위 쿼리 논리는 간단하지만 테이블이 큽니다. 하위 쿼리는 인덱싱 된 필드에서 선택하므로 너무 나쁘지 않을 수 있습니다. 나는이 특별한 경우가 내가 여러 가지 방법으로 시도해야하고 가장 잘 작동하는 것을 볼 수있는 곳이라고 생각한다. –