Настройка строк в Cols Query - PullRequest
       15

Настройка строк в Cols Query

0 голосов
/ 16 сентября 2009

Следующий запрос (V_TITRATION_RESULTS) представляет собой представление, использующее сводку строк к столбцам, которая возвращает около 20 000 строк:

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)

Я бы хотел выполнить поиск по представлению, возвращающему только тесты с начала сентября:

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

«GET PLAN» для представления и отфильтрованного запроса идентичны, а статистика трассировки (ниже) для обоих запросов аналогична, что указывает на то, что строки не отфильтрованы до тех пор, пока они не будут обработаны.

                   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 отфильтровывало тесты перед поворотом строки к столбцу?

Ответы [ 2 ]

3 голосов
/ 16 сентября 2009

Стивен, мне интересно, почему ты не можешь использовать:

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

Избавление от подвыборов повысит производительность запросов. Предполагая Oracle 9i + - учтите, что вы можете использовать Факторинг подзапроса (предложение WITH) в представлениях.

Тогда вы можете использовать:

SELECT vtr.* 
  FROM V_TITRATION_RESULTS vtr
 WHERE vtr.created_on > TO_DATE('2009-09-01', 'YYYY-MM-DD')
1 голос
/ 16 сентября 2009

Это немного за пределами моей территории, но, пожалуйста, обратите внимание на использование переменных связывания вместо литералов в вашем операторе SELECT в качестве средства повышения производительности.

См. http://www.akadia.com/services/ora_bind_variables.html и http://www.dba -oracle.com / concepts / views.htm . В частности, вам может быть интересен раздел толкания предикатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...