`

提高数据库查询效率的有效方法

阅读更多
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where  order by 涉及的列上建立索引。
 
  2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
 
  select id from t where num is null
 
  可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
 
  select id from t where num0
 
  3.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
 
  4.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:
 
  select id from t where num10 or num20
 
  可以这样查询:
 
  select id from t where num10
 
  union all
 
  select id from t where num20
 
  5in  not in 也要慎用,否则会导致全表扫描,如:
 
  select id from t where num in123
 
  对于连续的数值,能用 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 withindex(索引名)) where num@num
 
  8.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:
 
  select id from t where num/2100
 
  应改为:
 
  select id from t where num100*2
 
  9.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:
 
  select id from t where substringname13)='abc'--nameabc开头的id
 
  select id from t where datediffdaycreatedate'20051130')=0--‘20051130’生成的id
 
  应改为:
 
  select id from t where name like 'abc%'
 
  ='20051130' and createdate<'2005121'
 
  10.不要在 where 子句中的“=左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
 
  11.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。
 
  12.不要写一些没有意义的查询,如需要生成一个空表结构:
 
  select col1col2 into #t from t where 10
 
  这类代码不会返回任何结果集,但是会消耗系统资源的,应改成这样:
 
  create table #t(...)
 
  13.很多时候用 exists 代替 in 是一个好的选择:
 
  select num from a where num inselect num from b
 
  用下面的语句替换:
 
  select num from a where existsselect 1 from b where numanum
 
  14.并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引,如一表中有字段sexmalefemale几乎各一半,那么即使在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.尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。
 
  QUOTE:原帖由 newkid  2010610 2248 发表
 
  记得我不止一次在这里和别人争过这个问题了。
 
  1你的程序再严谨也有可能出现BUG;你自己判断不如交给数据库判断,它做得又快又好。
 
  大多数人的程序没有考虑并发问题。一旦考虑了就得手工加锁,效率很低。
 
  数据可能绕过你的应用程序进入数据库。
 
  2性能问题:难道你自己做就没有开销?
 
  一个外键判断分摊到事务级别,开销可以忽略,用户完全没有察觉。
 
  如果是批量导入数据,可以先暂时屏蔽外键,事后用NOVALIDATE选项快速恢复,前提是你的数据是干净的。
 
  3举个麻烦的例子看看?
 
  外键约束正是为了防止你乱来,这是给你的保护。
 
  开车系安全带麻烦吧?有时候它能救你的命。
 
  4 nyfor说过了可以用延迟约束。但根据我的经验没什么必要。凡是有外键则父亲数据必定先生成。比方说你的入库单,入库明细需要这个单号,那么父亲表(入库单)肯定要先生成。
 
  此外,外键还会给CBO提供重要的信息,用来生成最优计划。
 
  反方:代表人物qingyun。主要论点如下
 
  QUOTE:原帖由 qingyun  2010610 1332 发表
 
  我不太喜欢外键,
 
  原因:
 
  1.程序逻辑,完整性,我会在存储过程或包等地方做严谨的判断;
 
  2.性能问题,这是我最不喜欢用的关键原因,比如一个业务流水表,频繁插入数据,如果这个表身上有3外键,那么每次插入一条,就必须对这3个外键对应的 3个表做相应的查找判断有无对应数据,如果这3个表也很大,那就这3个表的判断时间就很常,虽然外键指向的关联表的字段肯定是索引,但是我觉得很多时候,这样的判断本来就在程序里控制好了,通过外键再判断一次,就是降低性能;而且其实有的地方判不判断也无所谓的,但是用了外键,就必须化时间去判断,无论 oracle内部多么优化外键对于数据的检索速度,它总是一个不小的消耗;
 
  3.维护麻烦,很多公司的软件都是定制的,这种定制的东西,随意性相对较大,项目开发实施过程中,需要经常对表修修补补;还有就是业务逻辑有bug或者其他情况,需要经常手工维护数据,有错综复杂的外键关联着,很是麻烦;
 
  4.外键定死了两个表之间数据的先后生成关系,最常见的是单据主从表,有的时候,在生成单据的时候,是先生成明细,再生成主表;如果钉死了外键,这个就没法实现;
 
  当然有些关键的业务,确实需要外键;
 
  为什么说这个话题,我今天把项目数据库建立好后,用了很少的外键,周围同事说数据不严谨,需要错综复杂的那些相同字段名的外键都建立起来,这个我很不情愿;
 
  比如这个数据库一共100个表,按他们的想法,外键就可能有300个;我晕,太教条主义了;
 
  如果说让我建300个索引,我很乐意,因为提高运作效率的,而外键只是检测严谨性,对数据库的运作效率只有降低,没有任何提高的可能性;
 
  其实这只是设计习惯的问题,有兴趣大家随便聊聊自己的习惯。
 
  还有一个反方的声音有独特见解,一起放上来供大家参考
 
  QUOTE:原帖由 ruideliang  2010612 1442 发表
 
  外键是暴露的,程序是封闭的,同样是经过测试的程序和外键约束,人为因素造成约束失效的可能性谁大谁小,很明显,所以反对使用外键,因为与系统高可用性目的冲突
分享到:
评论

相关推荐

    30个提高数据库查询效率方法总结笔记

    以下是30个提高数据库查询效率的实用方法: 1. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 知识点:索引的作用是缩小扫描的范围,从而提高查询效率。但是,索引也...

    提高数据库查询效率

    综上所述,通过对数据库设计和SQL语句的合理优化,可以有效地提高数据库查询效率。实践中需要综合考虑各种因素,比如索引的数量和类型、数据类型的选择、临时表和表变量的应用等,以达到最佳的性能表现。此外,随着...

    怎样提高数据库查询效率

    提高数据库查询效率技巧 数据库查询效率是数据库性能的关键指标之一。提高数据库查询效率可以大大提高应用程序的响应速度和用户体验。本文总结了15条提高数据库查询效率的技巧,涵盖了查询优化、索引使用、where ...

    如何提高数据库访问效率

    4. **硬件升级**:增加内存、提升CPU性能或增加CPU数量都是提高数据库性能的有效方法。确保虚拟内存设置合理,通常是物理内存的1.5倍,如果使用全文检索,可能需要更大的虚拟内存。 5. **网络优化**:提高网络速度...

    怎样提高数据库查询效率.doc

    提高数据库查询效率 数据库查询效率是数据库性能优化的关键所在,影响着整个系统的性能和效率。在本文中,我们将讨论如何提高数据库查询效率,提供了一系列实用的建议和技巧,旨在帮助开发者和数据库管理员提高...

    提高Oracle数据库查询效率

    ### 提高Oracle数据库查询...通过以上这些优化策略,可以有效地提高Oracle数据库的查询效率,从而提升整体系统的性能。在实际应用中,还需要根据具体的业务场景和数据库结构,灵活运用这些技巧,以达到最佳的优化效果。

    提高数据库SQL查询效率的方法.pdf

    文章讨论了提高数据库SQL查询效率的必要性和方法,首先强调了查询优化对数据库系统性能的重要性,并指出虽然有些程序员可能认为查询优化是数据库管理系统(DBMS)的任务,但实际上SQL语句的效率对数据库系统的性能起到...

    数据库查询效率

    ### 数据库查询效率提升策略...合理地利用索引、避免不必要的全表扫描、优化查询语句等方法,都是提高查询效率的有效途径。在实际应用中,开发者应该根据具体需求灵活运用这些策略,不断优化查询性能,以达到最佳效果。

    Oracle数据库查询优化的方法

    索引是数据库中用于快速查找记录的一种数据结构,选择性高的列(即具有较少重复值的列)创建索引可以显著提高查询效率。Oracle支持B树索引、位图索引和函数索引等多种类型,根据实际需求选择合适的索引类型。 其次...

    提高Java访问数据库效率的方法研究与探讨.pdf

    综上所述,本文从数据库结构设计、查询优化、以及访问数据库的模式选择三个层面,探讨了提高Java访问数据库效率的方法。合理设计数据库结构,优化SQL查询语句,选择合适的访问模式,并在编程中采取优化措施,都是...

    如何提高oracle-数据库查询效率.docx

    【提高Oracle数据库查询效率】 在Oracle数据库中,优化查询性能是一项关键任务,尤其是在处理大量数据时。以下是一些关于如何提升Oracle数据库查询效率的关键知识点: 1. **索引选择与优化**: - 问题中提到,...

    数据库查询优化算法

    数据库查询优化是数据库管理系统中的关键环节,其目的是在满足用户查询需求的同时,尽可能地提高查询效率,减少资源...通过合理运用这些算法和技术,可以有效地提高数据库的运行效率,为业务提供稳定、快速的数据服务。

    数据库文件\数据库查询慢优化方法

    - **分区视图**:通过分区视图实现数据库联合体,分散负载,提高查询效率。 - **查询语句编写技巧**:遵循SQL最佳实践,比如避免在WHERE子句中使用函数,避免在索引列上使用计算。 以上策略可以根据实际情况组合...

    SQL数据库查询效率的研究.pdf

    只有系统地理解和掌握了SQL查询的原理和优化方法,才能有效地提高查询效率,从而提升数据库系统的整体性能。在SQL数据库查询效率的研究中,优化连接查询是提高效率的关键,而对于优化策略的掌握和应用,是每个数据库...

    数据写入数据库效率比较(好的方法效率提高20倍,文档)

    ### 数据写入数据库效率比较分析 #### 一、引言 在进行大量数据写入数据库的操作时,选择合适的方法能够显著提升效率。本文档通过对比分析长连接、短连接、`DataTable`批处理以及`SqlBulkCopy`等方式,旨在帮助...

    浅谈如何优化SQL语句提高数据库系统效率.pdf

    本篇文档题为“浅谈如何优化SQL语句提高数据库系统效率”,旨在探讨在数据库系统中如何通过优化SQL语句来提升整体性能。文档中提到了多种SQL优化的策略和方法,涵盖了查询优化、索引使用、查询语句的设计原则等方面...

    基于MS SQL Server数据库的查询优化方法.pdf

    本文 Introduced基于MS SQL Server数据库的查询优化方法,讨论了查询优化的基本原理和MS SQL Server的查询优化方法,并提出了查询优化的指导性策略和实用方法,以提高MS SQL Server数据库的查询效率。

    怎样优化数据库查询,提高优化效率?.pdf

    优化数据库查询提高效率 在数据存储和处理中,数据库查询优化是非常重要的一环。如何优化数据库查询以提高效率是开发者和数据库管理员需要关心...只有通过对这些方面的优化,才能提高数据库查询效率和整个系统的性能。

Global site tag (gtag.js) - Google Analytics