`
wangtong40
  • 浏览: 253980 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SQL优化原则

阅读更多

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where order by 涉及的列上建立索引。

2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:

SELECT ID FROM TABLE_NAME WHERE NUMBER IS NULL

可以在NUMBER上设置默认值确保表中NUMBER列没有NULL然后这样查询

SELECT ID FROM TABLE_NAME WHERE NUMBER = 0

 

3.应尽量避免在 WHERE子句中使用!=<>操作符,否则将引擎放弃使用索引而进行全表扫描。

 

4.应尽量避免在 WHERE子句中使用 OR来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:

SELECT ID FROM TABLE_NAME WHERE NUMBER = 10 OR NUMBER = 20

可以修改为:

SELECT ID FROM TABLE_NAME WHERE NUMBER = 10

UNION ALL

SELECT ID FROM TABLE_NAME WHERE NUMBER = 20

 

 

5.INNOT IN也要慎用,否则会导致全表扫描,如:

 

SELECT ID FROM TABLE_NAME WHERE NUMBER IN(1,2,3)

对于连续的数值能用 BETWEEN 就不要用IN

SELECT ID FROM TABLE_NAME WHERE NUMBER BETWEEN 1 AND 3

 

6.下面的查询也将导致全表扫描:

 

SELECT ID FROM TABLE_NAME WHERE NAME LIKE '%ABC%'

若要提高效率可以考虑全文检索

 

7.如果在WHERE子句中使用参数,也会导致全表扫描。

因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:

 

 

SELECT ID FROM TABLE_NAME WHERE NUMBER=@num

可以改为强制查询使用索引

SELECT ID FROM TABLE_NAME WITH(INDEX(INDEX_NAME)) WHERE NUMBER=@num

 

8.应尽量避免在 WHERE子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。

SELECT ID FROM TABLE_NAME WHERE NUMBER/2 = 100

应该为:

SELECT ID FROM TABLE_NAME WHERE NUMBER = 100 * 2

 

9.应尽量避免在WHERE子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:

SELECT ID FROM TABLE_NAME WHERE SUBSTRING(NAME,1,3) = 'ABC'

--NAMEABC开头的ID

SELECT ID FROM TABLE_NAME WHERE DATEDIFF(DAY,CREATEDATE,'2005-11-39') = 0

-- '2005-11-30'生成的ID

 

SELECT ID FROM TABLE_NAME WHERE NAME LIKE 'ABC%'

 

SELECT ID FROM TABLE_NAME WHERE CREATEDATE >= '2005-11-30' AND CREATEDATE < '2005-12-1'

 

10.不要在 WHERE子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

 

11.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。

 

12.不要写一些没有意义的查询,如需要生成一个空表结构:

SELECT COL_1,COL_2 INTO #TABLE_NAME FROM TABLE_NAME WHERE 1 = 0

这类代码不会返回任何结果集但是会消耗系统资源的应改成这样

CREATE TABLE #TABLE_NAME(...)

 

13.很多时候用EXISTS代替IN是一个好的选择:

SELECT NUMBER FROM TABLE_NAME WHERE NUMBER IN (SELECT NUMBER FROM TABLE_NAME2)

 

SELECT NUMBER FROM TABLE_NAME WHERE EXISTS(SELECT 1 FROM TABLE_NAME2 WHERE NUMBER = TABLE_NAME.NUMBER)

 

14.并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引。

如一表中有字段SEXMALEFEMALE几乎各一半,那么即使在SEX上建了索引也对查询效率起不了作用。

 

 

 15.索引并不是越多越好,索引固然可以提高相应的 SELECT的效率,但同时也降低了INSERTUPDATE的效率,因为 INSERT UPDATE时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。

 

16.应尽可能的避免更新CLUSTERED索引数据列,因为 CLUSTERED索引数据列的顺序就是表记录的物理存储顺序,一旦该列值改变将导致整个表记录的顺序的调整,会耗费相当大的资源。若应用系统需要频繁更新 CLUSTERED索引数据列,那么需要考虑是否应将该索引建为 CLUSTERED索引。

 

17.尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。

 

18.尽可能的使用 VARCHAR/NVARCHAR代替 CHAR /NVARCHAR ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。

 

19.任何地方都不要使用 SELECT * FROM TABLE_NAME,用具体的字段列表代替“*”,不要返回用不到的任何字段。

 

20.尽量使用表变量来代替临时表。如果表变量包含大量数据,请注意索引非常有限(只有主键索引)。

 

21.避免频繁创建和删除临时表,以减少系统表资源的消耗。

 

22.临时表并不是不可使用,适当地使用它们可以使某些例程更有效。

例如,当需要重复引用大型表或常用表中的某个数据集时。但是,对于一次性事件,最好使用导出表。

 

23.在新建临时表时,如果一次性插入数据量很大,那么可以使用SELECT INTO代替CREATE TABLE,避免造成大量 LOG ,以提高速度;如果数据量不大,为了缓和系统表的资源,应先CREATE TABLE,然后INSERT

 

24.如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先 TRUNCATE TABLE,然后DROP TABLE,这样可以避免系统表的较长时间锁定。

 

25.尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写。

 

26.使用基于游标的方法或临时表方法之前,应先寻找基于集的解决方案来解决问题,基于集的方法通常更有效。

 

27.与临时表一样,游标并不是不可使用。对小型数据集使用 FAST_FORWARD游标通常要优于其他逐行处理方法,尤其是在必须引用几个表才能获得所需的数据时。在结果集中包括“合计”的例程通常要比使用游标执行的速度快。如果开发时间允许,基于游标的方法和基于集的方法都可以尝试一下,看哪一种方法的效果更好。

 

28.在所有的存储过程和触发器的开始处设置 SET NOCOUNT ON

在结束时设置 SET NOCOUNT OFF

无需在执行存储过程和触发器的每个语句后向客户端发送 DONE_IN_PROC消息。

 

29.尽量避免大事务操作,提高系统并发能力。

 

30.尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。

 

 

分享到:
评论

相关推荐

    SQL 优化原则

    (转)SQL 优化原则 一、问题的提出  在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中...

    基于Oracle数据库的SQL优化原则和方法.pdf

    【SQL优化原则】 1. **减少I/O操作**:I/O操作是数据库性能的瓶颈之一。优化的目标是尽量减少磁盘读写,避免不必要的数据传输,以减轻CPU的负担。 2. **优化排序操作**:频繁的排序操作会导致额外的计算开销,应当...

    ORACLE数据库SQL优化原则.pdf

    SQL优化原则是确保数据库高效运行的关键,它涉及到查询优化、索引策略、数据访问路径选择等多个方面。 1. **查询优化**:SQL查询的效率直接影响数据库的性能。优化查询通常包括减少不必要的JOIN操作,避免全表扫描...

    mysql数据库sql优化原则(经验总结)

    在构造SQL语句的时候要养成良好的习惯。二、原则总结 原则1、仅列出需要查询的字段,这对速度不会明显的影响,主要是考虑节省应用程序服务器的内存。 原来语句: select * from admin 优化为: select admin_id,...

    sql语句优化原则

    本文将详细介绍一些实用的SQL优化原则,帮助开发者和DBA们更好地理解和应用这些原则。 #### 二、具体优化原则 **1. 大批量数据插入时临时移除索引** - **场景**: 当需要向表中插入大量新记录时(通常是表中现有...

    oracle sql优化100条

    以下将详细解读部分Oracle SQL优化原则,涵盖查询执行计划、表扫描方式、SQL语句优化及数据访问顺序等方面。 #### 1. 查询执行计划的选择模式 Oracle提供了三种查询执行计划选择模式:`RULE`(基于规则)、`COST`...

    oracle+sql+优化原则

    Oracle SQL 优化原则是数据库管理员和开发人员提升数据库性能的关键技术。本文主要探讨了三个核心原则,即选择合适的优化器、优化访问表的方式以及共享SQL语句。 首先,Oracle提供了三种优化器:基于规则(RULE)、...

    oraclesql优化_Oracle中优化SQL的原则.pdf

    oraclesql优化_Oracle中优化SQL的原则.pdf

    基于案例学习SQL优化

    在“基于案例学习SQL优化”的课程中,我们主要探讨如何提升数据库性能,特别是针对SQL查询的优化技巧。DBA(数据库管理员)作为关键角色,需要掌握这些技能来确保系统的高效运行。以下是根据课程标题和描述提炼出的...

    sql优化脚本

    4. **SQL优化原则**:文本文件可能列出了一系列SQL优化的最佳实践,如遵循“先简单后复杂”的查询设计原则,避免在WHERE子句中使用NULL,合理设置数据库的缓存大小,以及如何利用数据库的EXPLAIN PLAN功能来分析查询...

    SQL 优化常用原则

    SQL语句 优化常用原则。 1. 选用适合的ORACLE优化器

    SQL语句优化原则.pdf

    具体来说,有几个重要的SQL语句优化原则需要掌握和理解: 1. 判断空值(NULL)与索引的使用。在数据库中,包含NULL值的列不会被索引。因此,在where子句中使用ISNULL或ISNOTNULL条件时,优化器将不会使用索引,而是...

    SQL_优化原则和技巧.doc

    ### SQL优化原则和技巧 #### 一、表、索引相关知识及其在数据库内部相关的物理存储 ##### 1. 数据库中最小的物理存储单位:块(Block) - **定义**: 数据库最小的物理存储单位是块,对于Oracle 9i来说,默认大小为8...

    《基于Oracle的SQL优化》PDF版本下载.txt

    ### SQL优化的一般原则 1. **选择合适的索引**:索引是提高查询速度的有效手段。合理的索引设计可以显著提高查询效率。例如,在经常用于条件筛选的列上建立索引。 2. **避免全表扫描**:全表扫描会大大增加查询...

    sql优化书籍大全

    首先,我们要明白SQL优化的基本原则:减少查询次数、减小数据量、合理设计索引以及优化查询语句结构。这四个原则贯穿于整个SQL优化过程,是提升查询效率的基础。 1. 减少查询次数:通过联合查询、子查询优化和存储...

Global site tag (gtag.js) - Google Analytics