GG资源网

如何通过优化sql语句提高数据库查询效率?(如何通过优化分配制度和政策实现共同富裕)

下面简单说几种提高SQL查询效率的方法:

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

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

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

select id from t where num is null

可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:

select id from t where num=0

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

select id from t where num=10 or num=20

可以这样查询:

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.尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。

#####

1.正确的创建合适的索引是提成生数据库查询的基础。

2.索引是为了加速对表中数据行的检索而创建的一种分散存储的数据数据结构。如图以mysql(innodb引擎)为例

3.为什么要用索引?

a.索引能极大的减少存储引擎需要扫描的数据量。

b.索引可以把随机IO变成顺序IO。

c.索引可以帮助我们在进行分组、排序等操作时,避免使用临时表。

4.sql前面加上 explain select Column Name1,Column Name2,Column Name3 from table;

排查是否走索引依次从好到差:system,const,eq_ref,ref,fulltext,ref_or_null,unique_subquery,index_subquery,range,index_merge,index,ALL。

5.索引注意要点

a.选择离散度高的列建索引.

b.索引列的数据长度能少则少。

c.索引一定不是越多越好,越全越好,一定是建合适的。

d.匹配列前缀可用到索引 like 9999%,like %9999%、like %9999用不到索引;

e.Where 条件中 not in 和 <>操作无法使用索引;匹配范围值,order by 也可用到索引

f.多用指定列查询,只返回自己想到的数据列,少用select *;

g.联合索引中如果不是按照索引最左列开始查找,无法使用索引;联合索引中精确匹配最左前列并范围匹配另外一列可以用到索引;

h.联合索引中如果查询中有某个列的范围查询,则其右边的所有列都无法使用索引。

我是阳光随馨馨,如果你看完了,点个赞,加个关注,转发一下哈

#####

我来说说我日常的语句优化,日常大家都是本着完成客户的需求进行编写语句,但是如果一个运行中的Job速度比较慢的话,会导致系统卡死,无响应等情况产生,所以就需要有优化!

1.SELECT子句中避免使用\'*\':查询的时候最好是不要使用*号 比如你这表列特别多的话会导致查询速度慢,耗费更多的时间

2.EXISTS替代IN 用NOT EXISTS替代NOT IN:EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False.EXISTS 指定一个子查询,检测 行 的存在,返回值是一个BOOL值

IN:子查询先产生结果集,然后主查询再去结果集里去找符合要求的字段列表去.符合要求的输出,反之则不输出.

3.能走索引的走索引:要看执行计划,走什么索引要根据数据量进行分析

4.我感觉分区也是一周优化查询效率的方法

嘻嘻~暂时只能想到这么多,菜鸟一枚!!ヾ(✿゚▽゚)ノ

#####

一、查询条件精确,针对有参数传入情况 二、SQL逻辑执行顺序 FROM–>JOIN–>WHERE–>GROUP–>HAVING–>DISTINCT–>ORDER–>TOP 三、横向 查询需要的字段 当在SQL语句中连接多个表时,请使用表的别名并把别名前缀于每个Column上这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误 四、少做重复工作 控制同一语句的多次执行,特别是一些基础数据的多次执行是很多程序员很少注意的 减少多次的数据转换 杜绝不必要的子查询和连接表,子查询在执行计划一般解释成外连接,多余的连接表带来额外的开销 五、关于零时表#与表变量@ 如果语句很复杂,连接太多,可以考虑用临时表和表变量分步完成 如果需要多次用到一个大表的同一部分数据,考虑用临时表和表变量暂存这部分数据 如果需要综合多个表的数据,形成一个结果,可以考虑用临时表和表变量分步汇总这多个表的数据 关于临时表和表变量的选择,在数据量较多的情况下,临时表的速度反而更快 SELECT INTO会比CREATE TABLE + INSERT INTO的方法快,但是SELECT INTO会锁定TEMPDB的系统表SYSOBJECTS、SYSINDEXES、SYSCOLUMNS,在多用户并发环境下,容易阻塞其他进程 六、子查询 子查询可以用IN、NOT IN、EXISTS、NOT EXISTS引入 NOT IN、NOT EXISTS的相关子查询可以改用LEFT JOIN代替写法 如果保证子查询没有重复 ,IN、EXISTS的相关子查询可以用INNER JOIN 代替 IN的相关子查询用EXISTS代替 七、索引 避免对索引字段进行计算操作 SELECT ID FROM T WHERE NUM/2=100 应改为: SELECT ID FROM T WHERE NUM=100*2 避免在索引字段上使用NOT,<>,!= 避免在索引列上使用IS NULL和IS NOT NULL 避免在索引列上出现数据类型转换 避免在索引字段上使用函数 避免建立索引的列中使用空值 不要对索引字段进行多字段连接 WHERE FAME+’. ‘+LNAME=’HAIWEI.YANG’ 应改为: WHERE FNAME=’HAIWEI’ AND LNAME=’YANG’ 八、多表连接 多表连接的时候,连接条件必须写全,宁可重复,不要缺漏 连接条件尽量使用聚集索引 九、其他 在可以使用UNION ALL的语句里,使用UNION ALL 避免在WHERE子句中使用IN,NOT IN,OR 避免使用耗费资源的操作,带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL语句会启动SQL引擎执行,耗费资源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要执行两次排序 LIKE ‘%5400%’ 这种查询不会引用索引,而LIKE ‘X5400%’则会引用范围索引。

