2012-11-22 2 views
0

APEX 페이지에 보고서가 있으며 10,000-2,000,000 (1M) 레코드 사이의 결과에서 행 수가 여러 개인 열이 있습니다. 내가 믿는페이지 항목의 부울 값 평가가 올바르지 않습니다.

SELECT 
    ... 
FROM ... 
WHERE ... 
AND (:P2_STARTDATE IS NULL OR TO_DATE(:P2_STARTDATE, 'DD-MON-YYYY HH24:MI:SS') < creation_date) 

: 그것은 다음과 같이 보입니다 ...

내가 가진 절 그 곳 조건이있다, 그것은 결정하거나 표시되는 결과를 제한하기 위해 페이지 항목의 값을 사용 언제든지 P2_STARTDATE 페이지 항목의 값을 입력하면 비교가 수행되지만 페이지 항목의 값을 입력하지 않으면 NULL이되고 부울 연산은 P2_STARTDATE IS NULL 평가에 대해 TRUE를 반환해야합니다. ..

쿼리를 실행하면 실행 시간이 단축됩니다. 0.5M 행에서 검색 할 때 45 초 이상 걸릴 수 있습니다. 이는 허용되지 않습니다. 내 이론을 테스트하기 위해 다음과 같은 변화를 썼다 : 다음 값을 설정하는 경우 NULL로 즉시 평가하고 동일한 결과 집합의 0.5M를 반환 + 1 초에

SELECT 
    ... 
FROM ... 
WHERE deleted_flag = 'N' 
AND (:P2_STARTDATE IS NULL) -- comment the rest of the evaluation.... 

을 ... 지금, 결과 집합은 비어 명백하게.

그러면 Oracle APEX가 어떻게 표현을 TRUE로 신속하게 평가할 수 있습니까? 제공 할 수있는 모든 팁, 해결 방법 또는 솔루션을 제공해 주셔서 감사합니다.

+0

가 확실 P2_STARTDATE 정말 NULL되어 있는지 확인하기 위해 세션 상태 정보를 확인해 봤어? 디버그 로그는 어때? sqlplus에서 동일한 쿼리를 실행하여 오랜 시간이 걸리는 지 확인해 보셨습니까? – eaolson

+0

Hey @eaolson, 세션을 P2_STARTDATE 값으로 검사 할 때 그냥 비어 있고 상태는 _Updated_ 또는 _Reset to Null _... –

+0

그냥 잠깐 : '부분 페이지 새로 고침'을 설정하여 보고서를 설정 했습니까? = '예'? 그렇다면 '제출할 페이지 항목'에 P2_STARTDATE를 포함 시켰습니까? –

답변

0

쿼리의 두 번째 부분이 sargeable이라고 생각하지 않습니다. 인덱스를 사용할 수 없습니다. 또한 예제는 실제 결과 집합을 검색하는 것과는 아무런 관련이 없습니다.

한 가지 방법은 (오른쪽, CREATION_DATE에 인덱스가?) 쿼리가 CREATION_DATE에 인덱스를 사용할 수있게되도록, 올바른 데이터 형 (이 쿼리의 바깥) 바인딩 변수를 변환하는 것입니다

SELECT 
    ... 
FROM ... 
WHERE ... 
AND :P2_STARTDATE IS NULL OR creation_date > :newdatevariable; 

어떤 경우에도 to_date 함수를 가져 와서 상수를 전달하십시오.

+0

Jim, 제 질문은 반드시 sargeable 또는 유용한 인덱스가 아니라, WHERE 절과 페이지 항목이 검사되는 값의 적절한/부적절한 평가와 관련이 있습니다. 그리고 네, creation_date 필드에 대한 인덱스가 있습니다. :) –

+0

내가 겪고있는 문제는 NULL이긴하지만 방금 TRUE를 반환 했음에도 불구하고 엔진이 page_value 필드에 대해 creation_date 필드를 평가하는 것 같습니다. NULL에 대해 평가 될 때. –

1

SQL 엔진이 OR에서 단락 회로 평가를 사용한다고 가정하는 것이 안전하지 않은지 잘 모르겠습니다.

이 시도 :

AND (:P2_STARTDATE IS NULL 
    OR 
     (:P2_STARTDATE IS NOT NULL 
     AND TO_DATE(:P2_STARTDATE, 'DD-MON-YYYY HH24:MI:SS') < creation_date) 
    )