oracle - 索引与完整扫描,我如何确定使用哪个以及何时使用
问题描述
是否有关于何时使用完整扫描而不是索引的经验法则?我是甲骨文的新手,但我仍在努力将注意力集中在性能调优上。谢谢!
解决方案
优化器的目的是为您做出这些决定。当然它并不总是正确的,但通常我会让优化器为我完成所有繁重的工作,只担心它出错的问题,我不得不“干预”可以这么说。
但就全扫描与索引而言,我鼓励您不要用这些术语来思考,仅仅因为您的客户和您的应用程序不在乎。客户关心的是响应时间,所以这里的驱动因素应该始终是响应时间。
如果对于查询 1,完全扫描比索引扫描快,那么完全扫描是更好的选择。与索引扫描相比,这并不能使完整扫描“始终”或以某种方式“哲学上”或“技术上”更好。它只是意味着对于这个查询,最好是完全扫描。
如果对于另一个查询,索引更好,那么无论如何,我们应该使用索引。
通常会在书籍和博客文章中看到建议,说“在计划中查找 TABLE ACCESS FULL - 这很糟糕”,等等。我认为那是BS。无论执行计划如何为您的查询提供最佳性能,都是最好的……无论它使用索引扫描、完整扫描还是任何其他形式的优化器路径。
如果您想更全面地了解 SQL 调优,我在这里写了一个由四部分组成的系列https://connor-mcdonald.com/2019/10/24/the-holistic-sql-tuning-series/
推荐阅读
- c++ - 转换 unique_ptr
到 unique_ptr - javascript - 使用 JQuery 在 Word Web 插件中选择文本
- apache-nifi - 流文件的颠簸转换
- chart.js - Chartjs - 具有多级 x 轴的条形图的数据格式
- c# - Ajax.BeginForm 使用不同的提交按钮和不同的提交方式
- caddy - 指定 Caddy 监听端口
- selenium - Selenium webdriver 切换选项卡
- matlab - 有没有办法在 MATLAB 中安全地修改 mex 文件?
- intellij-idea - 文件关闭后如何保存折叠的代码结构
- node.js - MongoDB cursor.each 方法返回一个最终的空值