首页 > 数据库 >sql优化

sql优化

时间:2023-07-26 10:57:32浏览次数:48  
标签:优化 sql 查询 索引 子句 rownum 排序 where

1.SQL语句大写

因为oracle总是先解析SQL语句,把小写的字母转换成大写的再执行。

2.表别名

多表join时,尽量使用表别名,同时把表别名前缀于每一列上,减少解析的时间及由列歧义引起的语法错误

3.from从右到左解析表名

from子句中写在最后的表(基础表也称为驱动表,driving table)将被最先处理,尽量记录条数最少的表作为基础表放最后,如维表

4.where自下向上解析

表之间的连接必须写在其他where条件之前, 那些可以过滤掉最大数量记录的条件必须写在where子句的末尾

5.select *

尽量避免使用*查询全部列,ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。

6.避免使用耗费资源的操作:

带有DISTINCT、UNION、MINUS、INTERSECT、ORDER BY的SQL语句会启动SQL引擎执行耗费资源的排序(SORT)功能。DISTINCT需要一次排序操作,而其他的至少需要执行两次排序。

7.union all和union

UNION两个集合时,这两个结果集合会以UNION-ALL的方式被合并,然后在输出最终结果前进行排序。如果用UNION ALL替代UNION, 这样排序就不是必要了。效率就会因此得到提高。注意UNION ALL将重复输出两个结果集合中相同记录。

8.用EXISTS替代IN、用NOT EXISTS替代 NOT IN

在基于基础表的查询中经常需要对另一个表进行联接。在这种情况下, 使用EXISTS(或NOTEXISTS)通常将提高查询的效率。在子查询中,NOT IN子句将执行一个内部的排序和合并。无论在哪种情况下,NOT IN都是最低效的(要对子查询中的表执行了一个全表遍历)。所以尽量将NOT IN改写成外连接(Outer Joins)或NOT EXISTS。

9.用Where子句替换HAVING子句

避免使用HAVING子句,HAVING只会在检索出所有记录之后才对结果集进行过滤。这个处理需要排序,总计等操作。最好能通过WHERE子句限制记录的数目。

10.用>=替代>

区别:前者DBMS将直接跳到第一个ID等于4的记录而后者将首先定位到ID=3的记录并且向前扫描到第一个ID大于3的记录。

11.建立索引

索引要点:

索引之后,按索引字段重复最少的来排序,会达到最优的效果。以我们的表来说,如果建立了No的聚集索引,把No放在where子句的第一位是最佳的,其次是Id,然后是MgrObjId,最后是时间,时间索引如果表是一个小时的,最好不要用
where子句的顺序
决定了查询分析器是否使用索引来查询。比如建立了MgrObjId和Id的索引,那么where MgrObjId='' and Id='' and Dtime=''就会采用索引查找,而where Dtime='' and MgrObjId='' and Id=''则不一定会采用索引查找。
把非索引列的结果列放在包含列中。因为我们条件是MgrObjId和Id以及Dtime,因此返回结果中只需包含Dtime和Value即可,因此把Dtime和Value放在包含列中,返回的索引结果就有这个值,不用再查物理表,可以达到最优的速度。
-----------------------------------------------------------------------------
--不区分大小写
SELECT APID, USERID, CLIENTIP, CLIENTMACHINE, BROWSER, ACCESSTIME, PASS, REFURL, MSG
FROM WTRAFFIC.ACCESSHISTORY;


SELECT * FROM WTRAFFIC.Sapmathed where rownum<=3 ;

SELECT * FROM WTRAFFIC.SAPMATHEDHIS where rownum<=7;

--合并列
SELECT CCODE || CNAME AS 编码名称,ENAME ,SHORTX , rownum AS pageindex
FROM Comcty where 1=1 AND CCODE BETWEEN 100 AND 120 order by CCODE ;
--分页
select * from (
select row_.*, rownum rn from (
select * from Comcty t where 1=1
order by CCODE
) row_ where rownum <= 1*6
) where rn> (1-1)*6

--去重
SELECT DISTINCT SHORTX FROM Comcty where rownum <7 ;

