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=03.应尽量避免在 where 子句中使用!=或&&操作符,否则将引擎放弃使用索引而进行全表扫描。4.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num=10 or num=20可以这样查询:select id from t where num=10union allselect id from t where num=205.in 和 not in 也要慎用,否则会导致全表扫描,如:select id from t where num in(1,2,3)对于连续的数值,能用 between 就不要用 in 了:select id from t where num between 1 and 36.下面的查询也将导致全表扫描: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=@num8.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:select id from t where num/2=100应改为:&select id from t where num=100*29.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:select id from t where substring(name,1,3)='abc'--name以abc开头的idselect id from t where datediff(day,createdate,'')=0--‘’生成的id应改为:select id from t where name like 'abc%'select id from t where createdate&='' and createdate&''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.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列
数据库查询优化方案(处理上百万级记录如何提高处理查询速度)
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列
处理上百万条的数据库如何提高处理查询速度
1、对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
  select id from t where num is null
  可以在num上设置默认值0,确保表中num列没有
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from
处理上百万条的数据库如何提高处理查询效率
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num is null可以在num上设置默认值0,确保表中num列没有null值,然后这样
如何提高上百万条的数据库查询速度
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查
处理百万级以上的数据提高查询速度的方法
处理百万级以上的数据提高查询速度的方法: 1.应尽量避免在 where 子句中使用!=或&&操作符,否则将引擎放弃使用索引而进行全表扫描。 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 3.应尽量避免在 where 子句中对字段进行 null
mysql数据库百万级记录查询分页优化
http://www.lvtao.net/database/mysql_page_limit.html .cn/s/blog_3ffxfg.html http://wgxsoft./blog/static//
处理百万级以上的数据处理
一.处理百万级以上的数据提高查询速度的方法: 1.应尽量避免在 where 子句中使用!=或&&操作符,否则将引擎放弃使用索引而进行全表扫描。
2.对查询进行优化,应尽量避免全表扫描,首先
批量处理JDBC语句提高处理速度
有时候JDBC运行得不够快,这使得有些程序员使用数据库相关的存储过程。作为一个替代方案,可以试试使用Statement 的批量处理特性看看能否同时执行所有的SQL以提高速度。 存储过程的最简单的形式就是包含一系列SQL语句的过程,将这些语句放在一起便于在同一个地方管理也可以提高速度。Statement 类可以包含一系列SQL语句,因此允许在同一个数据库事务执行所
处理百万级以上的数据处理
处理百万级以上的数据提高查询速度的方法: 1.应尽量避免在 where 子句中使用!=或&&操作符,否则将引擎放弃使用索引而进行全表扫描。 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 3.应尽量避免在 where 子句中对字段进行 null 值判断,否则
如何优化数据库查询
1. 缓存。在持久层或持久层之上做缓存。从数据库中查询出来的数据先放入缓存中,下次查询时,先访问缓存,如果未命中则查询数据库。
2. 表分区和拆分.无论是业务逻辑上的拆分还是无业务含义的分区。
3. 提高磁盘速度.这包括RAID和其他磁盘文件分段的处理。主要的思想是提高磁盘的并发度(多个物理磁盘存放同一个文件)。
数据库系统是管理信息系统的核心,基于数据库的联机事务处理(OLTP)以及联机分析处理(OLAP)是银行、企业、政府等部门最为重要的计算机应用之一。从大多数系统的应用实例来看,查询操作在各种数据库操作中所占据的比重最大,而查询操作所基于的SELECT语句在SQL语句中又是代价最大的语句。举例来说,如果数据的量积累到一定的程度,比如一个银行的账户数据库表信息积累到上百万甚至上千万条记录,全表扫描一次往
在一个千万级的数据库查寻中,如何提高查询效率?分别说出在数据库设计、SQL语句、java等层面的解决方案。(转载)
1)数据库设计方面:
a. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
b. 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from
在数据库中条件查询速度很慢的时候?如何优化?
提高查询检索的性能
创建唯一索引 创建主键 归类
2.减少表之间的关联3.优化sql,尽量让sql很快定位数据,不要让sql做全表查询,应该走索引,把数据量大的表排在前面4.简化查询字段,没用的字段不要,已经对返回结果的控制,尽量返回少量数据
mysql 数据库增加1百万条记录,查询时,服务器死掉
:45:28 InnoDB: Error: space id and page n:o stored in the page InnoDB: read in are , should be 0:8511! InnoDB: Database page corruption on dis
如何提高数据库查询速度 (摘录) -转/yzwdli/archive//1097216.html
1、用程序中, 保证在实现功能的基础上,尽量减少对数据库的访问次数; 通过搜索参数,尽量减少对表的访问行数,最小化结果集,从而减轻网络负担; 能够分开的操作尽量分开处理,提高每次的响应速度; 在数据窗口使用SQL时,尽量把使用的索引放在
Hibernate如何提高数据库查询性能
数据库查询性能的提升也是涉及到开发中的各个阶段,在开发中选用正确的查询方法无疑是最基础也最简单的。
SQL语句的优化
使用正确的SQL语句可以在很大程度上提高系统的查询性能。获得同样数据而采用不同方式的SQL语句在性能上的差距可能是十分巨大的。 &
Oracle数据库中利用索引表提高查询速度
Oracle数据库中利用索引表提高查询速度 在索引表的ROWID中存储的病不是记录的实际物理地址,而是逻辑的物理地址。故有些数据库管理员把索引表中的ROWID列称为ROWID伪主键列,他存放的是表的主键信息。
  一、索引表与标准表的差异。
  索引表与标准表的差异主要体现在四个方面。
  一是索引表中的ROWID列存放的时主键信息,使逻辑的物理
