10个SQL优化规则(sql的优化有哪几种)
mhr18 2024-10-17 10:30 25 浏览 0 评论
优化规则总结:
1.通常不应对where语句检索条件的表列做任何处理。处理包括加函数 ,计算等。例外情况DBA会提前公布。
2.在业务逻辑及工具允许的条件下,采用正确的SQL嵌套方式,且把运算处理放在最外层。
3.详细的分析业务逻辑和数据结构,避免不必要的计算。如排重distinct, nvl检测等。
4.避免数据列类型和输入值类型不一致。
5.SQL语句中使用绑定变量。
6.理清业务逻辑,选择中间结果集最少为目标,减少SQL内部的操作运算。
7.减少数据库的调用次数。
8.正确高效的使用模糊匹配查询---右百分号。
9.分页排序时正确的使用rownum
10.避免使用耗费资源的操作--UNION,MINUS,INTERSECT,DISTINCT
优化规则举例说明:
规则1.通常不应对where语句检索条件的表列做任何处理。处理包括加函数,计算等 。例外情况DBA会提前公布。
举例(函数):
Error:
select count(*) as col_0_0_
from B_LOG blog0_
where :"SYS_B_0" =:"SYS_B_1"
and to_char(blog0_.OP_DATE,:"SYS_B_3") >= :"SYS_B_4"
正确改法:
select count(*) as col_0_0_
from B_LOG blog0_
where :"SYS_B_0" =:"SYS_B_1"
and blog0_.OP_DATE >= To_date('2007-01-0600:00:00', 'yyyy-mm-dd hh24:mi:ss')
and blog0_.OP_DATE <= to_date('2007-01-0823:59:59', 'yyyy-mm-dd hh24:mi:ss')
举例(计算):
Error:
SELECT ENAME
FROM EMP
WHERE DEPTNO + 1 = 10 /*DEPTNO上的索引将失效*/
AND EMP_TYPE ||’$’ = ‘A' /*EMP_TYPE上的索引将失效*/
正确改法:
SELECT ENAME
FROM EMP
WHERE DEPTNO = 10-1 /*DEPTNO上的索引将失效*/
AND EMP_TYPE = ‘A' ||‘$’
规则2.在业务逻辑及工具允许的条件下,采用正确的SQL嵌套方式,且把运算处理放在最外层。
on_busin_chance a与Busin_long_info 关系上一一对应。
改成 嵌套方式, 最里层不要关联Busin_long_info, 用结果的20条 (rownum < :"SYS_B_11") 去关联Busin_long_info 。
Error
-----------------------------PrjIframe.exe--- begin -------------------------------
Select title,
:"SYS_B_00" || username || :"SYS_B_01" || bc_id || :"SYS_B_02" as linku,
.......
price,
trustvalue
from (Select a.title as title,
a.bc_id as bc_id,
.......
a.pricerange as price,
:"SYS_B_04" as trustvalue
from on_busin_chance a, Busin_long_info b
where a.bc_id = b.bc_id
and a.pubdate > sysdate - :"SYS_B_05"
.......
and a.SortTag = :"SYS_B_10"
order by a.pubdate desc)
where rownum < :"SYS_B_11"
-----------------------------PrjIframe.exe--- end -------------------------------
错误的sql:
select A.bc_id,
A.title,
A.Pubdate ,
/*to_char(A.Pubdate, :"SYS_B_1") as NEWPubdate,*\*/
A.picpath,
A.supcatid asCLSID,
A.username,
A.providerid,
C.NAME ascorname,
C.Memtypeid,
b.areaid
from (select bc_id,
title,
.....
providerid
frombusin_list
wheresorttag = '1'
order bypubdate desc) A,
(selectsupcatid, areaid
fromnewhc.new_iframe_class
where areaid= '005'
and clsid= '003034') B,
provider_listC
where b.supcatid =A.supcatid
and C.providerid =A.providerid
and rownum < 20
正确的sql
select bb.to_char(A.Pubdate, :"SYS_B_1") asNEWPubdate , xxxx,xxxx,
from (select aa.*
from(select A.*
from busin_list A, newhc.new_iframe_class B
where A.sorttag = '1'
and B.areaid = '005'
and B.clsid = '003034'
and B.supcatid = A.supcatid
orderby A.pubdate desc) aa
whererownum < 20) bb,
provider_listC
where c.providerid= bb.providerid
规则3.详细的分析业务逻辑和数据结构,避免不必要的计算。 如排重distinct,nvl检测等。
同时从设计方面提高数据的内在质量(约束,匹配,数据类型转换),,避免SQL过多关联检测计算,多次类型转换。
select distinct bidinproce0_.NAME as col_0_0_,
bidsetting1_.ID as col_1_0_,
bidsetting1_.ID as ID409_,
.......
bidsetting1_.POSTENDDATE as POSTENDD7_409_,
bidsetting1_.STATE as STATE409_
from keyword.BID_IN_PROCESS bidinproce0_,
keyword.BID_SETTING bidsetting1_,
keyword.ON_COR_TABLE oncortable2_
where bidinproce0_.BIDSETTINGID =bidsetting1_.ID
and bidinproce0_.CURBID = '1'
and bidinproce0_.VIPPURCHASE = '0'
updateon_busin_chance
setoperstate ='0',
searchstate ='0',
yrepeated ='1',
REPEATTIMES =nvl(REPEATTIMES,0) +1,
pubdate =sysdate,
enddate =sysdate+ validdate
wherebc_id = P_id;
检查发现REPEATTIMES列上有非空约束。
updateon_busin_chance
setoperstate ='0',
searchstate ='0',
yrepeated ='1',
REPEATTIMES =REPEATTIMES +1,
pubdate =sysdate,
enddate =sysdate+ validdate
wherebc_id = P_id;
------------改前-------------------------------------
Elapsed CPU Elap per % Total
Time (s) Time (s) Executions Exec (s) DB Time SQL Id
---------- ---------- ------------ ---------- --------------------
886 267 96,174 0.0 1.5 8k49v07aa7dhw
BEGIN RepeateInfo(:1,:2,:3); END;
nvl去掉后的效果
------------改后--------------11-14-----------------------
Elapsed CPU Elap per % Total
Time (s) Time (s) Executions Exec (s) DB Time SQL Id
---------- ---------- ------------ ---------- --------------------
396 227 108,756 0.0 1.7 8k49v07aa7dhw
BEGIN RepeateInfo(:1,:2,:3); END;
null数据检测/转换
从数据进入源头,数据底层强制约束。
如重发中的nvl检测, nvl(B.SORTTAG,:"SYS_B_0000")
规则4.避免数据列类型和输入值类型不一致。
举例
列为字符型varchar2 。
where var_col='36837053' 可以使用index
where var_col= 36837053 ; 不能用上其列index
规则5: SQL语句中使用绑定变量。
为将sql分析减少到最小,在SQL语句中使用绑定变量的方法实现,。这样,所有的用户都可以使用相同的SQL语句。
规则6:理清业务逻辑,选择中间结果集最少为目标,减少SQL内部的操作运算。
select*
from(selectrownumrowno, t.*
from(selectbd_id,
bd_state,
bd_title,
.......
bd_user,
fromt_bbs_data
wherebd_parent =0
orderbybd_lastdatedesc) t
whererownum<=20)
whererowno >=1
正确改法:
bd_lastdate加数据的检索条件时间范围限制。
规则7:减少数据库的调用次数。
举例:
减少对表的查询 ( 在含有子查询的SQL语句中,要特别注意减少对表的查询.)
SELECTTAB_NAME
FROMTABLES
WHERETAB_NAME = (SELECTTAB_NAMEFROMTAB_COLUMNSWHEREVERSION =604)
AND DB_VER = (SELECTDB_VERFROMTAB_COLUMNSWHEREVERSION =604)
正确改法:
SELECTTAB_NAME
FROMTABLES
WHERE(TAB_NAME, DB_VER) =
(SELECTTAB_NAME, DB_VER)FROMTAB_COLUMNSWHEREVERSION =604)
规则8.正确高效的使用模糊匹配查询---右百分号。
一. 用户输入的查询关键字长度不能过短。Like ‘H%’
二. 判断结果集的数量是否属合理范围,否则要求用户的再次确认或取消此查询。
三. 前端避免用户输入的特殊关键字( %xxxxx, _)。 恶意匹配, 域名查询要求。
考虑: 此需求的实现 的确要对email的信息拆分。翻转index测试
规则9.分页排序时正确的使用rownum
下面的SQL多耗费了5倍的CPU,并会随数据量的增长而成增长
原sql
SELECT A.*
FROM(SELECT X.*, rownum rn
FROM (SELECT rowid as rowidx
From List_Provider_sup_1 X
WHERE X.L3CurCatID = '011'
AND X.L6CurCatID = '011002'
ORDER BY SORTVALUE ASC) X ) A
WHEREA.rn <=20
ANDA.rn > 0
应改写如下:
select * from (
selectA.*, rownum rn
from(SELECT rowid as rowidx
From List_Provider_sup_1 X
WHERE X.L3CurCatID = '011'
AND X.L6CurCatID = '011002'
ORDER BY SORTVALUE ASC) A
whererownum < 20 ) B
where B.rn > 0
规则10.避免使用耗费资源的操作----
UNION,MINUS,INTERSECT,DISTINCT,
会启动SQL引擎执行耗费资源的排序(SORT)功能.。
DISTINCT需要一次排序操作,而其他的至少需要执行两次排序.
例如,一个UNION查询,其中每个查询都带有GROUP BY子句,GROUP BY会触发嵌入排序(NESTED SORT) ;这样,每个查询需要执行一次排序,然后在执行UNION时,又一个唯一排序(SORT UNIQUE)操作被执行而且它只能在前面的嵌入排序结束后才能开始执行.嵌入的排序的深度会大大影响查询的效率.通常,带有UNION, MINUS , INTERSECT的SQL语句都可以用其他方式重写。
建议:学会分析SQL语句执行计划。
建议对所有的SQL语句执行EXPLAIN_PLAN,并查看输出结果,然后调整相应的语句。如:
随着数据库的版本升级,有些书介绍的一些规则在新版中已不在适用。
如:表名顺序,OR的使用等。
选择TAB2作为基础表(最好的方法)
select count(*) from tab1,tab2执行时间0.96秒
选择TAB2作为基础表(不佳的方法)
select count(*) from tab2,tab1执行时间26.09秒
SQL> set autotrace on explain;
SQL> select * from dept;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
Execution Plan
---------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 TABLE ACCESS (FULL) OF 'DEPT'
相关推荐
- 【预警通报】关于WebLogic存在远程代码执行高危漏洞的预警通报
-
近日,Oracle官方发布了2021年1月关键补丁更新公告CPU(CriticalPatchUpdate),共修复了包括CVE-2021-2109(WeblogicServer远程代码执行漏洞)...
- 医院信息系统突发应急演练记录(医院信息化应急演练)
-
信息系统突发事件应急预案演练记录演练内容信息系统突发事件应急预案演练参与人员信息科参与科室:全院各部门日期xxxx-xx-xx时间20:00至24:00地点信息科记录:xxx1、...
- 一文掌握怎么利用Shell+Python实现完美版的多数据源备份程序
-
简介:在当今数字化时代,无论是企业还是个人,数据的安全性和业务的连续性都是至关重要的。数据一旦丢失,可能会造成无法估量的损失。因此,如何有效地对分布在不同位置的数据进行备份,尤其是异地备份,成为了一个...
- docker搭建系统环境(docker搭建centos)
-
Docker安装(CentOS7)1.卸载旧版Docker#检查已安装版本yumlistinstalled|grepdocker#卸载旧版本yumremove-ydocker.x...
- 基础篇:数据库 SQL 入门教程(sql数据库入门书籍推荐)
-
SQL介绍什么是SQLSQL指结构化查询语言,是用于访问和处理数据库的标准的计算机语言。它使我们有能力访问数据库,可与多种数据库程序协同工作,如MSAccess、DB2、Informix、M...
- Java21杀手级新特性!3行代码性能翻倍
-
导语某券商系统用这招,交易延迟从12ms降到0.8ms!本文揭秘Oracle官方未公开的Record模式匹配+虚拟线程深度优化+向量API神操作,代码量直降70%!一、Record模式匹配(代码量↓8...
- 一文读懂JDK21的虚拟线程(java虚拟线程)
-
概述JDK21已于2023年9月19日发布,作为Oracle标准Java实现的一个LTS版本发布,发布了15想新特性,其中虚拟线程呼声较高。虚拟线程是JDK21中引入的一项重要特性,它是一种轻量级的...
- 效率!MacOS下超级好用的Linux虚拟工具:Lima
-
对于MacOS用户来说,搭建Linux虚拟环境一直是件让人头疼的事。无论是VirtualBox还是商业的VMware,都显得过于笨重且配置复杂。今天,我们要介绍一个轻巧方便的纯命令行Linux虚拟工具...
- 所谓SaaS(所谓三维目标一般都应包括)
-
2010年前后,一个科技媒体的主编写一些关于云计算的概念性问题,就可以作为头版头条了。那时候的云计算,更多的还停留在一些概念性的问题上。而基于云计算而生的SaaS更是“养在深闺人未识”,一度成为被IT...
- ORA-00600 「25027」 「x」报错(报错0xc0000001)
-
问题现象:在用到LOB大对象的业务中,进行数据的插入,失败了,在报警文件中报错:ORA-00600:内部错误代码,参数:[25027],[10],[0],[],[],[],[],[...
- 安卓7源码编译(安卓源码编译环境lunch失败,uname命令找不到)
-
前面已经下载好源码了,接下来是下载手机对应的二进制驱动执行编译源码命令下载厂商驱动https://developers.google.com/android/drivers?hl=zh-cn搜索NGI...
- 编译安卓源码(编译安卓源码 电脑配置)
-
前面已经下载好源码了,接下来是下载手机对应的二进制驱动执行编译源码命令下载厂商驱动https://developers.google.com/android/drivers?hl=zh-cn搜索NGI...
- 360 Vulcan Team首战告捷 以17.5万美金强势领跑2019“天府杯“
-
2019年11月16日,由360集团、百度、腾讯、阿里巴巴、清华大学与中科院等多家企业和研究机构在成都联合主办了2019“天府杯”国际网络安全大赛暨2019天府国际网络安全高峰论坛。而开幕当日最激荡人...
- Syslog 日志分析与异常检测技巧(syslog发送日志配置)
-
系统日志包含有助于分析网络设备整体运行状况的重要信息。然而,理解并从中提取有效数据往往颇具挑战。本文将详解从基础命令行工具到专业日志管理软件的全流程分析技巧,助你高效挖掘Syslog日志价值。Gr...
- 从Oracle演进看数据库技术的发展(从oracle演进看数据库技术的发展的过程)
-
数据库技术发展本质上是应用需求驱动与基础架构演进的双向奔赴,如何分析其技术发展的脉络和方向?考虑到oracle数据库仍然是这个领域的王者,以其为例,管中窥豹,对其从Oracle8i到23ai版本的核...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (74)
- oracle基目录 (50)
- oracle批量插入数据 (65)
- oracle事务隔离级别 (53)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)