Sql 全表扫描或索引扫描
以下查询使用了一个大型Oracle表Sql 全表扫描或索引扫描,sql,oracle,performance,indexing,query-optimization,Sql,Oracle,Performance,Indexing,Query Optimization,以下查询使用了一个大型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
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.field0
和A.field1
上有索引,但在TB
上根本没有索引,那么它是要进行全表扫描还是索引扫描?此外,WHERE
条件是否必要以及由此产生的任何性能影响?由于TB上没有索引,SQL中的SELECT
子查询将对TB进行全表扫描。如果TB表很大,则在TB.field1
上创建索引时,TB.field2
,TB.field3
会显著提高性能。在确定查询的执行计划时会遇到太多因素。我们不知道索引、记录数、群集等。请与您的DBA联系或自己评估执行计划。正确,由于TB上没有索引,因此需要进行完整的表扫描。@Arun谢谢,在全局临时表上放置索引有任何潜在问题吗?我想应该可以,但我不是专家,所以我可能错了。这里有一个讨论这个问题的链接。也许“释放”能给你一些帮助inputs@Dreamer据我所知,与GTT上的索引无关。