--时间查询
select * from BD_BRANDRELATION a where rownum <7 AND
a.UDATE >to_date('2020-01-01','yyyy-MM-dd HH24:MI:SS');

select * from BD_BRANDRELATION a where rownum <7 AND
a.UDATE >to_date('2020-01-01','yyyy-MM-dd')

标签:优化,sql,查询,索引,子句,rownum,排序,where
From: https://www.cnblogs.com/wangtiantian/p/17581845.html

相关文章

  • MySql —— 死锁场景
    参考:小林coding: https://xiaolincoding.com/mysql/lock/deadlock.html出世&入世:https://blog.csdn.net/weixin_54828627/article/details/129379140 死锁的四个必要条件:互斥占有且等待不可强占用循环等待一、批量更新/删除数据-同时加锁记录多InnoDB是边扫描边加锁......
  • SQL Server IAM 页面
    大家好,欢迎来到SQLServer分配系列今天,我将向您展示IAM页面的详细信息。索引 分配映射(IAM) 页映射分配单元使用的数据库文件的4GB部分中的范围。分配单元是以下三种类型之一:IN_ROW_DATA保存堆或索引的分区。LOB_DATA保存大对象(LOB)数据类型,例如XML、VARBINARY......
  • 转:MySQL数据库给表添加索引
    MySQL数据库给表添加索引   ......
  • SQL语言可以分为四类
    SQL(StructuredQueryLanguage,结构化查询语言)是用于管理关系数据库系统的标准化语言。SQL语言可以分为以下几个方面:数据定义语言(DDL):用于定义和管理数据库中的结构,包括创建、修改和删除数据库对象(如表、视图、索引等)。例如:CREATETABLE、ALTERTABLE、DROPTABLE等。......
  • MyBatis-Plus这样实现动态SQL
    拦截器介绍拦截器是一种基于AOP(面向切面编程)的技术,它可以在目标对象的方法执行前后插入自定义的逻辑。MyBatis定义了四种类型的拦截器,分别是:Executor:拦截执行器的方法,例如update、query、commit、rollback等。可以用来实现缓存、事务、分页等功能。ParameterHandler:拦截参......
  • Tita 升级|「绩效」相关功能优化升级
    1.完成值录入节点支持批量导入完成值Tita-OKR和新绩效一体化管理平台点击批量导入按钮,下载列表数据,完成填写后导入2.考核模板流程设置中支持添加多个绩效面谈节点,且能自定义控制绩效面谈的节点顺序使用场景:当考核执行时,需要和多个角色进行面谈a.前往考核模板中的考核流......
  • React组件设计之性能优化篇
    我们是袋鼠云数栈UED团队,致力于打造优秀的一站式数据中台产品。我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值。本文作者:空山前言由于笔者最近在开发中遇到了一个重复渲染导致子组件状态值丢失的问题,因此关于性能优化做了以下的分析,欢迎大家的交流我们在......
  • How to make sqlplus output appear in one line
    Howtomakesqlplusoutputappearinonelinehttps://dba.stackexchange.com/questions/54149/how-to-make-sqlplus-output-appear-in-one-line#SQL*PlusUser'sGuideandReferencehttp://docs.oracle.com/cd/E16655_01/server.121/e18404/ch_twelve040.htm#BAC......
  • Using PL/SQL Object Types for JSON
    #https://docs.oracle.com/en/database/oracle/oracle-database/12.2/adjsn/using-PLSQL-object-types-for-JSON.html#GUID-F0561593-D0B9-44EA-9C8C-ACB6AA9474EEDECLAREjeJSON_ELEMENT_T;joJSON_OBJECT_T;BEGINje:=JSON_ELEMENT_T.parse('{"name......
  • 万字长文浅析配置对MySQL服务器的影响
    有很多的服务器选项会影响这MySQL服务器的性能,比如内存中临时表的大小、排序缓冲区等。有些针对特定存储引擎(如InnoDB)的选项,也会对查询优化很有用。调整服务器的配置从某种程度来说是一个影响全局的行为,因为每个修改都可能对该服务器上的每个查询造成影响。不过有些选项是针对特......