设计高效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通配符%在词首时,系统不使用索
相关文档:
当你正在处理被多个站点(像在跨国公司条件下)使用的大数据库时,你也许会遇到保证表格对象唯一性这样的棘手问题。在这种情形下,可能只能靠UNIQUEIDENTIFIER来解决。UNIQUEIDENTIFIER是一个保存全局唯一标识符的GUID数据类型。GUID是一个保证唯一的二进制数,因此几乎没有别的计算机会产生同一个值。
GUID的唯一值是由计 ......
数据源......包含无法用于处理操作的 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. ......
1 :普通SQL语句可以用exec执行
Select * from tableName
exec('select * from tableName')
exec sp_executesql N'select * from tableName' -- 请注意字符串前一定要加N
2:字段名,表名,数据库名之类作为变量时,必须用动态SQL
declare @fname varchar(20)
set @fname = 'FiledName'
Select @fname from tab ......