当前位置:首页 » 编程语言 » 越复杂的sql执行效率越高
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

越复杂的sql执行效率越高

发布时间: 2023-07-29 10:06:10

A. 同样的sql语句在SQL2000中的执行效率反而大大高于SQL2008,不解!

呵呵,要看在什么情况下做的.如果你本来就是sql 2000的语句,以前在sql 2000上运行过,那么很正常的.sql server 对于陌生语句的执行是要花很多时间,可是如果你重复运行看看.那个时间叫一个短啊...

另外也要看索引是什么样子的?如果sql 2000上存在索引,而2008上没有索引.那么你得到的结论很正常的.

最后这种问题其实没有必要问,mssql 开发组的人都不是sb,他们不会把sql 2008做的比2000还差.还有就是2000和20008完全就不是同一个核心.你;连2005都没用,就直接跳跃到2008,太牛了.

B. 如何提高sql语句的执行效率

1、使用ordered提示

Oracle必须花费大量的时间来剖析多表的合并,用以确定表合并的最佳顺序。SQL表达式涉及七个乃至更多的表合并,那么有时就会需要超过30分钟的时间来剖析,Ordered这个提示(hint)和其他的提示一起使用能够产生合适的合并顺序。

2、使用ordered_predicates

ordered_predicates提示在查询的WHERE子句里指定的,并被用来指定布尔判断(Booleanpredicate)被评估的顺序。在没有ordered_predicates的情况下,Oracle会使用下面这些步骤来评估SQL判断的顺序:子查询的评估先于外层WHERE子句里的Boolean条件。

所有没有内置函数或者子查询的布尔条件都按照其在WHERE子句里相反的顺序进行评估,即最后一条判断最先被评估。每个判断都带有内置函数的布尔判断都依据其预计的评估值按递增排列。

3、限制表格合并评估的数量

提高SQL剖析性能的最后一种方法是强制取代Oracle的一个参数,这个参数控制着在评估一个查询的时候,基于消耗的优化器所评估的可能合并数量。

(2)越复杂的sql执行效率越高扩展阅读:

1、表设计的优化,数据行的长度不要超过8020字节,如果超过这个长度的话在物理页中这条数据会占用两行从而造成存储碎片,降低查询效率。

2、语句的查询优化,保证在实现功能的基础上,尽量减少对数据库访问次数;

3、建立高效的索引创建索引一般有以下两个目的:维护被索引列的唯一性和提供快速访问表中数据的策略。

大型数据库有两种索引即簇索引和非簇索引,一个没有簇索引的表是按堆结构存储数据,所有的数据均添加在表的尾部,而建立了簇索引的表,其数据在物理上会按照簇索引键的顺序存储。个表只允许有一个簇索引。

4、强制查询转换,有时候oracle 的优化器未必能走正确的查询路线,这个时候就需要添加一些hint 之类的来规定他的执行路线。当然了,这个未必是最好的处理方案。因为虽然现在走这个路线是对的,以为因为数据的变化到这这个HINT 变得不可取。

C. 这些SQL优化技巧握在手,面试可以横着走……

一、SQL执行顺序



二、基础SQL优化


1、查询SQL尽量不要使用select *,而是具体字段


1)反例



2)正例



3)理由



2、避免在where子句中使用or来连接条件


查询id为1或者薪水为3000的用户:


1)反例



2)正例


使用union all:



分开两条SQL写:



3)理由



3、使用varchar代替char


1)反例



2)正例



3)理由



4、尽量使用数值替代字符串类型



5、查询尽量避免返回大量数据


如果查询返回数据量很大,就会造成查询时间过长,网络传输时间过长。同时,大量数据返回也可能没有实际意义。如返回上千条甚至更多,用户也看不过来。

通常采用分页,一页习惯10/20/50/100条。


6、使用explain分析你SQL执行计划


SQL很灵活,一个需求可以很多实现,那哪个最优呢?SQL提供了explain关键字,它可以分析你的SQL执行计划,看它是否最佳。Explain主要看SQL是否使用了索引。



返回结果:



7、是否使用了索引及其扫描类型


type:



性能排行:


System > const > eq_ref > ref > range > index > ALL


possible_keys:



key:



8、创建name字段的索引


提高查询速度的最简单最佳的方式。



9、优化like语句


