网上我们经常可以找到大量的关于sql调优的文章和帖子,实际上如果没有真正的实践,可以说这些所谓的经验总结,在实际中不一定总是正确和有效。因此很容易误导初学者,对于某个sql的怎么执行还是要看实际执行计划,下面就大家容易出现的误解做下说明。
1) 连接或者利用子查询或者视图的结果一定不使用索引吗?
不一定,如果join 一个是子查询,一个是物理表,物理表在关联字段建立了索引,也是可以利用索引的,如果子查询或者视图不包含group by,在子查询外的where条件在 有时相当于拿到子查询中。
例如:select field1 from (select filed1 from table)tmp where filed1>1000
实际上相当于select filed1 from table where field1>1000
2) Oracle的预编译SQL与非预编译SQL快吗?
我们会在网上或者课本上翻出预编译sql相对于非预编译sql的优势,例如:
预编译sql防止了SQL注入,不必考虑特殊字符的转译,提高了安全性,而且数据库会将SQL存储到共享池中,以便下次使用。
但是,在项目中,我们发现在plsqldeveloper中执行时间为7s的sql,在应用程序中执行却需要3分钟,随后我们改为非预编译sql,执行时间与在工具中的执行时间相同。(IBatis的配置文件的##全部改为$$,SQL将变为非预编译SQL)。改为非预编译SQL,
Oracle的sharepool不会存储非预编译sql的执行计划了吗?但是我们可以很清楚的看到在工具中第一次执行sql是比较慢的,第二次执行就会快些。
3) 使用索引一定会比全表扫描快吗?
SQL的执行计划是经过DBMS的查询分析器经过比较选取的,根据数据量的不同,数据的不同,会产生不同的执行计划,如果数据量比较小,或者使用索引的Cost还不如全表扫描,那么查询分析器会采用全表扫描。
4) 复合索引如果不使用首列会失效吗?
在oracle10g可以使用跳跃索引扫描,如果不使用复合索引的leading column即首列,也是可以使用该复合索引的
5) 索引越多越好吗
索引是消耗存储空间的,索引太多会导致更新或者插入很慢,因为更新或者插入会同时更新插入索引。
6) 在一次select中一个表的多个索引会同时使用吗?
在DB2中有多索引扫描,详细请参考牛新庄的《DB2 DBA参考》,其中可以同时使用2个索引,然后对结果集进行合并,在oracle中还没有看到,因此有待考证。在oracle中,一般情况下,对于一个表只会使用一个索引,所以索引不必建立很多优化查询,因为一次查询只能使用一个索引,请大家讨论。
7) 使用or连接或者in一定不使用索引吗?
有些帖子讲应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num=10 or num=20
可以这样查询:
select id from t where num=10
union all
select id from t where num=20
实际上对于简单的查询使用or和in也是可以使用索引的
分享到:
相关推荐
不要迷信找最好的人,要找最合适的人-马云.JPG
Hire&Fire专辑【6】:马云:招人不要迷信最好的人,要找最合适的人-马云.JPG
只给大模型LeetCode编号,也能解题!大模型表现好是源于对训练数据的记忆吗?请不要迷信大模型
只给大模型LeetCode编号,也能解题!大模型表现好是源于对训练数据的记忆吗?请不要迷信大模型.pdf
小学政治:相信科学不迷信(教学方案).pdf
这让本就处于信息不对称方的消费者选购彩电更是患得患失:除了尽量收集到有效的信息,还得警惕厂商的夸大和相互间的诋毁。
对自由贸易的迷信.doc
我打破了迷信作文.doc
初中语文文摘社会请君入瓮除迷信
青少年应警惕网络迷信.docx
炼金术士:迷信的化学研究者
《公主的迷信》歌词信.docx
初中语文文摘生活我们为何迷信保质期
小学政治相信科学不迷信教学设计.docx
弘扬科学精神反对封建迷信学习教案.ppt
初中语文语文百科科技血型的科学与迷信
切莫迷信测试软件一颗让老鸟抓狂的神秘处理器.pdf
六年级上册品德14崇尚科学破除迷信反对邪教∣泰山版.pptx
在本文中,我以古德曼的迷信概念为基础,他将其应用于学校教育系统。 古德曼(Goodman)认为,我们继续相信该系统的价值,而没有明确的证据表明它正在起作用。 我用这个概念将论点应用于当前系统与父母打交道的方式...