【问题标题】: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 交谈或自己评估执行计划。

标签: sql oracle performance indexing query-optimization


【解决方案1】:

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

【讨论】:

  • 正确,TB上没有索引,需要全表扫描。
  • @Arun 谢谢,对在全局临时表上放置索引有任何潜在的担忧吗?
  • 我认为应该没问题,但我不是专家,所以我可能错了。这是讨论此stackoverflow.com/questions/941094/… 的链接。也许@unleashed 可以提供一些输入
  • @Dreamer 我不担心与 GTT 的索引有关。
猜你喜欢
  • 1970-01-01
  • 2016-11-24
  • 1970-01-01
  • 2012-01-31
  • 2011-06-28
  • 2011-03-12
  • 2013-10-01
  • 1970-01-01
  • 2021-08-12
相关资源
最近更新 更多