快速sql质量优化(复习)

2019-04-10 01:59栏目:程序人生

3.记住除count(*)之外,  聚合函数皆以忽视NULL标记  借使有一组数据“一,壹,三,4,伍,null”列名字为qty   表明式Count(*) 重返的是陆 但是Count(qty)

自联结

select  cust_id, cust_name, cust_contact 
from customers 
where cust_name = (select cust_name 
                   from customers 
                   where cust_contact = 'Jim Jones');

以上子查询功能同样自联结:

select c1.cust_id, c1.cust_name, c1.cust_contact 
from customers as c1, customers as c2 
where c1.cust_name = c2.cust_name 
and c2.cust_contact = 'Jim Jones';

一般性状态下,许多DBMS处理统1远比处理子查询快得多

8,sql优化最棒实践

1,选择最有效用的表连接顺序

先是要明白有些正是SQL 的语法顺序和实施顺序是区别的

SQL的语法顺序:

    select   【distinct】 ....from ....【xxx  join】【on】....where....group by ....having....【union】....order by......

SQL的履行顺序:

   from ....【xxx  join】【on】....where....group by ....avg()、sum()....having....select   【distinct】....order by......

from 子句--执行各种为从后往前、从右到左

表名(最前面包车型地铁那些表名字为驱动表,执行顺序为从后往前, 所以数据量较少的表尽量放后)

where子句--执行顺序为自下而上、从右到左

将得以过滤掉大批量数额的尺度写在where的子句的结尾品质最优

group by 和order by 子句执行顺序都为从左到右

select子句--少用*号,尽量取字段名称。 使用列名意味着将减小消耗费时间间。

二,防止发出笛Carl积

饱含多表的sql语句,必须指明各表的接连条件,以制止发出笛Carl积。N个表连接要求N-3个延续条件。

三,幸免采取*

当你想在select子句中列出全部的列时,使用动态sql列引用“*”是多个福利的章程,不幸的是,是一种尤其低效的措施。sql解析进程中,还亟需把“*”依次转换为有着的列名,这一个工作必要查询数据字典完毕!

四,用where子句替换having子句

where子句搜索条件在进行分组操作从前运用;而having自个儿条件在进展分组操作之后选择。防止接纳having子句,having子句只会在搜索出装有记录之后才对结果集进行过滤,那些处理供给排序,总括等操作。即便能透过where子句限制记录的多少,那就能压缩那地方的支出。

5,用exists、not exists和in、not in相互替代

标准化是哪些的子查询发生的结果集小,就选哪些

select * from t1 where x in (select y from t2)

select * from t1 where exists (select null from t2 where y =x)

IN适合于表面大而内表小的意况;exists适合于外部小而内表大的情事

6,使用exists替代distinct

当提交3个包括一对多表音讯(比如单位表和雇员表)的询问时,制止在select子句中利用distinct,1般能够设想使用exists代替,exists使查询更为便捷,因为子查询的标准化壹旦满意,立马回到结果。

无效写法:

select distinct dept_no,dept_name from dept d,emp e where d.dept_no=e.dept_no

迅猛写法:

select dept_no,dept_name from dept d where  exists (select 'x' from emp e where e.dept_no=d.dept_no)

备考:个中x的情致是:因为exists只是看子查询是不是有结果回到,而不爱惜重返的什么内容,因而建议写贰个常量,品质较高!

用exists的确能够取代distinct,可是上述方案仅适用dept_no为唯一主键的处境,如若要去掉重复记录,须求参考以下写法:

select * from emp  where dept_no exists (select Max(dept_no)) from dept d, emp e where e.dept_no=d.dept_no group by d.dept_no)

七,防止隐式数据类型转换

隐式数据类型转换不能够适用索引,导致全表扫描!t_tablename表的phonenumber字段为varchar类型

以下代码不符合规范:

select column1 into i_l_variable1 from t_tablename where phonenumber=18519722169;

应编写制定如下:

select column1 into i_lvariable1 from t_tablename where phonenumber='18519722169';

八,使用索引来幸免排序操作

在实践频度高,又带有排序操作的sql语句,提议适用索引来幸免排序。排序是壹种昂贵的操作,在1分钟执行不可胜言次的sql语句中,即便带有排序操作,往往会损耗多量的系统财富,质量低下。索引是①种有序结果,固然order by前边的字段上建有目录,将会大大升级作用!

九,尽量采取前端相配的混淆查询

比如说,column一 like 'ABC%'格局,能够对column1字段展开索引范围扫描;而column壹 kike '

版权声明:本文由ca888发布于程序人生,转载请注明出处:快速sql质量优化(复习)