处理百万级以上数据的注意事项
处理百万级以上的数据提高查询速度的方法: 1.应尽量避免在 where 子句中使用!=或&&操作符,否则将引擎放弃使用索引而进行全表扫描。 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 3.应尽量避免在 where 子句中对字段进行 null 值判断,否
关于大负载高并发WEB系统的数据库优化
对于大负载高并发的WEB系统,数据库优化将不可避免,那么优化的方法有哪些方面呢?我认为可以从下面几点来进行:提高处理速度,提高系统的并发能力。提高处理速度:无论哪一种数据库dbms(mysql,oracle,mssql,db2,Postgres等等),再怎么优化,最终也避不开与慢速的存储介质(硬盘、磁带)进行数据交换,但往往一旦涉及到了存储介质的io操作,
Sybase 数据库查询索引优化
Sybase 数据库查询索引优化 一、实验目的 ............................................................................................................................................................
最近,帮一个朋友优化一个拥有20万主题,100万帖子,3万多会员,平均在线人数2000人的Discuz!论坛,采用Linux2.6+Apache2+mod_php5+MySQL5,服务器配置为双至强+4G内存,优化前,系统平均负载(load average)基本维持在10以上,MySQL的CPU占用率基本在90%以上,优化后,系统平均负载降到0.5以下,MyS
提高数据库查询速度的几个思路
提高数据库查询速度的几个思路1、缓存,在持久层或持久层之上做缓存。2、数据库表的大字段剥离,保证单条记录的数据量很小。3、恰当地使用索引。4、必要时建立多级索引。5、分析Oracle的执行计划,通过表数据统计等方式协助数据库走正确的查询方式,该走索引就走索引,该走全表扫描就走全表扫描。6、表分区
mysql处理百万级数据库常识(转载)
最近一段时间参与的项目要操作百万级数据量的数据,普通SQL查询效率呈直线下降,而且如果where中的查询条件较多时,其查询速度简直无法容忍。之前数据量小的时候,查询语句的好坏不会对执行时间有什么明显的影响,所以忽略了许多细节性的问题。
经测试对一个包含400多万条记录的表执行一条件查询,其
数据库优化查询计划的方法
数据库系统是管理信息系统的核心,基于数据库的联机事务处理 (OLTP)以及联机分析处理(OLAP)是银行、企业、政府等部门最为重要的计算机应用之一。从大多数系统的应用实例来看,查询操作在各种数据库操作中 所占据的比重最大,而查询操作所基于的SELECT语句在SQL语句中又是代价最大的语句。举例来说,如果数据的量积累到一定的程度,比如一个银行的账户 数据库表信息积累到上百
mysql处理百万级数据库常识
最近一段时间参与的项目要操作百万级数据量的数据,普通SQL查询效率呈直线下降,而且如果where中的查询条件较多时,其查询速度简直无法容忍。之前数据量小的时候,查询语句的好坏不会对执行时间有什么明显的影响,所以忽略了许多细节性的问题。
经测试对一个包含400多万条记录的表执
(推荐)海量数据库的查询优化及分页算法方案
建立一个web 应用,分页浏览功能必不可少。这个问题是数据库处理中十分常见的问题。经典的数据分页方法是:ADO 纪录集分页法,也就是利用ADO自带的分页功能(利用游标)来实现分页。但这种分页方法仅适用于较小数据量的情形,因为游标本身有缺点:游标是存放在内存中,很费内存。游标一建立,就将相关的记录锁住,直到取消游标。游标提供了对特定集合中逐行扫描的手段,
MySQL百万级数据库优化方案
首先声明是转的,感觉写的很细,原文链接:http://simpleframework.net/blog/v/7881.html
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2.应尽量避免在 where 子句中对字段进行 null 值判断,否则
提高数据库查询速度的几个思路
提高数据库查询速度的几个思路
1、缓存,在持久层或持久层之上做缓存。 2、数据库表的大字段剥离,保证单条记录的数据量很小。 3、恰当地使用索引。 4、必要时建立多级索引。 5、分析Oracle的执行计划,通过表数据统计等方式协助数据库走正确的查询方式,该走索引就走索引,该走全表扫描就走全表扫描。 6、表分区和拆分,无论是业务逻辑上的拆分(如一个月一张报
oracle 大事务的并行恢复导致数据库性能下降--cpu使用率较高处理思路
oracle 大事务的并行恢复导致数据库性能下降--cpu使用率较高处理思路
大型事务的回滚 大型事务的回滚产生非常大的代价,不仅锁定需要的资源 ,并且消耗的CPU和IO,尤其是IO将极为密集。这个时候,希望降低回滚所产生 的影响。停止是不可能的,为了保持数据库的一致
oracle 大事务的并行恢复导致数据库性能下降--cpu使用率较高处理思路
oracle 大事务的并行恢复导致数据库性能下降--cpu使用率较高处理思路
大型事务的回滚 大型事务的回滚产生非常大的代价,不仅锁定需要的资源 ,并且消耗的CPU和IO,尤其是IO将极为密集。这个时候,希望降低回滚所产生 的影响。停止是不可能的,为了保持数据库的一致
如何加快查询速度
如何加快查询速度? 1、升级硬件 2、根据查询条件,建立索引,优化索引、优化访问方式,限制结果集的数据量。 3、扩大服务器的内存 4、增加服务器CPU个数 5、对于大的数据库不要设置数据库自动增长,它会降低服务器的性能 6、在查询Select语句中用Where字句限制返回的行数,避免表扫描,如果
数据库 海量数据库的查询优化及分页算法方案
学习笔记,转自: .cn/empolder/db/sql/_all.html#content_page_1 我将以“办公自动化”系统为例,探讨如何在有着1000万条数据的MS SQL SERVER数据库中实现快速的数据提取和数据分页。以下代码说明了我们实例中数据库的“红头文件”一
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:select id from t
数据库查询速度慢的原因
查询速度慢的原因很多,常见如下几种: 1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2、I/O吞吐量小,形成了瓶颈效应。 3、没有创建计算列导致查询不优化。 4、内存不足 5、网络速度慢 6、查询出的数据量过大(可以采用多次查询,其他的方法降低数据量) 7、锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷)8、sp_lock,sp_who
数据库查询速度慢可能原因
查询速度慢的原因很多,常见如下几种:
1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)
2、I/O吞吐量小,形成了瓶颈效应。
3、没有创建计算列导致查询不优化。
4、内存不足
5、网络速度慢
6、查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)
7、锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷)
百万数据查询优化技巧三十则
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
百万数据查询优化技巧三十则
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
百万数据查询优化技巧三十则(转载)
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后百万数据查询优化
1.合理使用索引
  索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率。现在大多数的数据库产品都采用最先提出的索引结构。索引的使用要恰到好处,其使用原则如下:
  在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引。
  在频繁进行排序或分组(即进行或操作)的列上建立索引。
  在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。比如在雇员表的性别列上只有男与女两个不同值,因此就无必要建立索引。如果建立索引不但不会提高查询效率,反而会严重降低更新速度。
  如果待排序的列有多个,可以在这些列上建立复合索引()。
  使用系统工具。如数据库有一个工具,可以在可疑的索引上进行检查。在一些数据库服务器上,索引可能失效或者因为频繁操作而使得读取效率降低,如果一个使用索引的查询不明不白地慢下来,可以试着用工具检查索引的完整性,必要时进行修复。另外,当数据库表更新大量数据后,删除并重建索引可以提高查询速度。
  2.避免或简化排序
  应当简化或避免对大型表进行重复的排序。当能够利用索引自动以适当的次序产生输出时,优化器就避免了排序的步骤。以下是一些影响因素:
  索引中不包括一个或几个待排序的列;
  或子句中列的次序与索引的次序不一样;
  排序的列来自不同的表。
  为了避免不必要的排序,就要正确地增建索引,合理地合并数据库表(尽管有时可能影响表的规范化,但相对于效率的提高是值得的)。如果排序不可避免,那么应当试图简化它,如缩小排序的列的范围等。
  3.消除对大型表行数据的顺序存取
  在嵌套查询中,对表的顺序存取对查询效率可能产生致命的影响。比如采用顺序存取策略,一个嵌套层的查询,如果每层都查询行,那么这个查询就要查询亿行数据。&&&&A)避免这种情况的主要方法就是对连接的列进行索引。
  B)&还可以使用并集来避免顺序存取(将or改成)。尽管在所有的检查列上都有索引,但某些形式的子句强迫优化器使用顺序存取。下面的查询将强迫对表执行顺序操作:
  虽然在和上建有索引,但是在上面的语句中优化器还是使用顺序存取路径扫描整个表。因为这个语句要检索的是分离的行的集合,所以应该改为如下语句:
  这样就能利用索引路径处理查询。
