当前位置: 代码迷 >> SQL >> SQL高级优化之惯用的优化策略-1(The Return Of The King)
  详细解决方案

SQL高级优化之惯用的优化策略-1(The Return Of The King)

热度:124   发布时间:2016-05-05 11:21:36.0
SQL高级优化之常用的优化策略-1(The Return Of The King)

1 常用的优化策略

1.1    语句

1.1.1使用实际的列名

当我们查询SQL语句时,你是否认为使用实际的列名比使用*更快呢?答案是肯定的。为了证实这一点,感兴趣的朋友可以自己验证一下。我这里给出一个实例。

select * from user;--时间: 0.423ms</span>
select  id,version,avatar,date_created,description,email,email_show,enabled,first_name,last_name,last_updated,member_id,passwd,user_real_name,user_style_id ,username,paypal_email_address,transaction_fee_payer,pay_pal_email_addressfrom user;--时间: 0.177ms


1.1.2 合理使用Having

    要理解Having的使用含义,它仅使用在对所有查询到的行数进行过滤。即,它就是一个过滤器。不要将Having用作其它目的。

SELECT subject, count(subject) FROM student_details WHERE subject != 'Science' AND subject != 'Maths' GROUP BY subject

代替下面不合理的用法:

SELECT subject, count(subject) FROM student_details GROUP BY subject HAVING subject!= 'Vancouver' AND subject!= 'Toronto'

1.1.3    减少子查询个数

     减少子查询个数可以减少不必要的性能消耗,看看下面的这里简单实例。

SELECT name FROM employee WHERE (salary, age ) = (SELECT MAX (salary), MAX (age) FROM employee_details) AND dept = 'Electronics'


代替下面这个语句

SELECT name FROM employeeWHERE salary = (SELECT MAX(salary) FROM employee_details) AND age = (SELECT MAX(age) FROM employee_details) AND emp_dept = 'Electronics'


     常用的优化提示:

1.合理的使用Exits, In ,Join关键字。

2.In通常会降低SQL的执行效率,当过滤标准在字查询中时,In的使用会提高执行效率;当大部分的过滤标准在住查询中时,Exits执行效率比较高。

比如下面的这个例子:

Select *from product p where EXISTS (select 1 from order_items o where o.product_id = p.product_id)


代替下面这个SQL语句

Select * from product p where product_id IN (select product_id from order_items)

 

3 使用Exits替代 Distinct。当表之间存在一对多的关系时,使用Exits会比使用Distinct效率更高。

SELECTd.dept_id, d.dept FROM dept d WHERE EXISTS ( SELECT 'X' FROM employee e WHEREe.dept = d.dept)


代替下面的SQL语句

SELECT DISTINCT d.dept_id, d.dept FROM dept d,employee e WHERE e.dept = e.dept


4 区别UNION ALL 和UNION的差异

5 优化where查询条件。看下面的这个例子,比较中,你会发现性能的差异。

selectid,email,first_name,last_name from user where first_name like 'Sha%'--时间: 0.032ms</span>
<span style="font-size:18px;">selectid ,email ,first_name ,last_name from user where substr(first_name, 1, 3 ) ='Sha'--时间: 0.035ms

实例2

SELECT product_id, product_name FROM product WHERE unit_price BETWEEN MAX(unit_price) and MIN(unit_price)

代替下面的SQL语句

SELECT product_id, product_name FROM product WHERE unit_price >= MAX(unit_price) and unit_price <= MIN(unit_price)

1.1.4 使用 DECODE

     使用Decode函数避免扫描相同的行或者连接重复相同的表,Decode常使用在Group By的SQL语句中。

SELECT idFROM employee WHERE nameLIKE 'Ramesh%' andlocation = 'Bangalore'

取代下面SQL语句

SELECT DECODE(location,'Bangalore',id,NULL) id FROMemployee WHERE name LIKE 'Ramesh%'


                                                                                                                                                               
  相关解决方案