模糊查询,程序员最喜欢的就是使用like,但是like很可能让你的索引失效。


1)反例



2)正例



3)理由


未使用索引,故意使用sex非索引字段:




主键索引生效:




索引失效,type=ALL,全表扫描:




10、字符串怪现象


1)反例



2)正例



3)理由


为什么第一条语句未加单引号就不走索引了呢?这是因为不加单引号时,是字符串跟数字的比较,它们类型不匹配,MySQL会做隐式的类型转换,把它们转换为数值类型再做比较。


11、索引不宜太多,一般5个以内



12、索引不适合建在有大量重复数据的字段上


如性别字段。因为SQL优化器是根据表中数据量来进行查询优化的,如果索引列有大量重复数据,Mysql查询优化器推算发现不走索引的成本更低,很可能就放弃索引了。


13、where限定查询的数据


数据中假定就一个男的记录。


1)反例



2)正例



3)理由



14、避免在索引列上使用内置函数


业务需求:查询最近七天内新生儿(用学生表替代下)


给birthday字段创建索引:



当前时间加7天:



1)反例



2)正例



3)理由







15、避免在where中对字段进行表达式操作


1)反例



2)正例




3)理由






16、避免在where子句中使用!=或>操作符


应尽量避免在where子句中使用!=或>操作符,否则引擎将放弃使用索引而进行全表扫描。记住实现业务优先,实在没办法,就只能使用,并不是不能使用。如果不能使用,SQL也就无需支持了。


1)反例




2)理由




17、去重distinct过滤字段要少





1)理由


18、where中使用默认值代替null


环境准备:




1)反例



2)正例



3)理由



三、高级SQL优化


1、批量插入性能提升


大量数据提交,上千,上万,批量性能非常快,mysql独有。


1)多条提交



2)批量提交



3)理由



2、批量删除优化


避免同时修改或删除过多数据,因为会造成cpu利用率过高,会造成锁表操作,从而影响别人对数据库的访问。


1)反例




2)正例




3)理由



3、伪删除设计


1)商品状态(state)



2)理由



4、提高group by语句的效率


可以在执行到该语句前,把不需要的记录过滤掉。


1)反例:先分组,再过滤



2)正例:先过滤,后分组



5、复合索引最左特性


创建复合索引,也就是多个字段。



满足复合索引的左侧顺序,哪怕只是部分,复合索引生效。



没有出现左边的字段,则不满足最左特性,索引失效。



复合索引全使用,按左侧顺序出现 name,salary,索引生效。



虽然违背了最左特性,但MYSQL执行SQL时会进行优化,底层进行颠倒优化。



1)理由



6、排序字段创建索引


什么样的字段才需要创建索引呢?原则就是where和order by中常出现的字段就创建索引。



7、删除冗余和重复的索引




8、不要有超过5个以上的表连接



9、inner join 、left join、right join,优先使用inner join


三种连接如果结果相同,优先使用inner join,如果使用left join左边表尽量小。



1)理由



10、in子查询的优化


日常开发实现业务需求可以有两种方式实现:



如需求:查询所有部门的所有员工:



假设表A表示某企业的员工表,表B表示部门表,查询所有部门的所有员工,很容易有以下程序实现,可以抽象成这样的一个嵌套循环:


D. SQL2008或SQL2012 如何配置,使SQL的执行效率最高

提升数据插入速度,主要瓶颈在io上面。
1、采用固定内存分配,如果服务器上只有SQLSERVER在运行,使用6G给系统,42G给SQLSERVER。
2、做磁盘阵列RAID10,第一个阵列放置系统,temp数据库,第二个阵列放置数据文件,第三个阵列放置日志文件。

E. 过于复杂的sql语句有哪些缺陷

过于复杂的sql语句有哪些缺陷
不同的数据库甚至相同数据库的不同版本都可能不一样,具体可以查询联机帮助,或参阅产品规格说明。总的来说SQL语句的最大长度限制都是很大的,编写SQL语句一般不需要考虑语句的长度问题。例如ACCESS的SQL最大长度约为6,4000个、MSSQL为65,536 * 网络数据包。像这样的长度,足够你写下长篇大论了。但是话要说回来,一个太长的语句其执行效率变得会低下,尽量避免编写太长和过于复杂的SQL语句还是非常必要的。