0

我正在查询。

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 秒内我得到了我的结果。但如果我添加另一个 AND 函数,则需要 28 分钟才能得到结果。关于这个,他的位置是“--HERE”

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

我不知道为什么它很慢..有人可以帮忙吗?

4

3 回答 3

0
  • 使用DBMS_STATS更新 Oracle 用来决定执行计划的表统计信息
  • 如果这没有帮助,您可以在查询中使用优化器提示将查询优化器的对接踢到正确的方向
于 2013-11-07T12:59:32.907 回答
0

检查你是否有索引

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 花费的时间太长( 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
于 2013-11-07T12:50:40.167 回答
0

您也可以尝试 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
;
于 2013-11-07T13:33:52.507 回答