自己遇到的一些SQL优化

字符的分隔

(思想,先构造在拼接)

SELECTa.id,b.NAME,A.WORK_TYPE,b."ID"

FROMCRD.T_CRD_SCORE_CONFIGa

leftJOINEMERP.T_BASE_WORK_TYPE_ALLbon','||A.WORK_TYPE||','like'%,'||b.id||',%'GROUPBYA.ID

分组函数:GROUP BY

  分组函数,可以多次分组

  提高GROUP BY 语句的效率,可以通过将不需要的记录在GROUP BY 之前过滤掉

子查询

   这次写代码的时候,有一些字段上线前着急要和实际的业务逻辑,使用了子查询,有的可以使用连接查询,但是没有优化

记录的标记字段

这次编写代码的时候,标记这条记录是否删除,使用,显示,在编写SQL的时候出现了一些漏写的字段,以后再写的时候,一定要注意全

表空间(用户)

在编写SQL的时候,没有注意在表前标记空间名(用户)。

OR的使用

OR一定要合理运用,总忘记这个

ORDER BY 的使用

1. 只有ORDER BY 子句中可以使用select列表中列的别名

2. 使用了ORDER BY子句的查询不能用作表表达式(视图、内联表值函数、子查询、派生表和共用表达式)

3. 在分页的时候,如果是多表连接的,要是条件排序的条件的值一致,在分页的时候可能两次的结果有重复数据。

exts和in用法

1. exists对外表做循环,每次循环对内表查询;in将内表和外表做hash连接

2. 使用exists oracle会先检查主查询,使用in,首先执行子查询,将结果存储在临时表中

3. 如果两个表大小相当,in和exists差别不大

4. 如果两个表大小相差较大则子查询表大的用exists,子查询表小的用in

5.尽量不要使用not in

union和union all

  1. 使用场景:需要将两个select语句结果整体显示时,可以使用union和unionall

2.union对两个结果集取并集不包含重复结果同时进行默认规则的排序;而union all对两个结果集去并集,包括  重复行,不进行排序

  3.union需要进行重复值扫描,效率低,如果没有要删除重复行,应该使用union all

  4.insersect和minus分别交集和差集,都不包括重复行,并且进行默认规则的排序

 5.可以将多个结果集合并

  6.必须保证select集合的结果有相同个数的列,并且每个列的类型是一样的(列名不一定要相同,会默认将第一个结果的列名作为结果集的列名)

指定where的条件顺序

1. 默认情况下,Oracle采用自下而上的顺序解析where字句,因此在处理多表查询的时候,表之间的连接必须写在其他的where条件之前,但是过滤数据记录的条件则必须写在where子句的尾部,以便在过滤了数据之后再进行连接处理,这样可以提升sql语句的性能

LEFT--JOIN  注释事项

在使用left-join的时候一定要注意顺序问题。

SQL语句尽量用大写的

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

使用表的别名

    当在SQL语句中连接多个表时, 尽量使用表的别名并把别名前缀于每个列上。这样一来,就可以减少解析的时间并 减少那些由列歧义引起的语法错误。

选择最有效率的表名顺序(只在基于规则的优化器(RBO)中有效)

  ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表也称为驱动表,driving table)将被最先处理,在FROM子句中包含多个表的情况下,必须选择记录条数最少的表作为基础表。如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表。

避免使用耗费资源的操作

 带有DISTINCT、UNION、MINUS、INTERSECT、ORDER BY的SQL语句会启动SQL引擎执行

耗费资源的排序(SORT)功能。DISTINCT需要一次排序操作,而其他的至少需要执行两次排序。

通常,带有UNION、MINUS、INTERSECT的SQL语句都可以用其他方式重写。

 如果数据库的SORT_AREA_SIZE调配得好,使用UNION,MINUS,INTERSECT也是可以考虑。 

用Where子句替换HAVING子句

    避免使用HAVING子句,HAVING只会在检索出所有记录之后才对结果集进行过滤。这个处理需要排序,总计等操作。最好能通过WHERE子句限制记录的数目。(非oracle中)on、where、having这三个都可以加条件的子句中,on是最先执行,where次之,having最后。

