sql语句优化建议
sql查询语句优化方法

sql查询语句优化方法SQL查询语句的优化是提高数据库性能的关键。
以下是一些常见的SQL查询优化方法:1. 使用索引:为经常查询的列和WHERE子句中的条件列建立索引。
考虑使用复合索引,但要注意复合索引的列顺序。
避免全表扫描,尽量使用索引查找。
2. 避免SELECT :只选择需要的列,避免SELECT 。
3. 使用连接(JOIN)代替子查询:当可能时,使用连接代替子查询来提高效率。
4. 优化WHERE子句:避免在WHERE子句中使用函数,这会导致函数在每一行上都执行一次,可能导致全表扫描。
尽量避免使用“IN”和“OR”子句。
5. 使用EXPLAIN:使用EXPLAIN关键字来查看查询的执行计划,从而找到性能瓶颈。
6. 优化JOIN操作:尽量减少JOIN的数量。
确保JOIN的字段已经被索引。
7. 使用合适的数据类型:为字段选择合适的数据类型可以减少存储需求并提高查询性能。
8. 减少使用LIKE操作符:当使用LIKE操作符时,尽量避免通配符开头的查询,如'%xyz'。
这样的查询不能有效地使用索引。
9. 优化排序操作:尽量减少排序操作,尤其是在大数据集上。
如果必须排序,考虑使用索引来加速排序过程。
10. 优化存储引擎:根据需要选择合适的存储引擎,如InnoDB或MyISAM。
11. 定期进行数据库维护:如优化表(`OPTIMIZE TABLE`),修复表(`REPAIR TABLE`)等。
12. 考虑分区:对于非常大的表,可以考虑使用分区来提高查询性能。
13. 缓存查询结果:在适当的情况下,缓存频繁查询的结果可以避免重复计算。
14. 使用数据库的查询缓存:如果数据库支持(如MySQL),开启查询缓存可以提高重复查询的性能。
15. 优化数据库设计:正规化数据库设计以减少数据冗余,同时考虑性能需求进行适当的反规范化。
16. 合理设计数据库规模和硬件配置:根据应用需求合理设计数据库规模,并考虑硬件配置对性能的影响。
oracle sql 优化技巧

oracle sql 优化技巧(实用版3篇)目录(篇1)1.Oracle SQL 简介2.优化技巧2.1 减少访问数据库次数2.2 选择最有效率的表名顺序2.3 避免使用 SELECT2.4 利用 DECODE 函数2.5 设置 ARRAYSIZE 参数2.6 使用 TRUNCATE 替代 DELETE2.7 多使用 COMMIT 命令2.8 合理使用索引正文(篇1)Oracle SQL 是一款广泛应用于各类大、中、小微机环境的高效、可靠的关系数据库管理系统。
为了提高 Oracle SQL 的性能,本文将为您介绍一些优化技巧。
首先,减少访问数据库的次数是最基本的优化方法。
Oracle 在内部执行了许多工作,如解析 SQL 语句、估算索引的利用率、读数据块等,这些都会大量耗费 Oracle 数据库的运行。
因此,尽量减少访问数据库的次数,可以有效提高系统性能。
其次,选择最有效率的表名顺序也可以明显提升 Oracle 的性能。
Oracle 解析器是按照从右到左的顺序处理 FROM 子句中的表名,因此,合理安排表名顺序,可以减少解析时间,提高查询效率。
在执行 SELECT 子句时,应尽量避免使用,因为 Oracle 在解析的过程中,会将依次转换成列名,这是通过查询数据字典完成的,耗费时间较长。
DECODE 函数也是一个很好的优化工具,它可以避免重复扫描相同记录,或者重复连接相同的表,提高查询效率。
在 SQLPlus 和 SQLForms 以及 ProC 中,可以重新设置 ARRAYSIZE 参数。
该参数可以明显增加每次数据库访问时的检索数据量,从而提高系统性能。
建议将该参数设置为 200。
当需要删除数据时,尽量使用 TRUNCATE 语句替代 DELETE 语句。
执行 TRUNCATE 命令时,回滚段不会存放任何可被恢复的信息,所有数据不能被恢复。
因此,TRUNCATE 命令执行时间短,且资源消耗少。
在使用 Oracle 时,尽量多使用 COMMIT 命令。
SQL语句优化的34条建议

