`

查询语句(SELECT)的优化

 
阅读更多
首先要注意建立索引。
create index abindex on tableAB (columnA, columnB);

对于索引同时要注意:
   主键,unique键 会自动产生索引。
   数据量小不需要索引,避免消耗数据库内存。


在有索引的机制上
(1)、合理使用索引:where子句中变量顺序应与索引字键顺序相同。

如:create index test_idx on test(hm, rq, xx)
      索引字键顺序:首先是号码hm,其次是日期rq,最后是标志xx,所以where子句变量顺序应是where hm<=“P1234”and rq=“06/06/1999”and xx=“DDD”,不应是where xx=“DDD” and rq=“06/06/1999” and hm <=“P1234”这样的不按索引字键顺序写法。


(2)、将最具有限制性的条件放在前面,大值在前,小值在后。
     如:where colA<=10000 AND colA>=1 效率高
     where colA>=1 AND colA<=10000 效率低
这里同时注意数据查询顺序在同等条件下:1.先子查询后父查询;2.从右到左

(3)、避免采用MATCHES和LIKE通配符匹配查询

 通配符匹配查询特别耗费时间。即使在条件字段上建立了索引,在这种情况下也还是采用顺序扫描的方式。
  例如语句:SELECT * FROM customer WHERE zipcode MATCHES “524*”
  可以考虑将它改为SELECT * FROM customer WHERE ZipCode<=“524999” AND ZipCode >=“524000”,则在执行查询时就会利用索引来查询,显然会大大提高速度。
(4)、避免非开始的子串
  例如语句:SELECT * FROM customer WHERE zipcode[2,3] >“24”,在where子句中采用了非开始子串,因而这个语句也不会使用索引。
(5)、避免相关子查询
  一个字段的标签同时在主查询和where子句中的查询中出现,那么很可能当主查询中的字段值改变之后,子查询必须重新查询一次。查询嵌套层次越多,效率越低,因此应当尽量避免子查询。如果子查询不可避免,那么要在子查询中过滤掉尽可能多的行。
  例如:将下面的语句
  select hm,rq from TabA
  where item IN (select item form TabB where TabB.num=50)
  改为:select hm,bf from TabA, TabB
   where TabA.item=TabB.item AND TabB.num=50
(6)、避免或简化排序
   应当简化或避免对大型表进行重复的排序。当能够利用索引自动以适当的次序产生输出时,优化器就避免了排序的步骤。以下是一些影响因素:
  ◆ 索引中不包括一个或几个待排序的字段;
  ◆ group by或order by子句中字段的次序与索引的次序不一样;
  ◆ 排序的字段来自不同的表。
   为了避免不必要的排序,就要正确地增建索引,合理地合并数据库表(尽管有时可能影响表的规范化,但相对于效率的提高是值得的)。如果排序不可避免,那么应当试图简化它,如缩小排序的字段的范围等。
(7)、消除对大型表行数据的顺序存取
   在嵌套查询中,对表的顺序存取对查询效率可能产生致命的影响。比如采用顺序存取策略,一个嵌套3层的查询,如果每层都查询1000行,那么这个查询就要查询10亿行数据。避免这种情况的主要方法就是对连接的字段进行索引。例如,两个表:学生表(学号、姓名、年龄……)和选课表(学号、课程号、成绩)。如果两个表要做连接,就要在“学号”这个连接字段上建立索引。
   还可以使用并集来避免顺序存取。尽管在所有的检查列上都有索引,但某些形式的where子句强迫优化器使用顺序存取。下面的查询将强迫对orders表执行顺序*作:
   SELECT * FROM orders WHERE (cust_num=126 AND order_num>1001) OR order_num=1008
   虽然在cust_num和order_num上建有索引,但是在上面的语句中优化器还是使用顺序存取路径扫描整个表。因为这个语句要检索的是分离的行的集合,所以应该改为如下语句:
   SELECT * FROM orders WHERE cust_num=126 AND order_num>1001
   UNION
   SELECT * FROM orders WHERE order_num=1008
   这样就能利用索引路径处理查询。
(8)、对于大数据量的求和应避免使用单一的sum命令处理,可采用group by方式与其结合,有时其效率可提高几倍甚至百倍。
(9)、避免会引起磁盘读写的rowid*作。在where子句中或select语句中,用rowid要产生磁盘读写,是一个物理过程,会影响性能。
(10)、使用临时表加速查询
   把表的一个子集进行排序并创建临时表,有时能加速查询。它有助于避免多重排序*作,而且在其他方面还能简化优化器的工作。
   但要注意:临时表创建后不会反映主表的修改。在主表中数据频繁修改的情况下,注意不要丢失数据
分享到:
评论

相关推荐

    select语句性能优化小结

    在写selcet语句时我们很多时候不注意质量很容易造成全表扫描 如果 只有几十张表几百张还好 但是如果几万张甚至更多的数据表 那么质量就很差 因此 我们需要对语句进行优化 以提高效率。

    SQL查询语句优化的实用方法总结

    查询语句的优化是SQL效率优化的一个方式,可以通过优化sql语句来尽量使用已有的索引,避免全表扫描,从而提高查询效率。最近在对项目中的一些sql进行优化,总结整理了一些方法。 1、在表中建立索引,优先考虑where、...

    SQL语句优化过程策略,帮助您优化Oracle查询语句

    SQL语句优化过程优化策略 21. /*+ORDERED*/ 根据表出现在FROM中的顺序,ORDERED使ORACLE依此顺序对其连接. 例如: SELECT /*+ORDERED*/ A.COL1,B.COL2,C.COL3 FROM TABLE1 A,TABLE2 B,TABLE3 C WHERE A.COL1=B.COL1...

    SQL优化:优化select语句

    优化select语句 为了使慢速SELECT ... WHERE查询更快,首先要检查的是是否可以添加索引。为避免浪费磁盘空间,请构造组合索引。 调整函数调用,使函数调用从一多次减少为一次,从而极大地提高了效率。 定期使用...

    SQL Server 2000优化SELECT语句方法

    SQL Server 2000优化SELECT语句方法

    北邮数据库实验8 数据查询分析优化实验

    1. 在SQL Server Management Studio平台下,通过观察Select/Insert/delete/update等SQL语句的查询执行计划,分析查询执行计划中连接、选择、投影等关系代数操作的实现方式及其执行成本。熟悉了解SQL SERVER数据库中...

    SQL语句优化

    优化数据库、SQL语句优化的原则、不要以为只有SELECT语句是查询。实际上,带有任何WHERE条件的 DML(INSERT、UPDATE、DELETE)语句中都包含查询要求,在后面的文章中,当说到查询时,不一定只是指SELECT语句,也有可能...

    SQL 的 SELECT 语句优化

    这是本人根据书上所看到知识点,非常有用并且实际

    sql语句的优化方法

    (3) SELECT子句中避免使用 ‘ * ‘: (4) 减少访问数据库的次数: (5) 在SQL*Plus , SQL*Forms和Pro*C中重新设置ARRAYSIZE参数, 可以增加每次数据库访问的检索数据量 ,建议值为200 (6) 使用DECODE函数来减少...

    Mysql查询语句优化技巧

    这里的记录的优化技巧更适用于开发人员,都是从网络上收集和自己整理的,主要是查询语句上面的优化,其它层面的优化技巧在此不做记录。 查询的开销指标: 执行时间 检查的行数 返回的行数 建立索引的几个准则: (1...

    MySQL对limit查询语句的优化方法

    下面作者将要和大家分享一下MySQL数据库中的查询语句有关limit语句的优化。 大家都知道一般limit是用在分页的程序的分页上的,当你的应用数据量够小的时候,也许你感觉不到limit语句的任何问题,但当查询数据量达到...

    SQL语句优化规则

    1.选用适合的ORACLE优化器。2. 访问Table的方式。3. 共享SQL语句。 4. 选择最有效率的表名顺序(只在基于规则的优化器中有效)。...6.SELECT子句中避免使用 ‘ * ‘ ...(内部涵盖了非常多的优化规则)

    数据库系统之查询处理与优化.pdf

    数据库系统之查询处理与优化 查询处理的过程 第⼀步 就是语法分析器与翻译器处理,对SQL查询语句进⾏语法验证,保证查询语句的正确性,然后将SQL查询语句翻译为可使⽤的形式 第⼆步 是将SQL查询语句翻译为系统对应的...

    日常收集常用SQL查询语句大全

    常用sql查询语句如下所示: 一、简单查询语句 1. 查看表结构 SQL&gt;DESC emp; 2. 查询所有列 SQL&gt;SELECT * FROM emp; 3. 查询指定列 SQL&gt;SELECT empmo, ename, mgr FROM emp; SQL&gt;SELECT DISTINCT mgr FROM emp; 只...

    Oracle数据库中SQL语句的优化技巧

    在SQL语句优化过程中,我们经常会用到hint,现总结一下在SQL优化过程中常见Oracle HINT的用法: 1. /*+ALL_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳吞吐量,使资源消耗最小化. 例如: SELECT /*+ALL+_...

    优化MySQL数据库中的查询语句详解

    很多时候基于php+MySQL建立的网站所出现的系统性能瓶颈往往是出在MySQL上,而MySQL中用的最多的语句就是查询语句,因此,针对MySQL数据库查询语句的优化就显得至关重要!本文就此问题做出详细分析如下: 1、判断是否...

    MySQL数据库查询性能优化策略

    Explain 用来分析 SELECT 查询语句,开发人员可以通过分析 Explain 结果来优化查询语句。 通过对查询语句的分析,可以了解查询语句的执行情况,找出查询语句执行的瓶颈,从而优化查询语句. 使用索引查询 MySql中提高...

    sql语句优化之SQL Server(详细整理)

    MS SQL Server查询优化方法 查询速度慢的原因很多,常见如下几种 1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) ...可以通过如下方法来优化查询 1、把数据、日志、索引放到不同的I/O

Global site tag (gtag.js) - Google Analytics