#####

不要滥用索引

#####

由于不同的数据库版本,一些常用的优化技巧可能随着数据库版本的更新发生变化,以下主要把一些常用的优化技巧进行总结,使用时可根据实际情况进行调整,对于MySql要善用Explain查看执行计划,对于Sql Server要善用执行计划功能。

1.优化第一步建立合适的索引,要尽量避免全表扫描,考虑在where以及order by 设计的列上建立索引。

2.尽量避免在where子句中对字段进行null值判断,这样会导致全表扫描。

3.避免在where子句中用or进行条件链接,可以考虑使用 union all 将查询进行拆分。

4.尽量用union all 替代union,union和union all的差异主要是前者需要将结果集合并后再进行唯一性过滤操作,这就会涉及到排序,增加大量的CPU运算,加大资源消耗及延迟。当然,union all的前提条件是两个结果集没有重复数据。

5.在where子句中避免使用 in 或 not in,应考虑使用exists 或 not exists代替。

6.避免使用 like 模糊查询,可以考虑使用全文索引。

7.尽量避免在where 子句中对字段进行表达式操作,这样会导致全表扫描,(如:select id from table where num/10=2)

8.尽量避免在 where 字句中对字段进行函数操作。

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

10.不使用无意义的查询条件,(如:select id from table where 1=1)。

11.不使用count(*)的计数查询,要指定具体字段。

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

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

15.查询语句不可使用 select * from table, 用具体字段代替*。

16.避免在where子句中出现字段的类型转换。

17.注意范围查询语句,如between,> ,< 等条件时,后面的索引字段会失效。

以上只是一些常用的优化技巧,希望能够有一定的帮助,数据库优化不是一蹴而就的事情,需要不断的学习。

#####

只要不懂,还是片面欠缺的,语句优化,能全面的就不要片面,要片面也不要顶全面,就看语句了,提高CPU处理效率也是至关重要的,也就是说计算机效能!除此之外数据库也重要!

#####

sql优化很多方法,每种情况不一样。

比如,建立索引,关键字大写,尽量避免使用游标,减少使用星号查询,尽量避免clustered索引,exists代替in…

#####

子查询 多表查询 索引 预编译函数 缓存 数据库设计

由于网站搬家,部分链接失效,如无法下载,请联系站长!谢谢支持!
1. 带 [亲测] 说明源码已经被站长亲测过!
2. 下载后的源码请在24小时内删除,仅供学习用途!
3. 分享目的仅供大家学习和交流,请不要用于商业用途!
4. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
5. 本站所有资源来源于站长上传和网络,如有侵权请邮件联系站长!
6. 没带 [亲测] 代表站长时间紧促,站长会保持每天更新 [亲测] 源码 !
7. 盗版ripro用户购买ripro美化无担保,若设置不成功/不生效我们不支持退款!
8. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
9. 如果你也有好源码或者教程,可以到审核区发布,分享有金币奖励和额外收入!
10.如果您购买了某个产品,而我们还没来得及更新,请联系站长或留言催更,谢谢理解 !
GG资源网 » 如何通过优化sql语句提高数据库查询效率?(如何通过优化分配制度和政策实现共同富裕)

发表回复

CAPTCHAis initialing...