设计高效sql一般经验谈 (转)

1不用在sql语句使用系统默认的保留关键字

2尽量用exists not exists 代替 in not in

         这条在sql2005之后,在索引一样,统计信息一样的情况下,exists in效果是一样的。

         AdventureWorks数据库为例,查询在HumanResources.EmployeeAddress有地址的Employee信息,

in 语句如下:

SET STATISTICS IO ON

 

SELECT * FROM HumanResources.Employee

WHERE EmployeeID IN (SELECT EmployeeID FROM HumanResources.EmployeeAddress ea)

 

SET STATISTICS IO OFF

执行后,消息如下:

 

(290 行受影响)

'EmployeeAddress'。扫描计数1,逻辑读取4 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。

'Employee'。扫描计数1,逻辑读取9 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。

执行计划如图

 

exists ,语句如下,

 

SET STATISTICS IO ON

SELECT * FROM HumanResources.Employee

WHERE EXISTS(SELECT EmployeeID FROM HumanResources.EmployeeAddress ea

             WHERE

           HumanResources.Employee.EmployeeID=ea.EmployeeID)

          

 

SET STATISTICS IO OFF

执行后,消息如下:

 

(290 行受影响)

'EmployeeAddress'。扫描计数1,逻辑读取4 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。

'Employee'。扫描计数1,逻辑读取9 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。

执行计划如图:

 

3尽量不用select * from …..,而要写字段名 select field1,field2,…

         这条没什么好说的,主要是按需查询,不要返回不必要的列和行。

 

4sql 查询中应尽量使用索引列来加快查询速度

5任何在Order by 语句的非索引项或者有计算表达式都将降低查询速度

6任何在where子句中使用is null is not null 的语句不允许使用索引,效率较低

7通配符%在词首时,系统不使用索引,当通配符出现在其他位置时,优化器就能利用索引

        

8在海量数据的sql查询语句中尽量少用格式转换

9任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等,查询时要尽可能将操作移至等号右边

10 In or子句常会使索引失效

11通常情况下,连接比子查询效率要高

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值