全表扫描或索引扫描

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.field0A.field1 上有索引,但TB 上根本没有索引,它会进行全表扫描还是索引扫描?此外,WHERE 条件是否必要以及它对性能有何影响?

【问题讨论】:

决定查询执行计划的因素太多。我们不知道索引、记录数、集群等。请与您的 DBA 交谈或自己评估执行计划。 【参考方案1】:

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

【讨论】:

正确,TB上没有索引,需要全表扫描。 @Arun 谢谢,对在全局临时表上放置索引有任何潜在的担忧吗? 我认为应该没问题,但我不是专家,所以我可能错了。这是讨论此***.com/questions/941094/… 的链接。也许@unleashed 可以提供一些输入 @Dreamer 我不担心与 GTT 的索引有关。

以上是关于全表扫描或索引扫描的主要内容,如果未能解决你的问题,请参考以下文章

为啥 oracle 表索引但仍然进行全表扫描?

SQL 数据优化索引建suo避免全表扫描

SQL 数据优化索引建suo避免全表扫描

数据库优化 -索引-避免全表扫描

技术分享 为啥 SELECT 查询选择全表扫描,而不走索引?

mysql 全表扫描场景