SQL语句优化的34条建议我们要做到不但会写SQL,还要做到写出性能优良的SQL,以下为笔者学习、摘录、并汇总部分资料与大家分享!(1)选择最有效率的表名顺序(只在基于规则的优化器中有效):orACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。
如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表.(2)Where子句中的连接顺序.:orACLE采用自下而上的顺序解析Where子句,根据这个原理,表之间的连接必须写在其他Where条件之前, 那些可以过滤掉最大数量记录的条件必须写在Where子句的末尾.(3)Select子句中避免使用… * …:orACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间(4)减少访问数据库的次数:orACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量, 读数据块等;(5)在SQL*Plus , SQL*Forms和Pro*C中重新设置ARRAYSIZE参数, 可以增加每次数据库访问的检索数据量,建议值为200(6)使用DECODE函数来减少处理时间:使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表.(7)整合简单,无关联的数据库访问:如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系)(8)删除重复记录:最高效的删除重复记录方法( 因为使用了ROWID)例子:Delete FROM EMP E Where E.ROWID > (Select MIN(X.ROWID)FROM EMP X Where X.EMP_NO = E.EMP_NO);(9)用TRUNCATE替代Delete:当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息. 如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况)而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短. (译者按: TRUNCATE只在删除全表适用,TRUNCATE是DDL不是DML) (10)尽量多使用COMMIT:只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少:COMMIT所释放的资源:a. 回滚段上用于恢复数据的信息.b. 被程序语句获得的锁c. redo log buffer 中的空间d. orACLE为管理上述3种资源中的内部花费(11)用Where子句替换HAVING子句:避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过Where子句限制记录的数目,那就能减少这方面的开销. (非oracle中)on、where、having这三个都可以加条件的子句中,on是最先执行,where次之,having最后,因为on是先把不符合条件的记录过滤后才进行统计,它就可以减少中间运算要处理的数据,按理说应该速度是最快的,where 也应该比having快点的,因为它过滤数据后才进行sum,在两个表联接时才用on的,所以在一个表的时候,就剩下where跟having比较了。
SQL数据库优化的六种方法

SQL数据库优化的六种⽅法SQL命令因为语法简单、操作⾼效受到了很多⽤户的欢迎。
但是,SQL命令的效率受到不同的数据库功能的限制,特别是在计算时间⽅⾯,再加上语⾔的⾼效率也不意味着优化会更容易,所以每个数据库都需要依据实际情况做特殊调整。
同时,这也是为什么我们要尽可能多的了解不同的⽅法来优化或增强数据库,以确保最佳性能的原因。
不同职位的开发⼈员针对SQL数据库的优化也会有所不同,例如在某些⽅⾯的优化就会与数据库管理员(DBA)有所不同。
在⼤型公司中,开发⼈员和数据库管理员往往需要⼀起⼯作,⽽在这些情况下,两队之间很可能发⽣冲突。
所有我们要通过多种⽅式来调整SQL数据库。
1.适当的索引索引基本上是⼀个数据结构,有助于加快整个数据检索过程。
唯⼀索引是⼀种索引,可以创建不重叠的数据列。
正确的索引能够更快地访问数据库,但是过多的索引或⽆索引反⽽会造成不好的结果,如果没有索引,那么处理会⾮常慢。
2.仅检索相关数据指定数据需要检索的精度。
使⽤命令*和LIMIT来代替SELECT*,调整数据库时,使⽤需要的数据集来代替整个数据集是⾮常有必要的,尤其是当你的数据源⾮常⼤的时候,指定所需要⽤的数据集将节省⼤部分时间。
*命令⽤于从列指定数据,LIMIT⼦句可以被⽤于强制SELECT语句返回指定的记录数。
它们两的组合避免了未来系统出现问题,此外,数据集的限定也在⼀定程度上减少了对数据库的进⼀步优化。
3.摆脱相关的⼦查询相关⼦查询基本上取决于⽗查询或外部查询。
这种搜索是逐⾏完成的,这意味着它会降低整个过程的速度。
通常如果WHERE来⾃于从外部查询的命令,应⽤⼦查询运⾏每⼀⾏,由⽗查询返回,从⽽减慢整个进程并降低数据库效率的话,更好的调整数据库的⽅式是INNERJOIN 命令。
当然在某些情况下,使⽤相关的⼦查询⾄关重要。
4.根据要求使⽤或避免临时表如果代码可以以简单的⽅式写,绝对不要让临时表复杂化。
当然,如果⼀个数据具有需要多次查询的具体程序,在这种情况下,建议使⽤临时表。
复杂sql优化的方法及思路

