2009-09-15 2 views
0
다음 쿼리 ( V_TITRATION_RESULTS)는보기가 약 20,000 행을 리턴하는 행에 열 피벗을 사용하는 것입니다

:튜닝 행 - 투 -부터 Cols 쿼리

SELECT test.created_on as "Created On", 
     r_titr as "Titrator", 
     r_fact as "Factor" 
    FROM (SELECT test_id, 
       MAX(CASE WHEN result_tmpl_id = 2484 THEN result END) r_titr, 
       MAX(CASE WHEN result_tmpl_id = 2483 THEN result END) r_fact 
      FROM (SELECT lims.test.* 
        FROM lims.test 
       WHERE test_tmpl_id = 867) 
      JOIN lims.result USING (test_id) 
     GROUP BY test_id) 
    JOIN lims.test test USING (test_id) 
난 단지 돌아보기에 검색하고자하는

9 월 초부터 시험 :

SELECT * FROM V_TITRATION_RESULTS WHERE "Created On" > DATE '2009-09-01' 

다음은보기 및 필터링 된 쿼리 모두 동일하며, 두 쿼리에 대한 추적 통계 (아래) 행이 될 때까지 필터링되지 않습니다 나타내는 유사하다 '계획 GET' 그들은 모두 처리되었습니다.

    VIEW  Filtered  Diff 
Physical Reads 81730  83946  2216 
Logical Reads 364488  344063 -20425 
Sort Rows  632194  632193  -1 
ROWID Gets  580778  580778   0 
Chained Gets  101823  101823   0 
Memory (kB)   307   324  17 
Scan Rows    3   3   0 
Scan Gets    3   3   0 
Sorts In Mem   4   4   0 
Temp Segments   1   1   0 
Scan Short   3   3   0 
CPU Total (sec) 8.13   7.3  -0.83 
First Row  2m 12s  2m 40s  
Last Row   18s   0s  
WHERE 조건이 행에 열 선회하기 전에 테스트를 필터링 할 수 있도록

어떻게 내 시야를 다시 작성할 수 있습니다?

+0

버전은 무엇? –

답변

3

스티븐, 나는 궁금하네요 :

CREATE OR REPLACE VIEW V_TITRATION_RESULTS AS 
    SELECT lt.test_id, 
     lt.created_on, 
     MAX(CASE WHEN result_tmpl_id = 2484 THEN result END) 'titrator', 
     MAX(CASE WHEN result_tmpl_id = 2483 THEN result END) 'factor' 
    FROM lims.test lt 
    JOIN lims.result USING (test_id) 
    WHERE lt.test_tmpl_id = 867 
GROUP BY lt.test_id, lt.created_on 

는 쿼리 성능을 향상 할 부속 선택을 제거하기. 오라클 9i + - 당신이보기에서 Subquery Factoring (WITH clause)을 사용할 수 있다고 생각하십시오.

그럼 당신은 사용할 수 있습니다 : 오라클의

SELECT vtr.* 
    FROM V_TITRATION_RESULTS vtr 
WHERE vtr.created_on > TO_DATE('2009-09-01', 'YYYY-MM-DD') 
+0

좋은 물건 .... 고체 –

+0

@ David : 고마워. –

+0

여러 다른 테스트 필드 (10이라고 가정 해 봅시다)가 필요한 경우 PK (test_id)로만 그룹화하는 것만으로도 가장 효율적인 (필터링 허용) 모든 필요한 열로 그룹화합니까? – Steven

1

이것은 약간의 영역이지만, 성능을 향상시키는 수단으로 SELECT 문에서 리터럴 대신 바인드 변수를 사용하십시오.

http://www.akadia.com/services/ora_bind_variables.htmlhttp://www.dba-oracle.com/concepts/views.htm을 참조하십시오. 특히, 술어 푸시의 섹션이 관심의 대상이 될 수 있습니다. 당신이 사용할 수없는 이유

+0

@David : VIEW –

+0

에서 바인드 변수를 사용할 수 없습니다. @rexem : 뷰 자체가 아니고 뷰를 참조하는 SELECT 문에 있습니다. –

+0

@David : 충분히 공정하지만, 무엇보다도 먼저 최적화해야하는 견해입니다. –