全表扫描或索引扫描
Posted
技术标签:
【中文标题】全表扫描或索引扫描【英文标题】:Full table scan or index scan 【发布时间】:2017-04-07 16:19:17 【问题描述】:以下查询使用了一个较大的 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.field0
和A.field1
上有索引,但TB
上根本没有索引,它会进行全表扫描还是索引扫描?此外,WHERE
条件是否必要以及它对性能有何影响?
【问题讨论】:
决定查询执行计划的因素太多。我们不知道索引、记录数、集群等。请与您的 DBA 交谈或自己评估执行计划。 【参考方案1】:由于TB
上没有索引,SQL 中的SELECT
子查询将对 TB 进行全表扫描。如果 TB 表很大,在 TB.field1
、TB.field2
、TB.field3
上创建索引应该会显着提高性能。
【讨论】:
正确,TB上没有索引,需要全表扫描。 @Arun 谢谢,对在全局临时表上放置索引有任何潜在的担忧吗? 我认为应该没问题,但我不是专家,所以我可能错了。这是讨论此***.com/questions/941094/… 的链接。也许@unleashed 可以提供一些输入 @Dreamer 我不担心与 GTT 的索引有关。以上是关于全表扫描或索引扫描的主要内容,如果未能解决你的问题,请参考以下文章