如何提高SQL查询效率
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
select id from t where num=0
3.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
4.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num=10 or num=20
可以这样查询:
?
1
2
3
select id from t where num=10
union all
select id from t where num=20
5.in 和 not in 也要慎用,否则会导致全表扫描,如:
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'--name以abc开头的id
select id from t where datediff(day,createdate,'2005-11-30')=0--‘2005-11-30’生成的id
应改为:
select id from t where name like 'abc%'
select id from t where createdate>='2005-11-30' and createdate<'2005-12-1'
10.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
11.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不 会被使用,并且应尽可能的让字段顺序与索引顺序相一致。
12.不要写一些没有意义的查询,如需要生成一个空表结构:
select col1,col2 into #t from t where 1=0
这类代码不会返回任何结果集,但是会消耗系统资源的,应改成这样:
create table #t(...)
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查询可能不会去利用索引,如一表中 有字段sex,male、female几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。
15.索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有 必要。
16.应尽可能的避免更新 clustered 索引数据列,因为 clustered 索引数据列的顺序就是表记录的物理存储顺序,一旦该列值改变将导致整个表记录的顺序的调整,会耗费相当大的资源。若应用系统需要频繁更新 clustered 索引数据列,那么需要考虑是否应将该索引建为 clustered 索引。
17.尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和 连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。
18.尽可能的使用 varchar/nvarchar 代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。
19.任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。
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写法"这一标题揭示了我们即将探讨的是一些非同寻常的MySQL查询技巧,这些技巧可能挑战了常规的编程思维,能为程序员带来全新的理解和操作体验。描述中的“耗费了本人大量心血”暗示了作者在深入...
本文将介绍10个高级SQL写法,这些技巧主要源自MySQL 8.0环境,适用于处理各种业务需求。 1. **ORDER BY FIELD() 自定义排序** 在MySQL中,除了常见的`ASC`和`DESC`用于排序外,`ORDER BY FIELD()`函数允许我们...
**SQL写法基础** 1. **创建表结构**:在Sybase IQ中,创建表时需要指定列的数据类型、长度和是否允许为空。例如: ```sql CREATE TABLE Sales ( ProductID INT NOT NULL, SaleDate DATE, Quantity SOLDouble, ...
总的来说,熟练掌握在SQL中抛出异常的方法,能显著提升开发质量和效率,尤其是在处理报表这类复杂逻辑时。通过合理使用`RAISERROR`和`THROW`,以及配合`TRY...CATCH`,我们可以更好地控制错误处理,确保程序的稳定性...
通过合理设计表结构(如选择合适的数据类型、主键和外键)、创建和使用索引、调整查询语句,可以显著提升SQL Server的运行效率。 7. **安全性与权限管理**: - SQL Server提供了一套完整的权限管理系统,包括用户...
### 经典总结:提升PHP效率的高阶写法 在现代Web开发中,PHP作为一门广泛使用的服务器端脚本语言,其性能优化一直是开发者关注的焦点。以下是从标题、描述以及部分文件内容中提炼出的提升PHP效率的关键知识点,旨在...
使用绑定变量是提高SQL语句执行效率的关键技术之一。 绑定变量的概念和重要性: 绑定变量是SQL语句中用于代替硬编码的字面值的占位符。它们在SQL语句第一次执行时被赋值,然后存储在数据库的共享池中,供后续相同的...
3. Syntactical SQLOptimizer(语法SQL优化器):该功能可以自动改写SQL语句,以寻找语义相同但执行效率更高的SQL写法。通过分析每一种可能的执行计划,并列举出对应的SQL语句,它能够极大地提高寻找最佳化SQL语句的...
第三,注意SQL的写法。使用JOIN操作时,确保正确指定JOIN条件,并优先选择小表作为驱动表,以减少数据处理量。此外,避免在SELECT语句中使用*,而是明确指定需要的字段,这样可以减少数据传输量,提高执行效率。 第...
### SqlServer 高级命令详解 #### 概述 在SQL Server中,高级命令是指那些能够帮助数据库管理员或开发人员更高效地管理、查询及优化数据的特定指令。...这对于提高 SQL Server 数据库管理和开发效率具有重要意义。
在Java的持久化框架Hibernate中,Criteria API是一种用于构建动态查询的强大工具,它允许开发者以对象化的方式构建SQL语句,而无需直接编写SQL代码...结合源码理解和版本控制工具,可以进一步提高开发效率和代码质量。
高级的SQLTracker可能还会提供一些自动化的优化建议,如提示改进索引策略,优化表结构,或者调整SQL语句的写法。 总的来说,SQLTracker作为一款强大的Oracle SQL跟踪工具,其简洁的使用方式、全面的功能以及对64位...
### 写出高性能SQL语句的35条方法详解 #### 1. 使用索引优化查询性能 - **描述**:对于频繁访问的列或条件,合理创建索引可以极大提高查询速度。 - **实现**:例如,在进行关联查询时,确保连接列有索引;在`WHERE...
`NOT EXISTS`方法与`NOT IN`类似,但通常被认为效率更高,因为它避免了子查询返回的结果集被全表扫描。例如: ```sql SELECT TOP 50 * FROM pagetest WHERE NOT EXISTS (SELECT 1 FROM (SELECT TOP 9900 id FROM...
第14章 动手,高级写法应用让SQL飞 381 14.1 具体SQL调优思路 381 14.1.1 改写SQL调优 382 14.1.2 不改写SQL调优 382 14.2 高级SQL介绍与案例 383 14.2.1 GOURP BY的扩展 383 14.2.2 INSERT ALL 389 14.2.3 ...
今天根据经验总结一些高级查询(SQL)及SQL效率优化,有时同样能达到查询效果,但也许系统所耗费的资源可能有很大差异,由于SQL书写的影响,同一功能同一性能不同写法SQL的影响。下面是sql语句优化的一些提示要点,...
直至无法产生新的输出或搜索限额满→对 输出的SQL语句进行过滤,选出具有不同执行计划的SQL语句(即不同的执行效率)→对得到的SQL语句进行批量测试,找出性能最好的SQL语句。图2 优化前的SQL语句 自动优化实例 假设...
有效的分词可以提高全文搜索的准确性和效率。然而,即使是最先进的分词系统也无法保证100%的准确性,因为中文的复杂性和多义性使得完全准确的分词极具挑战性。 总的来说,MySQL的全文搜索功能结合PHP的中文分词技术...
在Oracle 9i及更高版本中,可以使用ROWNUM伪列进行分页。ROWNUM是在查询结果集生成时被赋予的数值,表示行的顺序。例如,如果我们想要获取前10条记录,可以使用以下查询: ```sql SELECT * FROM ( SELECT t.*, ...
它们能识别潜在的语法错误或不推荐的SQL写法,并提供改进方案。这有助于预防运行时错误,同时提高查询效率。比如,它可能会提醒用户避免使用全表扫描,推荐使用索引或更高效的JOIN策略。 此外,这些工具往往支持...