2013-11-07 3 views
0

Я нахожусь в запросе.Oracle SELECT statement slow

SELECT ttf.default_text 
    FROM test_template_field ttf, TEST t 
WHERE ttf.schema_field_id = 2044 
--HERE 
    AND ttf.test_template_id = t.test_template_id 
    AND t.workflow_node_id IN (
      SELECT wn.workflow_node_id 
      FROM lims_sys.workflow_node wn, lims_sys.workflow_user wu 
      WHERE wn.workflow_id = wu.workflow_id 
      AND wn.workflow_node_type_id = 42 
      AND wu.u_external_category IN ('M')) 
      group by ttf.DEFAULT_TEXT 

Это прекрасно работает, и через 8 секунд я верну свой результат. Но если я добавлю еще одну функцию И, это займет 28 минут, прежде чем я верну свои результаты. Его об этом, его место было «--HERE»

AND ttf.default_text NOT IN ('Preparation Microbiology', 'Other', 'Preparation') 

Я не знаю, почему это медленно .. Может кто-то помочь?

+1

Вы ознакомились с планом объяснения запроса с предложением 'NOT IN' и без него? Вероятно, вы узнаете причину. Скорее всего, это предложение заставляет на столе [полное сканирование таблицы] (http://en.wikipedia.org/wiki/Full_table_scan) (что означает прохождение каждой записи в таблице). Может быть, вам нужен индекс на 'test_template_field.default_text'? –

+0

Есть ли указатель на test_template_field.default_text? Сколько записей в таблице? –

+0

План объяснения сказал: есть полная таблица acces на test_template_field и тест. В тестовой таблице было ОГРОМНОЕ количество данных (более 10000000 записей), а test_template_field - 6980 записей. И нет индекса на test_template_field.default_text. –

ответ

0
  • Использование DBMS_STATS для обновления статистики таблицы, которые Oracle использует, чтобы решить план выполнения
  • Если это не поможет, вы можете использовать optimizer hints в запросе, чтобы оттолкнуть прижим оптимизатора запроса в нужном направлении.
0

Проверьте, если у вас есть indexses на

test_template_field.schema_field_id, test_template_field.test_template_id, test.test_template_id, lims_sys.workflow_node.workflow_id, wu.u_external_category, wn.workflow_node_type_id

Также попробуйте этот запрос

SELECT ttf.default_text 
    FROM test_template_field ttf 
    JOIN TEST t 
    on ttf.test_template_id = t.test_template_id 
    JOIN (SELECT wn.workflow_node_id 
      FROM lims_sys.workflow_node wn 
      JOIN lims_sys.workflow_user wu 
      ON wn.workflow_id = wu.workflow_id 
      AND wu.u_external_category = 'M' 
     WHERE wn.workflow_node_type_id = 42) wni 
    on t.workflow_node_id = wni.workflow_node_id 
WHERE ttf.schema_field_id = 2044 
     AND ttf.default_text NOT IN ('Preparation Microbiology', 'Other', 'Preparation') 
group by ttf.DEFAULT_TEXT 

Похоже, что NOT IN принимает t оо долго (там слишком много строк с ttf.schema_field_id = 2044)

попробовать этот запрос также

SELECT * 
    FROM (SELECT ttf.default_text 
      FROM test_template_field ttf 
      JOIN TEST t 
      on ttf.test_template_id = t.test_template_id 
      JOIN (SELECT wn.workflow_node_id 
       FROM lims_sys.workflow_node wn 
       JOIN lims_sys.workflow_user wu 
        ON wn.workflow_id = wu.workflow_id 
        AND wu.u_external_category = 'M' 
       WHERE wn.workflow_node_type_id = 42) wni 
      on t.workflow_node_id = wni.workflow_node_id 
     WHERE ttf.schema_field_id = 2044) ss 
WHERE ss.default_text NOT IN 
     ('Preparation Microbiology', 'Other', 'Preparation') 
group by ss.DEFAULT_TEXT 
+0

Производительность запроса такая же, как у меня. Также 8 секунд, когда я комментирую «AND ttf.default_text ......». Есть индексы на всех из них. –

+0

и с ttf.default_text какой результат? – ogres

+0

более 20 минут, как у шахты –

0

Als o вы можете попробовать EXISTS:

SELECT ttf.default_text 
    FROM test_template_field ttf, TEST t 
WHERE ttf.schema_field_id = 2044 
    AND ttf.test_template_id = t.test_template_id 
    AND EXISTS 
     (
      SELECT 1 
       FROM lims_sys.workflow_node wn, lims_sys.workflow_user wu 
      WHERE wn.workflow_id = wu.workflow_id 
       AND wn.workflow_node_type_id = 42 
       AND wu.u_external_category = 'M' 
       AND t.workflow_node_id = wn.workflow_node_id) 
GROUP BY ttf.default_text 
; 
Смежные вопросы