[优化] SQL 语句优化
优化的要领:
尽量避免 表扫描 和 索引扫描,让查询尽量走索引或者全文索引
用索引做优化,实际上试用空间换时间
1. or 查询用 union 替换(绝大部分适用)
举例:
1. select id from t where num=10or Name ='admin'
2. select id from t where num = 10
unionall
select id from t where Name ='admin'
其中,id有索引Name无索引,使用or的话,整个SQL语句都不走索引,使用union的话,id查询走索引,Name查询不走索引
2. like 的使用,like 'aaaa%' 会走索引,like '%aaaa' 和 ‘%aaaa%’ 不走索引
举例:
select id from t where name like ‘%abc%’
3. 尽量避免在 Where 条件中 等号左边对列操作,否则的话会 索引扫描 而不是索引查找 例如:
select id from t where num/2 = 100
4. 同理不要对 Where 条件中等号坐标的列进行函数操作,否则也可能会走索引扫描
5. 对于复合索引,尽量保证条件字段顺序与索引顺序一致
6. 对于大数据表的 Join 可以考虑先分页,或者先筛选出数据到临时表,再Join ,否则逻辑读很高
7. 尽量避免更新 聚集索引列,因为索引数据列的顺序就是表记录存储的屋里顺序,如果要更新,可以考虑先删除索引,更新完后再建索引的操作。
8. 尽量选择数字字段,因为在引擎在处理连接查询时,比较一次就可以了,如果为字符串需要逐个比较。
9. 语句中尽量使用表变量(劣势:不能建索引)替换临时表(劣势:只读),如果使用临时表,使用过后记得先truncate表,后drop表
10. 尽量避免大事务处理,提高数据库并发性
11. 用多少字段,提多少,避免 select * from
12.
以上仅供参考,实际运用中应具体问题具体分析。
误区:
1. 一些资料说,使用 exists 替换 in,用 not exists 替换 not in ,实践证明这俩个其实没啥区别,打开 SET STATISTICS IO ON 查看他们的逻辑读之类的统计信息,发现是一样的。
2. 一些资料说,使用 charindex() 代替 like 通配符 要更优,参照上面的统计,发现也基本一样,不知道这些资料是怎么得出的结论了。
3. count(*) 要比 count(某字段) 快,实验证明并非如此。我觉得 SQL Server 针对 count(*) 会找到 count(查询最快的列) 得出结果的 rate:count(*)=rate:count(主键列)
4.
真正的大师永远怀着一颗学徒的心。

浙公网安备 33010602011771号