设计高效sql一般经验谈
来源:互联网 发布:参考文献来源于网络 编辑:程序博客网 时间:2024/06/05 19:15
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,…
这条没什么好说的,主要是按需查询,不要返回不必要的列和行。
4在sql 查询中应尽量使用索引列来加快查询速度
5任何在Order by 语句的非索引项或者有计算表达式都将降低查询速度
6任何在where子句中使用is null 或 is not null 的语句不允许使用索引,效率较低
7通配符%在词首时,系统不使用索引,当通配符出现在其他位置时,优化器就能利用索引
8在海量数据的sql查询语句中尽量少用格式转换
9任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等,查询时要尽可能将操作移至等号右边
10 In 、or子句常会使索引失效
11通常情况下,连接比子查询效率要高
- 设计高效sql一般经验谈
- 设计高效sql一般经验谈
- 设计高效sql一般经验谈 (转)
- SQL SERVER 2008 数据库设计经验谈
- SQL经验谈
- SQL数据库一般设计原则(一)
- 设计高效SQL: 一种视觉的方法
- 数据库设计经验谈
- 数据库设计经验谈
- 数据库设计经验谈
- [转]数据库设计经验谈
- 数据库设计经验谈
- 数据库设计经验谈
- 数据库设计经验谈(1)
- 数据库设计经验谈
- >+ 数据库设计经验谈(夜来香)
- 数据库设计经验谈
- 数据库设计经验谈
- hdu3078
- Codeforces Round #282 (Div. 2)---B. Modular Equations
- how do I delete an Eclipse project when I've already deleted the folder and contents?
- 应届生高薪就业的背后
- 爱情四阶段
- 设计高效sql一般经验谈
- 数据结构之排序
- 求灰度图像最大灰度,最小灰度,平均灰度
- 高效C++ --经验条款(一)
- 设置CATALINA_HOME环境变量
- POJ 2739 解题报告
- 百度2015校园招聘技术类面试题及面经
- Installing Ubuntu 14.04 on a Pre-Installed Windows 8 (64-bit) System (UEFI Supported)
- git 使用