设计高效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,…
这条没什么好说的,主要是按需查询,不要返回不必要的列和行。
4在sql 查询中应尽量使用索引列来加快查询速度
5任何在Order by 语句的非索引项或者有计算表达式都将降低查询速度
6任何在where子句中使用is null 或 is not null 的语句不允许使用索引,效率较低
7通配符%在词首时,系统不使用索
相关文档:
数据源......包含无法用于处理操作的 ImpersonationMode。
解决方法:
服务器连接改为“使用服务账户”。
具体操作:
在数据源里的项目上点击右键->打开->数据源设计器 , 选择“模拟信息”标签->选择“使用服务账户”,确定,执行部署。 ......
1. 说明:复制表(只复制结构,源表名:a,新表名:b)
SQL: select * into b from a where 1<>1;
2. 说明:拷贝表(拷贝数据,源表名:a,目标表名:b)
SQL: insert into b(a, b, c) select d, e, f from b;
3. ......
第一种方法: 使用output参数
USE AdventureWorks;
GO
IF OBJECT_ID ( 'Production.usp_GetList', 'P' ) IS NOT NULL
DROP PROCEDURE Production.usp_GetList;
GO
CREATE PROCEDURE Production.usp_GetList @product varchar(40)
, @maxprice money
, ......
表结构和数据如下(表名Test):
NO VALUE NAME
1 a 测试1
1 b 测试2
1 c ......