为了优化 SELECT 查询,我在使用和不使用索引的情况下运行它们并测量差异。我运行了一堆不同的类似查询并尝试选择不同的数据以确保缓存不会丢弃结果。但是,在非常大的表上,创建索引需要很长时间,而且我对什么样的索引合适有几种不同的想法。
是否可以在 Oracle(或与此相关的任何其他数据库)中执行查询但告诉数据库在执行查询时不要使用某个索引?或者只是完全关闭索引,但能够轻松地将其重新打开而无需重新索引整个表?这将使测试变得更加容易,因为我可以同时创建我正在考虑的所有索引,然后使用不同的索引尝试我的查询。
或者,是否有更好的方法来优化大型表的查询并了解最好创建哪些索引?
最佳答案
可以在11g中设置索引可见性-
ALTER INDEX idx1 [ INVISIBLE | VISIBLE ]
这使得它无法被优化器使用,但是 oracle 仍然会在添加或删除数据时更新索引。这使得在禁用索引的情况下测试性能变得容易,而无需删除和重建整个索引。
参见 here有关索引可见性的 oracle 文档
https://stackoverflow.com/questions/1840286/