以下的SQL语句以Northwind为例
1、不要再where子句中"="的左侧使用函数和表达式,因为系统无法应用函数或表达式中的索引
SELECT * FROM Customers WHERE Cast(CustomerID AS VARCHAR(20))=‘1‘ --Clustered Index Scan 全表扫描
SELECT * FROM Customers WHERE CustomerID =‘1‘ --Clustered Index Seek 索引扫描
2、只返回必要的行或列
2.1 减少I/O次数
2.2 减少加载到内存的数据量
3、关于组合索引(待定)
组合索引中的顺序很重要,当查询语句中的列只能与组合索引中的第1列相匹配时,才能在查询中应用此索引
4、Distinct语句的使用原则
尽量少用,因为数据库引擎需要花费大量的时间对所有字段进行比较,过滤掉重复的记录,因此影响了查询的效率
字段较少时,可适当采用;较多时,不宜采用
5、Union语句
Union必须满足以下要求:
1、所有select语句的列数必须相同
2、所有select语句中对应列的数据类型必须兼容
执行包含Union的查询语句的过程如下:
1、依次执行所有select语句
2、将所有select语句的结果集合并为一个结果集
3、对结果集进行排序,并过滤掉重复的记录(由于需要第3步的操作,导致联合查询效率很低)
可使用union all,不用排序和过滤重复记录,效率高
6、使用存储过程
数据库引擎可以在创建存储过程时对其进行分析和优化,并可在首次执行该过程后使用该过程的内存中版本。
相对来说,每次运行sql语句时,都要从客户端重复发送,并且在sqlserver每次执行这些语句时,对其进行编译和优化。
7、如果需要多次对一个数据量非常大的表中一部分数据进行查询操作,可以将这部分数据放在临时表中,然后对临时表进行操作。
8、模糊匹配符%和索引的关系
假定有一个表Good,主键为聚集索引,类型为nvarchar(50)
SELECT * FROM Goods AS g WHERE g.GoodsName LIKE ‘%商品1‘ --Clustered Index Scan 全表扫描
SELECT * FROM Goods AS g WHERE g.GoodsName LIKE ‘商%品1‘ --Clustered Index Seek 索引扫描
SELECT * FROM Goods AS g WHERE g.GoodsName LIKE ‘商品1%‘ --Clustered Index Seek 索引扫描
结论:通配符%放在中间和后面会走索引,放在前面不会