代码之家  ›  专栏  ›  技术社区  ›  Eli Courtwright

在Oracle中关闭索引

  •  1
  • Eli Courtwright  · 技术社区  · 16 年前

    为了优化SELECT查询,我在有索引和无索引的情况下运行它们,并测量差异。我运行了一系列不同的类似查询,并尝试选择不同的数据,以确保缓存不会偏离结果。然而,在非常大的表上,创建索引需要很长的时间,对于什么样的索引是合适的,我有几种不同的想法。

    在Oracle(或任何其他数据库)中是否可以执行查询,但在执行查询时告诉数据库不要使用某个索引?或者干脆完全关闭索引,但能够轻松地将其重新打开,而无需重新索引整个表?这将使测试变得更加容易,因为我可以一次创建我所考虑的所有索引,然后使用不同的索引尝试我的查询。

    3 回复  |  直到 16 年前
        1
  •  9
  •   thecoop    16 年前

    ALTER INDEX idx1 [ INVISIBLE | VISIBLE ]
    

    这使得优化器无法使用它,但oracle在添加或删除数据时仍会更新索引。这使得在禁用索引的情况下测试性能变得很容易,而无需删除&重建整个索引。

    看见 here 用于oracle文档的索引可见性

        2
  •  3
  •   dpbradley    16 年前

    您可以在查询中使用NO_INDEX提示来忽略索引-有关更多详细信息,请参阅文档。SQL Access Advisor是一个Oracle实用工具,它将推荐索引策略。

        3
  •  3
  •   Amit    16 年前

    您可以这样编写查询:它不会使用索引(使用表达式而不是值)

    Select * from foobar where column1 = 'result'  --uses index on column1
    

    避免对数字和varchar使用索引

    Select * from foobar where column1 + 0 = 5 -- simple expression to disable the index
    
    Select * from foobar where column1 || '' = 'result' --simple expression to disable the index
    

    Select * from foobar where nvl(column1,column1) = 'result' --i love this way :D
    

    /* Index(E employee_id) */ 另外,这是Dan Tow的书《SQL调优》中的全部内容。几天前我开始读它:)