&&&4.避免相关子查询
  一个列的标签同时在主查询和子句中的查询中出现,那么很可能当主查询中的列值改变之后,子查询必须重新查询一次。查询嵌套层次越多,效率越低,因此应当尽量避免子查询。如果子查询不可避免,那么要在子查询中过滤掉尽可能多的行。
  5.避免困难的正规表达式
  和关键字支持通配符匹配,技术上叫正规表达式。但这种匹配特别耗费时间。例如:*&
  即使在字段上建立了索引,在这种情况下也还是采用顺序扫描的方式。如果把语句改为*&,在执行查询时就会利用索引来查询,显然会大大提高速度。
  另外,还要避免非开始的子串。例如语句:*&,,在子句中采用了非开始子串,因而这个语句也不会使用索引。
  6.使用临时表加速查询
  把表的一个子集进行排序并创建临时表,有时能加速查询。有助于避免多重排序操作,而且在其他方面还能简化优化器的工作。例如:
  如果这个查询要被执行多次而不止一次,可以把所有未付款的客户找出来放在一个临时文件中,并按客户的名字进行排序:
  然后以下面的方式在临时表中查询:
  临时表中的行要比主表中的行少,而且物理顺序就是所要求的顺序,减少了磁盘,所以查询工作量可以得到大幅减少。
  注意:临时表创建后不会反映主表的修改。在主表中数据频繁修改的情况下,注意不要丢失数据。&
  小 结
  %的代码用去了%的时间,这是程序设计中的一个着名定律,在数据库应用程序中也同样如此。我们的优化要抓住关键问题,对于数据库应用程序来说,重点在于的执行效率。查询优化的重点环节是使得数据库服务器少从磁盘中读数据以及顺序读页而不是非顺序读页。
第二部分(如何让引擎充分使用索引)
l&&百万数据查询优化技巧三十则
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&来连接条件,可使用union,否则将导致引擎放弃使用索引而进行全表扫描,如:&
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,'')=0--&&生成的id&
select&id&from&t&where&name&like&'abc%'&
select&id&from&t&where&createdate&=''&and&createdate&''&
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,最好用varchar2(自变长度)&,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。&
19.任何地方都不要使用&select&*&from&t&,用具体的字段列表代替&*&,不要返回用不到的任何字段。&
20.尽量使用表变量来代替临时表(一般用在存储过程中)。如果表变量包含大量数据,请注意索引非常有限(只有主键索引)。&
21.避免频繁创建和删除临时表,以减少系统表资源的消耗。&
22.临时表并不是不可使用,适当地使用它们可以使某些例程更有效,例如,当需要重复引用大型表或常用表中的某个数据集时。但是,对于一次性事件,最好使用导出表。&
23.在新建临时表时,如果一次性插入数据量很大,那么可以使用&select&into&A&select。。。&代替&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语句优化 的文章

 

随机推荐