sql 优化

SQL优化  

我们要做到不但会写 SQL,还要做到写出性能优良的 SQL。SQL优化需要注意及遵循的准则很多,本文只列举核心部分: 


1) 尽量少用IN操作符,基本上所有的IN操作符都可以用EXISTS代替。  

2) 不用NOT IN操作符,可以用NOT EXISTS或者外连接+(外连接+判断为空)

替代。 
3) 不用“<>”或者“!=”操作符。对不等于操作符的处理会造成全表扫描,可

以用“<” or “>”代替。例如:a<>0 改为 a>0 or a<0,a<>’ ’ 改为 a>’ ’ 

 4) Where子句中出现IS NULL或者IS NOT NULL时,Oracle会停止使用索引而执

行全表扫描。可以考虑在设计表时,对索引列设置为NOT NULL。这样就可以用其他操作来取代判断NULL的操作。  
5) 当通配符“%”或者“_”作为查询字符串的第一个字符时,索引不会被使用,
因此一般不要作为第一个字符出现。  
6) 对于有连接的列“||”,最后一个连接列索引会无效。尽量避免连接,可以
分开连接或者使用不作用在列上的函数替代。  
7) 如果索引不是基于函数的,那么当在Where子句中对索引列使用函数时,索
引不再起作用。  
8) Where子句中避免在索引列上使用计算,否则将导致索引失效而进行全表扫
描。  
9) 对数据类型不同的列进行比较时,会使索引失效。  
10) 用“>=”替代“>”。  
11) UNION操作符会对结果进行筛选,消除重复,数据量大的情况下可能会引起
磁盘排序。如果不需要删除重复记录,应该使用UNION ALL。


 
12) Oracle从下到上处理Where子句中多个查询条件,所以表连接语句应写在其
他Where条件前,可以过滤掉最大数量记录的条件必须写在Where子句的末尾。  
13) Oracle从右到左处理From子句中的表名,所以在From子句中包含多个表的
情况下,将记录最少的表放在最后。  
14) Order By语句中的非索引列会降低性能,可以通过添加索引的方式处理。严
格控制在Order By语句中使用表达式。  
15) 不同区域出现的相同的Sql语句,要保证查询字符完全相同,以利用SGA共
享池,防止相同的Sql语句被多次分析。  16) 多利用内部函数提高Sql效率。  
17) 当在Sql语句中连接多个表时,使用表的别名,并将之作为每列的前缀。这
样可以减少解析时间。  
18) 根据SQL不同设定优化模式的方式,选择不同的优化策略,通过SELECT 
/*+ALL+_ROWS*/ „„;来设定。可用的HINT包括/*+ALL_ROWS*/、/*+FIRST_ROWS*/、/*+CHOOSE*/、/*+RULE*/ 等一般在SQL前加first_rows策略,速度都会提高,特殊情况下改用choose策略。  
19) 对于大表查询中的列应尽量避免进行诸如To_char,to_date,
to_number等转换。  
20) 有索引的尽量用索引,有用到索引的条件写在前面 。 
21) 如有可能和有必要就建立一些索引 ,在使用索引字段作为条件时,如果该
索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。 
22) 尽量避免进行全表扫描,限制条件尽可能多,以便更快搜索到要查询的数据。 23) Select子句中尽量避免使用‘*’,当你想在SELECT子句中列出所有的COLUMN
时,使用动态SQL列引用 ‘*’ 是一个方便的方法。但是,这是一个非常低效的方法。实际上,ORACLE在解析的过程中,会将‘*’ 依次转换成所有的列名,这个工作是通过查询数据字典完成的,这意味着将耗费更多的时间。合理写WHERE子句,不要写没有WHERE的SQL语句。 


 
24) 减少访问数据的次数,当执行每条SQL语句时, 数据库在内部执行了许多
工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等等。 由此可见, 减少访问数据库的次数 , 就能实际上减少数据库的工作量。 
25) 查询的模糊匹配,尽量避免在一个复杂查询里面使用 LIKE '%parm1%'——百
分号会导致相关列的索引无法使用,最好不要用。解决办法:其实只需要对该脚本略做改进,查询速度便会提高近百倍。改进方法如下: 
a、修改前台程序——把查询条件的供应商名称一栏由原来的文本输入改为下拉列表,用户模糊输入供应商名称时,直接在前台就帮忙定位到具体的供应商,这样在调用后台程序时,这列就可以直接用等于来关联了。 
b、直接修改后台——根据输入条件,先查出符合条件的供应商,并把相关记录保存在一个临时表里头,然后再用临时表去做复杂关联。 
尽量避免在索引过的字符数据中,使用非打头字母搜索。这也使得引擎无法利用索引。 见如下例子:  
SELECT * FROM T1 WHERE NAME LIKE ‘%L%’  SELECT * FROM T1 WHERE SUBSTING(NAME,2,1)=’L’  SELECT * FROM T1 WHERE NAME LIKE ‘L%’  
即使NAME字段建有索引,前两个查询依然无法利用索引完成加快操作,引擎不得不对全表所有数据逐条操作来完成任务。而第三个查询能够使用索引来加快操作。 
26) 避免使用耗费资源的操作,带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY
的SQL语句会启动SQL引擎 执行,耗费资源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要执行两次排序。 
27) 尽量减少重复工作,控制同一条语句的多次执行,减少多次的数据转换,减
少不必要的子查询和连接表,合并对同一张表的多次update操作,update操作不要拆成delete+insert操作,虽然功能相同,但性能差别很大。 
28) 多表连接的连接条件对索引选择有重要意义,在写连接条件时要特别注意。
多表连接时,连接条件必须写全,尽量使用聚集索引。 
充分利用连接条件,在某种情况下,两个表之间可能不只一个的连接条件,这时在 WHERE 子句中将连接条件完整的写上,有可能大大提高查询速度。  


 
29) 避免使用不兼容的数据类型。例如float和int、char和varchar、binary和
varbinary是不兼容的。数据类型的不兼容可能使优化器无法执行一些本来可以进行的优化操作。例如:  
SELECT name FROM employee WHERE salary > 60000  
在这条语句中,如salary字段是money型的,则优化器很难对其进行优化,因为60000是个整型数。我们应当在编程时将整型转化成为钱币型,而不要等到运行时转化。 
30) 尽量不要用SELECT INTO语句。  
SELECT INTO 语句会导致表锁定,阻止其他用户访问该表。 
31) 使用视图加速查询。 
把表的一个子集进行排序并创建视图,有时能加速查询。它有助于避免多重排序操作,而且在其他方面还能简化优化器的工作。视图中的行要比主表中的行少,而且物理顺序就是所要求的顺序,减少了磁盘I/O,所以查询工作量可以得到大幅减少。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
课程介绍:本课程旨在介绍Python Ray框架的基本概念、核心组件和应用,帮助学员理解并掌握Ray在分布式计算领域的应用,并在实际工作和生活中获得职业加成和思维提升。教学设计:本课程采用系统化的教学设计,结合理论讲解和实际案例演示,以帮助学员全面理解Ray的工作原理和核心特性。课程内容根据逻辑顺序进行组织,从基础概念到高级应用,循序渐进地引导学员掌握Ray的使用技巧和最佳实践。内容特色:重点介绍Ray的任务并行模型、对象存储和Actor模型,让学员理解并运用这些特性进行高效的分布式计算。强调实际应用案例,展示Ray在分布式机器学习、强化学习、推荐系统等领域的成功应用,激发学员的创造力和应用思维。讲解方式:课程讲解采用简洁明了的语言,结合图示和示例代码,帮助学员轻松理解和掌握Ray的概念和使用方法。通过实际案例演示,学员可以看到Ray在实际项目中的应用场景和效果,进一步加深理解。与其他同类课程的差异化:本课程专注于Python Ray框架的介绍和应用,注重深入讲解任务并行、对象存储和Actor模型等核心概念。通过实际案例和应用场景的讲解,将Ray的理论知识与实际应用相结合,帮助学员将所学知识应用到实际工作和生活中。课程收益:     参与本课程后,学员将获得以下收益:职业加成:掌握Ray的分布式计算能力,提升在职场上解决复杂问题和处理大规模数据的能力。思维提升:理解任务并行、对象存储和Actor模型的思维模式,培养分布式思维和并发编程的能力。实际应用:通过实际案例演示和练习,学员将能够将Ray应用于实际工作项目中,提高工作效率和解决问题的能力。通过本课程的学习,您将掌握Python Ray框架的核心概念和应用,获得在分布式计算领域的专业知识,以及在实际工作和生活中获得的职业加成和思维提升。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MaxCode-1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值