【问题标题】:Creating index just for a query in Oracle 10g为 Oracle 10g 中的查询创建索引
【发布时间】:2011-01-01 12:37:46
【问题描述】:

我在 Oracle 10g 的一个特定表中有大约 350 万条记录,我想查询一个特定列具有 NULL 值的所有记录。

我的问题是,是否值得仅出于该查询的目的在该列上创建索引?使用索引节省的时间会补偿创建它所花费的时间吗?或者我应该在没有索引的情况下进行查询?

请注意,我没有提前为我创建索引的选项,如果我确实为查询创建了索引,我必须在之后立即删除它。

p/s:我确实搜索了现有问题,但找不到我想要的答案。请指出我可能错过的任何类似问题。

【问题讨论】:

  • 您希望多久运行一次此查询?此列中有多少行有 NULL?
  • 我们只是说非常非常小,因为我正在加载从其他数据库系统中提取的数据,因此该列中具有 NULL 值的记录是无效的。
  • ...多久(APC 的另一个问题)?

标签: oracle indexing oracle10g


【解决方案1】:

创建索引将比单个查询昂贵得多。如果没有索引,查询将只需要扫描表。建立索引也必须扫描表——然后建立和写入索引。

【讨论】:

  • 我同意一个警告,如果查询涉及需要对表进行多次完整扫描(而不是一次通过)的连接,那么索引可能是值得的。
  • 我决定不创建索引。除非有更好(即清晰和准确)的解释出现,否则我将在几个小时内打勾这个答案:)
【解决方案2】:

如果我没记错的话,Oracle 不会索引 NULL 值;因此,如果将进入索引的所有字段均为 NULL,则该行将没有索引条目。因此,例如,如果您有一个类似的表格

ID      NUMBER PRIMARY KEY
FIELD1  NUMBER
FIELD2  NUMBER

有索引

ID_INDEX (ID) PRIMARY KEY
FIELD1_INDEX (FIELD1)
FIELD2_INDEX (FIELD2)

和数据

ID=1  FIELD1=NULL  FIELD2=1
ID=2  FIELD1=2     FIELD2=NULL
ID=3  FIELD1=3     FIELD2=3
ID=4  FIELD1=NULL  FIELD2=NULL

ID_INDEX 中应该有四个条目,但 FIELD1_INDEX 和 FIELD2_INDEX 中各只有两个。您可以通过查询 DBA_IND_STATISTICS 视图来验证这一点(在收集表统计信息之后):

SELECT * FROM DBA_IND_STATISTICS WHERE TABLE_NAME = 'whatever';

并查看 DISTINCT KEYS 和 NUM_ROWS 列。

从这一切中得出的结论是,如果您有一个在特定列中查找 NULL 值的查询,那么您很可能最终会进行全表扫描。我相信聚集索引实际上可能会索引 NULL 值条目,但我没有使用它们,所以我不确定。

我希望这会有所帮助。

【讨论】:

    【解决方案3】:

    您能否以 NULL 值最终在单个分区中的方式对表进行分区?如果我没记错的话(抱歉,现在无法测试)NULL 值会转到范围分区表中的 MAXVALUE 分区。我认为 Oracle 会很好地消除分区,因此只扫描包含 NULL 值的分区。您只需要选择一个合适的数字作为前一个分区的高值,即可消除大部分或所有不需要的行。

    示例(假设 my_column 是一个数字,您想查找 NULL):

    create table test_table (
      my_column number,
      other_columns ...
    )
    partition by range (my_column)
    (
      partition not_null values less than (99999999999999),
      partition nulls    values less than (MAXVALUE)
    );
    

    然后,如果您“从 my_column 为 null 的 test_table 中选择 *”,则执行计划应仅显示正在扫描的分区“null”(完全扫描,但它主要只包含您想要的内容)。

    如果值可以从 null 更新为非 null,请记住启用行移动,反之亦然。

    【讨论】:

    • 分区是一个昂贵的选项 - 它是企业版许可证的额外收费。此外,它主要不是性能特征。当然,分区修剪可能会改善这个特定的查询,但表的物理重组可能会降低其他查询的性能。
    【解决方案4】:

    如果您有企业版并且您有一个多 CPU 系统,那么您应该考虑使用并行查询。这是从全表扫描中获得结果的最快方法,尽管它确实存在管理开销,并且确实需要多个 CPU 的可用性(显然),

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-11
      • 2013-10-31
      • 1970-01-01
      • 2018-08-16
      • 2011-07-14
      • 2013-03-01
      相关资源
      最近更新 更多