复杂sql优化的方法及思路复杂SQL优化的方法及思路SQL是关系型数据库管理系统中最常用的语言,但是在处理复杂查询时,SQL语句往往会变得非常复杂和冗长,导致查询速度缓慢。
为了提高查询效率,我们需要进行SQL优化。
以下是一些复杂SQL优化的方法及思路。
1.索引优化索引是提高数据库查询效率的重要手段之一。
在设计表结构时,应该根据实际情况建立适当的索引。
在查询语句中使用索引可以大大减少数据扫描量,从而提高查询效率。
2.避免使用子查询子查询虽然方便了我们编写复杂的SQL语句,但是在执行过程中会增加额外的开销。
因此,在编写复杂SQL语句时应尽量避免使用子查询。
3.减少JOIN操作JOIN操作也是影响查询效率的一个重要因素。
在设计表结构时应尽量避免使用JOIN操作或者减少JOIN操作次数。
4.合理使用聚合函数聚合函数(如SUM、AVG等)可以对数据进行统计分析,在处理大量数据时非常有用。
但是,在使用聚合函数时要注意不要频繁调用,否则会降低查询效率。
5.使用EXPLAIN命令分析查询语句EXPLAIN命令可以分析查询语句的执行计划,从而找出影响查询效率的因素。
通过分析EXPLAIN结果,可以对SQL语句进行优化。
6.避免使用SELECT *SELECT *会查询所有列,包括不需要的列,增加了数据扫描量,降低了查询效率。
在编写SQL语句时应尽量避免使用SELECT *。
7.合理使用缓存缓存可以减少数据库访问次数,提高查询效率。
在设计系统架构时应考虑缓存的使用。
8.优化表结构表结构的设计也是影响SQL查询效率的一个重要因素。
在设计表结构时应尽量避免冗余数据和过多的列。
以上是一些复杂SQL优化的方法及思路。
通过合理运用这些方法和思路,可以大大提高SQL查询效率,为数据库管理系统提供更好的性能和稳定性。
sql语句优化方法

