1 对查询进行优化时,尽量避免全表扫描,首先应考虑在where及order by涉及的列上对立索引.
2 应该尽量避免在where子句中对字段进行null值判断,否则将导致引擎放弃使用索引而进行全表的扫描。如:select id from t where num is null 可以在num上设置默认值0,确保表中num列中没有null值,然后这样查询:select id from where num=0.
3 应尽量避免在where子句中使用!=或者<>操作符,否则将引擎放弃使用索引而进行全表扫描.
4 应尽量避免在where子句中使用or来连接投机倒把,否则将导致引擎放弃使用索引进行全表扫描。如:select id from t where num=10 or num=20 可以这样写:select id from t where num=10 union all select id form t where num=20.
5 in 和 not in 也要慎用,有order by 的情况不走索引会导致全表扫描。如select id from t where num in (1,2,3),对于连续的数值,能用between就不要用in了,如:select id from t where num between 1 and 3.
6 下面的查询也会导致全表扫描:select id from t where name like '%abc%',若要提高效率,可以考虑全文检索。
7 如果在where子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择,然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下语句将进行全表扫描:select id from t where num = @num 可以修改为强制索引:select id from t with (index(索引名)) where num =@num.
8 应尽量避免在where子句中对字段进行表达式操作,这将导致引擎放弃索引而进行全表扫描。如:select id from t where num/2=100 应为:select id from t where num = 100 * 2.
9 应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃索引而进行全表扫描。如:select id from t where substring(name,1,3)='abc' 修改为:select id from t where name like 'abc%' select id from t where datediff(day,createdate,'2005-11-30')=0 修改为 select id from t where createdate >='2005-11-30' and createdate<'2005-12-1'
10 不要在where 子句中的'='左边进行函数,算术运算或其它表达式运算,否则系统将可能无法正确使用索引。
11 在使用索引字段作为条件时,如果该索引是复合索引,那必须使用到该索引中的第一个字段作为条件时才能保证系统使用索引,否则该索引将不会被使用,并且尽可能让字段顺序与索引顺序一致。
12 不要写一些没有意义的查询,如需要生成一个空表结构:select c1,c2 into #tt from t where 1=0 这类代码不会返回任何结果集,但会消耗资源的 就这样:create table #tt()
13 很多时候用exists代替in是一个好的选择,select num from a where num in (select num from b) 修改为:select num from a where exists (select 1 from b where num = a.num).
14 并不是所有索引对查询都有效,SQL是根据表的数据来进行优化的,当索引列有大量的数据重复时,SQL查询可能就不去利用索引.
15 索引并不是越多越好,索引固然可以提高相应的select的效率,但同时也降低了insert及update的效率,因为insert或update时有可以会重建索引,所有怎么样建索引需要慎重,一个表最好不超过六个
16 应尽可能的避免更新clusered索引数据列,因为clustered索引数据列的顺序是表记录的物理存储顺序,一旦该值改变将导致整个表的记录顺序调整,会耗费相当大的资源.
17 尽量使用数字字段,若只含有数值 尽量设置不要设计为字符类型,字符串比较耗时。
18 尽量使用varcher/nvarchar代替char/nchar.
19 任何地方都不要使用select * from t ,用具体字段代替
20 尽量使用变量代替临时表.
21 避免频繁创建和删除临时表,以减少系统表资源的消耗。
22 临时表并不是不可以使用,对于重复索引大型表 最好使用导出表
23 在新建临时表时,如果一次性插入的数据量太大,可以使用select into 代替create table,避免大量Log,以提高速度.
24 如果使用临时表 ,在存储过程最后必须删除,先truncate table 然后drop table,避免长时间锁表。
25 尽量避免使用游标,数据超1万条 ,考虑改写其它方式。
分享到:
相关推荐
海量数据 优化 SQL海量数据 优化 SQL海量数据 优化 SQL海量数据 优化 SQL海量数据 优化 SQL海量数据 优化 SQL海量数据 优化 SQL海量数据 优化 SQL海量数据 优化 SQL海量数据 优化 SQL海量数据 优化 SQL海量数据 优化...
百万数据查询优化海量数据查询优化海量数据查询优化海量数据查询优化
数据库优化你还等什么??sql海量数据优化
SQLServer数据查询的优化方法,讲述了一些最基本的着手点,很基础,高手请绕道
百万数据级快速查询优化技巧,数据库快速查询所遵循的方法。
SQL性能描述 优化SQL SQL数据分区
讲述数据库的数据查询的方法及步骤,主要是SQLserver类的数据查询方式。
●可以通过以下方法来优化查询 : 1、把数据、日志、索引放到不同的I/O设备上,增加读取速度,以前可以将Tempdb应放在RAID0上,SQL2000不在支持。数据量(尺寸)越大,提高I/O越重要。 2、纵向、横向分割表,减少...
百万数据查询优化技巧三十则 1.优化sq查询 2.编写sql规范 3.适用大部分sql
在SQL Server 2000中,可以通过分区视图的定义来支持大数据量表的水平拆分和查询时的数据合并,且查询引擎提供的优化机制,使得SQL Server在大数据量条件下的查询性能得到了明显改进.最后,指础了本解决方法所带来的问题...
4. 参照文档“数据库物理设计及查询优化”中SQL语句查询优化相关内容,在多种情况下,对比实现方式不同但查询结果相同的等价SQL语句在执行计划和成本方面的差异,加深对查询优化的理解,进行书写优化SQL语句的初步...
SQL2005性能优化大全,sqlserver性能优化,包括:什么叫做索引、利用索引优化sqlserver查询、使用数据库分区表提高程序检索效率、提高数据库查询效率的实用方法、SQL数据进行排序、分组、统计技巧;SQL Server查询...
SQL数据查询语句的优化研究.pdf
SQL查询思路优化与语句优化.pdf
1. SQL优化 1 1.1. 优化实战 1 1.1.1. 策略1.尽量全值匹配 1 1.1.2. 策略2.最佳左前缀法则 2 1.1.3. 策略3.不在索引列上做任何操作 2 1.1.4. 策略4.范围条件放最后 3 1.1.5. 策略5.覆盖索引尽量用 3 1.1.6. 策略6.不...
从统计数据表记录总数谈SQL Server查询优化.pdf
《SQL Server 2008查询性能优化》指出的性能要点之一是数据库随着用户和数据的日益增多而进行扩展的必要性。你需要理解性能低下的起因。以及识别并修复它们的方法。《SQL Server 2008查询性能优化》将帮助你: 使用...
可以通过如下方法来优化查询 1、把数据、日志、索引放到不同的I/O设备上,增加读取速度,以前可以将Tempdb应放在RAID0上,SQL2000不在支持。数据量(尺寸)越大,提高I/O越重要. 2、纵向、横向分割表,减少表...
基于SQL的关系数据查询优化策略.pdf
《SQL Server 2008查询性能优化》指出的性能要点之一是数据库随着用户和数据的日益增多而进行扩展的必要性。你需要理解性能低下的起因。以及识别并修复它们的方法。《SQL Server 2008查询性能优化》将帮助你: 使用...