2017-04-07 117 views
1

有一个大型Oracle表A和下面的查询使用比较大的全局临时表TB全表扫描或索引扫描

UPDATE A 
SET  A.field0 = (SELECT SUM(TB.field0) 
        FROM TB 
        WHERE TB.field1 = A.field1 AND 
          TB.field2 = A.field2 AND 
          TB.field3 = 'value') 
WHERE EXIST (SELECT 1 
       FROM TB 
       WHERE TB.field1 = A.field1 AND 
         TB.field2 = A.field2 AND 
         TB.field3 = 'value'); 

基本上EXIST条件只是用来检查记录曾经存在过。现在对于这个查询,如果A.field0A.field1上有索引,但是根本没有TB上的索引,它会执行全表扫描还是索引扫描?此外,是否需要WHERE条件以及它的任何性能影响?

+2

确定查询的执行计划时会遇到太多因素。我们不知道索引,记录数量,集群等。与您的DBA交谈或亲自评估执行计划。 – Cameron

回答

1

由于TB上没有索引,因此SQL中的SELECT子查询将用于TB上的全表扫描。如果TB表很大,在TB.field1上创建索引,TB.field2,TB.field3应该会显着提高性能。

+0

正确,没有TB的索引,需要全表扫描。 – unleashed

+0

@Arun谢谢,将索引放在全局临时表上的任何潜在问题? – Dreamer

+1

我认为应该没问题,但我不是专家,所以我可能会错。这里是一个链接,讨论这个http://stackoverflow.com/questions/941094/is-it-safe-to-put-an-index-on-an-oracle-temporary-table。也许@unleashed可以提供一些输入 –