SQL语句优化是一项重要的任务,因为它可以提高数据库的性能和响应速度。
以下是几个常见的SQL语句优化方法:1. 减少使用临时表和临时段:临时表和临时段的使用会占用系统资源,并且影响数据库性能。
尽量避免使用临时表和临时段,除非必须使用它们。
2. 使用正确的索引:在SQL查询中使用适当的索引可以提高查询速度。
了解表的索引策略和列之间的关系,以选择最佳的索引方式。
定期检查索引是否需要更新或优化。
3. 优化SQL查询语句:审查和优化SQL查询语句是优化SQL性能的关键。
优化查询语句包括选择合适的表连接方式、避免使用复杂的查询条件、使用合适的数据类型、避免使用过多的字符串操作等。
4. 避免在查询中使用嵌套查询:嵌套查询会增加查询的复杂性,并可能导致性能下降。
尽量减少嵌套查询的使用,并尝试使用其他查询方式来替代。
5. 合理使用子查询:子查询在某些情况下可以提高查询效率,但在其他情况下可能会成为性能瓶颈。
根据具体情况,合理使用子查询,并考虑将其与其他查询方式结合使用。
6. 减少数据重复:重复的数据会占用更多的存储空间,并可能导致查询速度变慢。
尽量减少数据的重复,并定期清理不再使用的数据。
7. 使用事务处理:事务处理可以提高数据的一致性和完整性,同时也可以提高数据库的性能。
合理使用事务处理,包括事务的隔离级别、锁机制等。
8. 定期优化数据库配置:定期检查数据库配置,包括内存分配、磁盘I/O、网络带宽等,并根据实际情况进行调整。
9. 使用缓存技术:缓存技术可以提高数据库的性能和响应速度,例如使用缓存数据库或使用缓存插件来缓存数据结果。
综上所述,优化SQL语句需要考虑多个方面,包括数据库配置、索引、查询语句、数据重复、事务处理和缓存技术等。
通过合理使用这些方法,可以提高数据库的性能和响应速度,从而提高系统的整体性能。
sql语句优化
sql语句优化性能不理想的系统中除了一部分是因为应用程序的负载确实超过了服务器的实际处理能力外,更多的是因为系统存在大量的SQL语句需要优化。
为了获得稳定的执行性能,SQL语句越简单越好。
对复杂的SQL语句,要设法对之进行简化。
常见的简化规则如下:1)不要有超过5个以上的表连接(JOIN)2)考虑使用临时表或表变量存放中间结果。
3)少用子查询4)视图嵌套不要过深,一般视图嵌套不要超过2个为宜。
连接的表越多,其编译的时间和连接的开销也越大,性能越不好控制。
最好是把连接拆开成较小的几个部分逐个顺序执行。
优先执行那些能够大量减少结果的连接。
拆分的好处不仅仅是减少SQL Server优化的时间,更使得SQL语句能够以你可以预测的方式和顺序执行。
如果一定需要连接很多表才能得到数据,那么很可能意味着设计上的缺陷。
连接是outer join,非常不好。
因为outer join意味着必须对左表或右表查询所有行。
如果表很大而没有相应的where语句,那么outer join很容易导致table scan 或index scan。
要尽量使用inner join避免scan整个表。
优化建议:1)使用临时表存放t1表的结果,能大大减少logical reads(或返回行数)的操作要优先执行。
仔细分析语句,你会发现where中的条件全是针对表t1的,所以直接使用上面的where子句查询表t1,然后把结果存放再临时表#t1中:Select t1….. into #tt1 from t1 where…(和上面的where一样)2)再把#tt1和其他表进行连接:Select #t1…Left outer join …Left outer join…3)修改 like 程序,去掉前置百分号。
like语句却因为前置百分号而无法使用索引4)从系统设计的角度修改语句,去掉outer join。
5)考虑组合索引或覆盖索引消除clustered index scan。
sql优化方案
sql优化方案SQL(Structured Query Language)是一种用于管理关系型数据库的编程语言,目前在各行各业被广泛应用。
SQL查询是数据库中必不可少的一部分,然而,在复杂的数据结构和大数据处理下,SQL查询的效率会受到很大的影响。
为此,开发人员必须寻找SQL优化的方法,以提高查询的效率。
在这篇文章中,我们将探讨一些SQL优化的方案,包括索引的使用、SQL查询的重构以及查询计划的调整。
1. 索引的使用索引是一种用于加速数据库查询的数据结构。
对于大型表而言,使用合适的索引可以大大提升查询速度。
通常情况下,索引应该建立在经常被查询的列上,或者在连接查询中大表的关联列上。
然而,对于频繁的更新、删除和插入操作,索引也会带来一定的开销,因此需要谨慎使用。
2. SQL查询的重构在编写SQL查询时,开发人员往往会使用一些常用的技巧,如在查询中避免使用通配符、使用LIMIT分页查询等。
但是,这些技巧并不能完全解决查询效率低下的问题。
为了更好地优化SQL查询,我们需要采用一些更加高级的技巧,如子查询、联合查询、视图和存储过程等。
子查询:子查询是一种将查询语句嵌套在主查询中的查询技术。
使用子查询可以大大减少SQL查询中的数据传输,从而提高查询效率。
联合查询:联合查询是一种将多个查询结果组合成一个结果集的查询技术。
使用联合查询可以减少多次查询的时间,从而提高SQL查询效率。
视图:视图是一种虚拟表,它是经过包装的SQL语句。
使用视图可以简化复杂的SQL查询,从而提高查询效率。
存储过程:存储过程是一种预先编译的SQL代码块。
使用存储过程可以减少数据传输和代码执行时间,从而提高SQL查询效率。
3. 查询计划的调整数据库管理系统通常会根据数据库中的数据自动生成查询计划。
但是,在大型数据库下,查询计划的生成可能会非常耗时,并且不一定是最优的。
为了解决这个问题,我们需要手动调整查询计划。
查询计划是指指导SQL引擎执行查询的执行计划。
优化sql语句的方法
优化sql语句的方法优化SQL语句可以提高数据库的性能和响应速度,从而提高应用程序的效率。
下面是一些优化SQL语句的方法:1. 尽量减少查询语句中的字段数量:只查询需要的字段,避免不必要的开销。
如果只需要其中相对少数几个字段,可以使用SELECT子句中的“列投影”来选择这些字段。
2. 尽量减少查询语句中的表数量:如果查询语句中有多个表,尽量减少连接操作。
可以使用子查询、视图或者临时表等方式将查询分成多个步骤进行。
3. 使用索引优化查询:在查询语句中使用适当的索引可以加快查询速度。
对于经常用于筛选和排序的列,可以创建索引。
但是过多的索引也会增加写操作的开销,需要酌情权衡。
4. 避免使用通配符搜索:在查询语句中尽量避免使用`LIKE`和通配符搜索,尤其是在`WHERE`子句的开始部分。
这样的查询无法使用索引,需要进行全表扫描,会降低查询性能。
5. 避免使用不必要的子查询:尽量避免多层嵌套的子查询,可以使用`JOIN`操作或者临时表来代替。
6. 使用合适的数据类型:选择合适的数据类型能够节约存储空间和提高查询效率。
对于存储数字的列,使用整型而不是字符型。
对于日期和时间,使用日期和时间相关的数据类型。
7. 避免使用函数:在查询语句中使用函数会延迟查询的执行。
如果可能的话,可以将函数的计算结果存储在表中,并更新这些结果,以减少函数的使用。
8. 调整查询顺序:在多表查询中,可以根据表的大小和索引情况来调整表的连接顺序,以减少嵌套循环连接的次数。
9. 避免查询大量数据:如果只需要部分数据,可以使用`LIMIT`关键字或者子查询来限制结果集的大小。
这样可以避免查询大量的数据,提高查询速度。
10. 使用缓存查询结果:如果可能的话,可以将查询结果缓存在内存中,以减少数据库的访问次数。
11. 对于复杂查询语句,可以使用数据库的性能分析工具来查找慢查询和瓶颈,进一步优化查询语句。
12. 定期进行数据库维护:对数据库进行定期的空间优化、索引重建和统计信息收集等维护操作,以提高查询性能。
sql优化方案
SQL优化方案1. 优化查询语句在进行SQL优化时,首先需要优化查询语句。
以下是一些常见的优化方法:1.1. 使用合适的索引索引能够大大加快查询的速度,通过在关键列上创建索引,可以使数据库更快地搜索到符合条件的数据。
在选择创建索引时,需要考虑哪些列频繁用于查询或连接操作,尽量避免在不必要的列上创建索引,因为索引的创建和维护也需要时间和资源。
1.2. 避免全表扫描全表扫描是指没有使用索引而对整个表进行扫描查询的操作,这种操作通常比较慢。
可以通过优化查询条件或添加索引来避免全表扫描。
例如,可以使用WHERE子句对查询条件进行优化,只返回需要的数据行,而不是返回整个表。
1.3. 使用合适的JOIN语句在进行多表查询时,使用合适的JOIN语句可以提高查询效率。
根据关联字段的数据分布情况,选择合适的连接方式(如INNER JOIN、LEFT JOIN等),避免不必要的连接操作。
另外,根据查询的需求,可以使用子查询或临时表来优化复杂的查询语句。
1.4. 使用LIMIT限制返回结果集大小当需要返回大量数据时,可以使用LIMIT关键字来限制返回结果集的大小。
通过限制结果集大小,可以减少数据库的负载和查询时间。
2. 表结构优化除了优化查询语句,优化表的结构也是提高SQL查询性能的关键:2.1. 规范化数据库设计规范化数据库设计可以消除数据冗余,减少数据库表的重复数据,提高查询效率。
通过拆分表,将数据分散存储,可以降低数据检索的复杂度,减少查询时间。
在规范化数据库设计时,需要根据实际业务需求和数据分布情况,选择合适的规范化程度。
2.2. 添加适当的约束通过添加适当的约束,比如主键约束、唯一约束和外键约束,可以提高数据的完整性和查询效率。
约束能够帮助数据库管理系统快速定位和检索数据,并避免不必要的数据冗余和错误。
2.3. 合理划分数据表和分区对于大型数据库,可以考虑对表进行水平分割,将数据划分到多个表或分区中。
通过分割表,可以减少单个表的数据量,提高查询效率。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SQL的优化应该从5个方面进行调整:1.去掉不必要的大型表的全表扫描2.缓存小型表的全表扫描3.检验优化索引的使用4.检验优化的连接技术5.尽可能减少执行计划的CostSQL语句:是对数据库(数据)进行操作的惟一途径;消耗了70%~90%的数据库资源;独立于程序设计逻辑,相对于对程序源代码的优化,对SQL语句的优化在时间成本和风险上的代价都很低;可以有不同的写法;易学,难精通。
SQL优化:固定的SQL书写习惯,相同的查询尽量保持相同,存储过程的效率较高。
应该编写与其格式一致的语句,包括字母的大小写、标点符号、换行的位置等都要一致ORACLE优化器:在任何可能的时候都会对表达式进行评估,并且把特定的语法结构转换成等价的结构,这么做的原因是要么结果表达式能够比源表达式具有更快的速度要么源表达式只是结果表达式的一个等价语义结构不同的SQL结构有时具有同样的操作(例如:= ANY (subquery) and IN (subquery)),ORACLE会把他们映射到一个单一的语义结构。
1 常量优化:常量的计算是在语句被优化时一次性完成,而不是在每次执行时。
下面是检索月薪大于2000的的表达式:sal > 24000/12sal > 2000sal*12 > 24000如果SQL语句包括第一种情况,优化器会简单地把它转变成第二种。
优化器不会简化跨越比较符的表达式,例如第三条语句,鉴于此,应尽量写用常量跟字段比较检索的表达式,而不要将字段置于表达式当中。
否则没有办法优化,比如如果sal上有索引,第一和第二就可以使用,第三就难以使用。
2 操作符优化:优化器把使用LIKE操作符和一个没有通配符的表达式组成的检索表达式转换为一个“=”操作符表达式。
例如:优化器会把表达式ename LIKE 'SMITH'转换为ename = 'SMITH'优化器只能转换涉及到可变长数据类型的表达式,前一个例子中,如果ENAME字段的类型是CHAR(10),那么优化器将不做任何转换。
一般来讲LIKE比较难以优化。
其中:~~IN 操作符优化:优化器把使用IN比较符的检索表达式替换为等价的使用“=”和“OR”操作符的检索表达式。
例如,优化器会把表达式ename IN ('SMITH','KING','JONES')替换为ename = 'SMITH' OR ename = 'KING' OR ename = 'JONES‘oracle 会将 in 后面的东西生成一张内存中的临时表。
然后进行查询。
如何编写高效的SQL:当然要考虑sql常量的优化和操作符的优化啦,另外,还需要:1 合理的索引设计:例:表record有620000行,试看在不同的索引下,下面几个SQL的运行情况:语句ASELECT count(*) FROM recordWHERE date >'19991201' and date <'19991214‘ and amount >2000语句BSELECT count(*) FROM recordWHERE date >'19990901' and place IN ('BJ','SH')语句CSELECT date,sum(amount) FROM recordgroup by date1 在date上建有一个非聚集索引A:(25秒)B:(27秒)C:(55秒)分析:date上有大量的重复值,在非聚集索引下,数据在物理上随机存放在数据页上,在范围查找时,必须执行一次表扫描才能找到这一范围内的全部行。
2 在date上的一个聚集索引A:(14秒)B:(14秒)C:(28秒)分析:在聚集索引下,数据在物理上按顺序在数据页上,重复值也排列在一起,因而在范围查找时,可以先找到这个范围的起末点,且只在这个范围内扫描数据页,避免了大范围扫描,提高了查询速度。
3 在place,date,amount上的组合索引A:(26秒)C:(27秒)B:(<1秒)分析:这是一个不很合理的组合索引,因为它的前导列是place,第一和第二条SQL没有引用place,因此也没有利用上索引;第三个SQL使用了place,且引用的所有列都包含在组合索引中,形成了索引覆盖,所以它的速度是非常快的。
4 在date,place,amount上的组合索引A: (<1秒)B:(<1秒)C:(11秒)分析:这是一个合理的组合索引。
它将date作为前导列,使每个SQL都可以利用索引,并且在第一和第三个SQL中形成了索引覆盖,因而性能达到了最优。
总结1缺省情况下建立的索引是非聚集索引,但有时它并不是最佳的;合理的索引设计要建立在对各种查询的分析和预测上。
一般来说:有大量重复值、且经常有范围查询(between, >,<,>=,<=)和order by、group by发生的列,考虑建立聚集索引;经常同时存取多列,且每列都含有重复值可考虑建立组合索引;在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。
比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就无必要建立索引。
如果建立索引不但不会提高查询效率,反而会严重降低更新速度。
组合索引要尽量使关键查询形成索引覆盖,其前导列一定是使用最频繁的列。
2 避免使用不兼容的数据类型:例如float和INt、char和varchar、bINary和varbINary是不兼容的。
数据类型的不兼容可能使优化器无法执行一些本来可以进行的优化操作。
例如:SELECT name FROM employee WHERE salary > 60000在这条语句中,如salary字段是money型的,则优化器很难对其进行优化,因为60000是个整型数。
我们应当在编程时将整型转化成为钱币型,而不要等到运行时转化。
3 IS NULL 与IS NOT NULL:不能用null作索引,任何包含null值的列都将不会被包含在索引中。
即使索引有多列这样的情况下,只要这些列中有一列含有null,该列就会从索引中排除。
也就是说如果某列存在空值,即使对该列建索引也不会提高性能。
任何在WHERE子句中使用is null或is not null的语句优化器是不允许使用索引的。
5 IN、OR子句常会使用工作表,使索引失效:如果不产生大量重复值,可以考虑把子句拆开。
拆开的子句中应该包含索引。
6 避免或简化排序:应当简化或避免对大型表进行重复的排序。
当能够利用索引自动以适当的次序产生输出时,优化器就避免了排序的步骤。
以下是一些影响因素:索引中不包括一个或几个待排序的列;group by或order by子句中列的次序与索引的次序不一样;排序的列来自不同的表。
为了避免不必要的排序,就要正确地增建索引,合理地合并数据库表(尽管有时可能影响表的规范化,但相对于效率的提高是值得的)。
如果排序不可避免,那么应当试图简化它,如缩小排序的列的范围等。
7 消除对大型表行数据的顺序存取:在嵌套查询中,对表的顺序存取对查询效率可能产生致命的影响。
比如采用顺序存取策略,一个嵌套3层的查询,如果每层都查询1000行,那么这个查询就要查询 10亿行数据。
避免这种情况的主要方法就是对连接的列进行索引。
例如,两个表:学生表(学号、姓名、年龄??)和选课表(学号、课程号、成绩)。
如果两个表要做连接,就要在“学号”这个连接字段上建立索引。
还可以使用并集来避免顺序存取。
尽管在所有的检查列上都有索引,但某些形式的WHERE子句强迫优化器使用顺序存取。
下面的查询将强迫对orders表执行顺序操作:SELECT * FROM orders WHERE (customer_num=104 AND order_num>1001) OR order_num=1008虽然在customer_num和order_num上建有索引,但是在上面的语句中优化器还是使用顺序存取路径扫描整个表。
因为这个语句要检索的是分离的行的集合,所以应该改为如下语句:SELECT * FROM orders WHERE customer_num=104 AND order_num>1001UNIONSELECT * FROM orders WHERE order_num=1008这样就能利用索引路径处理查询。
8 避免相关子查询:一个列的标签同时在主查询和WHERE子句中的查询中出现,那么很可能当主查询中的列值改变之后,子查询必须重新查询一次。
查询嵌套层次越多,效率越低,因此应当尽量避免子查询。
如果子查询不可避免,那么要在子查询中过滤掉尽可能多的行。
9 避免困难的正规表达式:MATCHES和LIKE关键字支持通配符匹配,技术上叫正规表达式。
但这种匹配特别耗费时间。
例如:SELECT * FROM customer WHERE zipcode LIKE “98_ _ _”即使在zipcode字段上建立了索引,在这种情况下也还是采用顺序扫描的方式。
如果把语句改为SELECT *FROM customer WHERE zipcode >“98000”,在执行查询时就会利用索引来查询,显然会大大提高速度。
另外,还要避免非开始的子串。
例如语句:SELECT * FROM customer WHERE zipcode[2,3] >“80”,在WHERE子句中采用了非开始子串,因而这个语句也不会使用索引。
10 不充份的连接条件:例:表card有7896行,在card_no上有一个非聚集索引,表account有191122行,在account_no上有一个非聚集索引,试看在不同的表连接条件下,两个SQL的执行情况:SELECT sum(a.amount) FROM account a,card b WHERE a.card_no = b.card_no(20秒)将SQL改为:SELECT sum(a.amount) FROM account a,card b WHERE a.card_no = b.card_no and a.account_no=b.account_no(<1秒)分析:在第一个连接条件下,最佳查询方案是将account作外层表,card作内层表,利用card上的索引,其I/O 次数可由以下公式估算为:外层表account上的22541页+(外层表account的191122行*内层表card上对应外层表第一行所要查找的3页)=595907次I/O在第二个连接条件下,最佳查询方案是将card作外层表,account作内层表,利用account上的索引,其I/O 次数可由以下公式估算为:外层表card上的1944页+(外层表card的7896行*内层表account上对应外层表每一行所要查找的4页)= 33528次I/O可见,只有充份的连接条件,真正的最佳方案才会被执行。