【问题标题】:Oracle Query in full table scan全表扫描中的 Oracle 查询
【发布时间】:2014-07-02 14:16:36
【问题描述】:

我不明白为什么这个(按范围分区)表在这个查询中是全表扫描:

UPDATE customer_table
   SET username = '',
       phone = '',
       ip = '',
       cell = '',
       channel = ''
 WHERE id = '';

我也创建了这个索引:

CREATE INDEX customer_table_UPD_EXT_SYS ON customer_table
(USERNAME, CLI, IP, MSISDN, CANALE, TN)

谁能帮帮我?

【问题讨论】:

  • 您需要更多信息。例如,如果customer_table 非常小,那么全表扫描是实现查询的最有效方式。此外,如果id 是一个字符串,那么id = '' 在Oracle 中永远不会计算为真,因为空字符串被视为NULL(默认情况下)。
  • 您好,这张表每个分区大约有100万条记录,所以必须避免全表扫描。在查询中,我插入了值 '',但在实际查询中,它们将被 valorized

标签: sql oracle sql-execution-plan


【解决方案1】:

为避免全表扫描,索引必须(至少部分)匹配WHERE 子句。在您的示例中,customer_table.id 上的索引会有所帮助。您的索引customer_table_UPD_EXT_SYS 包含更新的列;关于您的UPDATE 声明,这实际上是个坏消息,因为索引也需要更新,这可能比更新表更昂贵。

【讨论】:

  • 我还有 id 上的索引:CREATE INDEX customer_table_TN ON customer_table (ID) 那么,你建议我删除更新语句上的索引(不是 where 条件)吗?
  • 如果其他查询不需要它,请放弃它。也就是说,where id = '' 在 Oracle 中是完全没有意义的 where 子句,因为在 Oracle 中,空字符串为空。要选择带有空 id 的行,where 子句必须是 where id is null。不幸的是,这个where 子句也不会使用customer_table_TN index。请参阅 use-the-index-luke.com/sql/where-clause/null/index 如何解决此问题。
猜你喜欢
  • 2011-11-01
  • 1970-01-01
  • 2014-08-21
  • 1970-01-01
  • 2015-12-04
  • 1970-01-01
  • 2012-02-04
  • 2013-10-01
  • 2017-10-22
相关资源
最近更新 更多