避免在索引列上使用计算

  WHERE子句中,如果索引列是函数的一部分,优化器将不使用索引而使用全表扫描。

BETWEEN    AND

取值是两边都要。

NVL2(expr1,expr2,expr3)

NVL2(表达式,不为空设值,为空设值)

to_char用法

(1)用作日期转换

    to_char(date,'格式');

    select to_char(sysdate,'yyyy-MM-dd HH24:mi:ss') from dual;

(2)处理数字

    to_char(number,'格式');

     select to_char(88877) from dual;

     select to_char(1234567890,'099999999999999')  from dual;

     select to_char(12345678,'999,999,999,999')  from dual;

     select to_char(123456,'99.999')  from dual;

     select to_char(1234567890,'999,999,999,999.9999')  from dual;

(3) 处理钱

    to_char(salary,'$99,99');

  select TO_CHAR(123,'$99,999.9') from dual;

(4)用于进制转换:将10进制转换为16进制;

    select to_char(4567,'xxxx') from dual;

    select to_char(123,'xxx') from dual;

to_date

select sysdate,to_date('20170615','yyyymmdd')from dual;

select sysdate,to_date('20170615','yyyy-mm-dd')from dual;

select sysdate,to_date('20170615','yyyy/mm/dd')from dual;

select sysdate,to_date('20170615','yyyy-mm-dd hh24:mi:ss')from dual;

应尽量避免在 where 子句中使用 or 来连接条件

select id from t where num=10 or Name = 'admin'

可以这样查询:

select id from t where num = 10

union all

select id from t where Name = 'admin'

模糊查询

当模糊匹配以%开头时,该列索引将失效,若不以%开头,该列索引有效。

常用函数

FLOOR(x)   返回小于x的最大整数值

AVG(col)返回指定列的平均值

COUNT(col)返回指定列中非NULL值的个数

MIN(col)返回指定列的最小值

MAX(col)返回指定列的最大值

SUM(col)返回指定列的所有值之和

LEFT(str,x)返回字符串str中最左边的x个字符

TRIM(str)去除字符串首部和尾部的所有空格

UCASE(str)或UPPER(str) 返回将字符串str中所有字符转变为大写后的结果

优化总结口诀

​ 全值匹配我最爱,最左前缀要遵守;

​ 带头大哥不能死,中间兄弟不能断;

​        索引列上少计算,范围之后全失效;

​ LIKE百分写最右,覆盖索引不写星;

​ 不等空值还有or,  索引失效要少用;

​        VAR引号不可丢,SQL高级也不难;

如何分析SQL

1.观察,至少跑一天,看看生产的慢SQL情况。

2.开启慢查询日志,设置阀值,比如超过5秒钟就是慢SQL,并将它抓取出来

3.explain+慢SQL分析

4.show profile

5.DBA进行SQL数据库服务器的参数调优

总结:

1.慢查询的开启并捕获

2.explain+慢SQL分析

3.show profile查询SQL在MySql里面的执行细节和生命周期情况

4.SQl数据服务器的参数调优

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容

  • 第一天 7月13日OCP笔记: Oracle Ocp11g准备资料: OracleFundmentals 书 管理...
    fjxCode阅读 2,678评论 0 4
  • 转 # https://www.cnblogs.com/easypass/archive/2010/12/ 08/...
    吕品㗊阅读 9,617评论 0 44
  • 1.简介 数据存储有哪些方式?电子表格,纸质文件,数据库。 那么究竟什么是关系型数据库? 目前对数据库的分类主要是...
    乔震阅读 1,623评论 0 2
  • 第一节课上的数学老师讲的十以内的加法,老师还让我们做的数学课本46页的题。第二节课我们上语文老师给我们讲的课文小小...
    王昭捷阅读 116评论 0 0
  • 那时的我们 守住了彼此 守住了回忆 却守不住那黄昏下的影子 任其模糊 任其消散 而随之烟灭的 是你我心中的那一抹残...
    希尔G3阅读 104评论 0 0