SQL TUNING
文章平均质量分 65
robinson1988
本人精通SQL,精通所有关系型数据库SQL调优,精通所有关系型数据库性能优化,精通所有关系型数据库架构,精通分库分表,熟悉大数据Hadoop,Hive,Spark,Flume,Kafka,Flink,熟悉各种ETL工具,熟悉Python,Java,C
展开
-
CPU对数据库的性能影响
设置了参数alter system set "_serial_direct_read"=never;intel e5-2667 v4 1.58秒,这颗CPU和E5-2697 v3都是垃圾佬比较关注的CPU。为了避免物理IO的影响,多次反复运行,确保test01全部缓存在buffer cache中。我拿消费级CPU对比服务器CPU是有问题的,毕竟消费级CPU主频比服务器CPU高接近1倍了。从上面的测试结果可以看到,CPU对数据库的影响非常巨大,特别是有跑批业务的情况。最近做了个CPU性能测试,测试语句如下。原创 2024-02-05 23:39:14 · 534 阅读 · 1 评论 -
利用业务逻辑+OB分布式特性优化SQL
Oceanbase优化经典案例:利用业务逻辑+OB分布式特性优化SQL原创 2023-03-09 16:45:41 · 1387 阅读 · 1 评论 -
SELECT后面有自定义函数的优化方法
SELECT后面有自定义函数的优化方法原创 2022-12-06 19:36:01 · 1084 阅读 · 0 评论 -
利用ORDERED_PREDICATES优化多个自定函数作为WHERE过滤条件
利用ORDERED_PREDICATES优化多个自定函数作为WHERE过滤条件原创 2022-11-18 16:06:23 · 686 阅读 · 1 评论 -
where条件中有权限校验的自定义函数优化方法
where条件中有权限校验的自定义函数优化方法原创 2022-10-20 11:25:46 · 438 阅读 · 1 评论 -
Oracle19c中SQL分开跑很快UNION ALL之后变慢分析
SQL分开跑很快,UNION ALL之后变慢原创 2022-10-11 20:19:20 · 3829 阅读 · 0 评论 -
SQL优化案例之exists中套or not exists
一个SQL带你了解SQL等价改写各种姿势原创 2022-10-04 21:01:41 · 1205 阅读 · 0 评论 -
SQL优化案例之where exists(col1=xxx or col2=xxx)等价改写
SQL优化案例之where exists(col1=xxx or col2=xxx)等价改写原创 2022-09-23 15:33:23 · 1357 阅读 · 0 评论 -
今年一直搞Oracle EBS优化,脑壳痛
搞了10几年的性能优化,OLTP系统,OLAP系统,Oracle,MYSQL,PG,Greenplum,Oceanbase,hive,达梦等等各种数据库优化项目做过太多太多...唯独EBS系统没有单独做过优化,一直都很遗憾。虽然之前做网络培训的时候教了几个EBS DBA徒弟,他们也找我优化过EBS的SQL,但是都是零零散散的。今年开春,公司接了一个EBS优化项目(版本ebs11i),这也算公司是第一个真正意义的EBS优化项目。早期是3个DBA和3个EBS顾问以及项目经理在客户现场,搞了2个多月,进展原创 2021-10-21 02:32:56 · 3582 阅读 · 5 评论 -
利用分析函数减少对表访问次数
最近在给一银行客户优化数据仓库,发现了很多烂SQL下面这条SQL有很好的教学作用,现拿来与大家分享SQL语句如下:select /*+ parallel(16) */ count(*) from (SELECT HM, DZ, YB, ZZDH, ZJLX, ZJHM, JGBM, Z原创 2021-09-01 22:15:29 · 793 阅读 · 1 评论 -
对自定义函数开启parallel_enable属性使函数可以并行来提升SQL查询性能
***人社系统最近做了数据迁移,采用国产的Zdata一体机替换了老旧的小型机,数据库也从11g升级为了19c之前整个系统被拆分为5套子系统,这次升级将5套子系统做了整合,采用pdb的方式将5套子系统统一存放在Zdata一体机中完成数据迁移之后,在没有针对SQL进行专门的优化的前提下,从各项指标上看,系统的整体性能提升了15-20倍虽然整个系统的性能有了巨大提升,但是我们觉得还不够,我们的目标是将性能提升100倍前几天对系统中一个老大难的SQL做了等价改写,SQL从每次执行5到10分钟降低为了15秒.原创 2021-01-17 21:54:44 · 1605 阅读 · 3 评论 -
都2020年了还能看见奇葩的SQL写法
原创 2020-08-17 13:08:51 · 1440 阅读 · 5 评论 -
A.COLUMN LIKE B.COLUMN% 关联的优化方法
现在有个SQL要跑10秒:SQL> select a0.id, 2 a1.room_no, 3 a1.user_name, 4 a1.user_no, 5 row_number() over(partition by a0.id order by a1.room_enter_time desc) as fn 6 from vid_attachment a0 7 inner join vid_room原创 2020-06-13 22:16:07 · 958 阅读 · 1 评论 -
不要对date类型to_char
数据库环境Oracle12c一位运维DBA学员发来SQL优化请求,他说这是一个报表,要跑7分钟,开发天天被骂,请他优化他搞不定,把执行计划发给我,我瞄了一眼执行计划,发现有笛卡尔积,于是叫他禁止笛卡尔积禁止笛卡尔积之后,SQL还是要跑1分多钟,SQL语句和执行计划如下:select rownum,substr(to_char(t.ymd,'yyyymmdd'),5,2)||'月'||...原创 2020-04-30 21:45:13 · 1154 阅读 · 2 评论 -
利用or改写union all
实体班一位学生最近要做SQL优化,发来一条SQL:select t.flowmeterno, t.flowmetername, t.cardno, nvl("2020-04-08(m³)", 0) + nvl("2020-04-09(m³)", 0) + nvl("2020-04-10(m³)", 0) + nvl("2020-...原创 2020-04-17 20:46:47 · 1632 阅读 · 0 评论 -
利用双表技术解决多列日期查询性能问题
一个数据库老兵(10几年数据库+数据仓库+大数据经验)遇到了这样一个难题:有个订单表有2个字段,一个是 order_date 订单日期,一个是 entry_date 入库日期,平时业务系统查询使用的是 order_date,表呢是根据order_date 按天分区,每天凌晨ETL工具会根据 entry_date 将昨天入库的数据抽到数据仓库,他抱怨抽数的过程非常慢,因为每天入库的订单有几百万到...原创 2020-03-25 12:16:50 · 926 阅读 · 4 评论 -
CURSOR_SHARING,VERSION_COUNT
CURSOR_SHARING:determines what kind of SQL statements can share the same cursors.cursor_sharing有三个值,默认的是exact,表示每条SQL精确匹配。force表示强制绑定类似的SQL。similar,当收集了柱状图的统计信息之后,对于不同的变量会从新解析,如果没有收集柱状图,similar就和原创 2009-11-12 15:57:00 · 5840 阅读 · 3 评论 -
ORACLE SQL执行步骤
以前理解的 ORACLE sql 的处理过程大致如下: 1.运用HASH算法,得到一个HASH值,这个值可以通过V$SQLAREA.HASH_VALUE 查看 2.到shared pool 中的 library cache 中查找是否有相同的HASH值,如果存在,则无需硬解析,进行软解析 3.如果shared pool不存在此HASH值,则进行语法检查,查看是否有语法错误 4原创 2009-11-11 13:52:00 · 6264 阅读 · 0 评论 -
驱动表
驱动表(driving table/outer table)又称为外层表,驱动表仅仅用于nested loops join 和 hash join驱动表是用来驱动查询的在cbo中,优化器会根据cost自动选择驱动表,与表的顺序无关。通常情况下,驱动表的选择性较高(该列唯一键与列的比值较高),where中的限制条件较多,返回的行数较少的表适合做驱动表,看见pub上面讨论小表适合做驱动表,原创 2009-12-01 10:33:00 · 5863 阅读 · 5 评论 -
USE_HASH
use_hash(table1,table2) 指定table1,table2连接以HASH 方式连接,采用这种方式,我们不能控制table1,table2哪个表为驱动表,优化器会根据cost自动选择驱动表,如果我们非要控制table1为驱动表,可以加上leading(table1)作为提示,或者用ordered 作为提示。另外如果我们使用use_hash(table1)有可能优化器不会选原创 2009-12-01 16:29:00 · 30606 阅读 · 0 评论 -
USE_NL
use_nl (table1,table2....) 提示指示指定表作为inner table,如果指定的表已经作为了outer table(驱动表),那么优化器会忽略use_nl 提示,如果非要强制它作为inner table ,可以与ordered 提示一起使用。下面以SCOTT测试用户作为试验 SQL> select table_name,last_analyzed from原创 2009-12-01 15:16:00 · 7403 阅读 · 0 评论 -
Full Hint
FULL Hint可以提升优化器对指定表走全表扫描,但是FULL提示一次只能对一个表起作用SQL> select ename,dept.deptno from emp,dept where emp.deptno=dept.deptno;已选择14行。执行计划----------------------------------------------------------Plan h原创 2009-12-02 17:00:00 · 3376 阅读 · 0 评论 -
列定义允许null,可能导致Index Hint提升不走索引
遇到一个SB问题,加index hint提升,居然也不走索引,郁闷良久,结果发现该表的定义允许null,这对优化器有影响SQL> desc emp 名称 是否为空? 类型 -----------原创 2009-12-02 17:09:00 · 2736 阅读 · 1 评论 -
索引选择性
索引的选择性:表中列的唯一键的数量比上表的行数,索引的选择性越高,索引返回的行数就可能越少,该索引就越好。 可以使用一个非常简单的SQL来计算某个索引的选择性,计算选择性之前,该索引必须被分析过 SQL> select index_name,last_analyzed,distinct_keys/num_rows selectivity from user_indexes;IN原创 2009-12-08 16:51:00 · 4337 阅读 · 0 评论 -
索引的Clustering Factor
Clustering Factor:集群因子(聚簇因子)用来描述一个表中的列是否是规则排序的Clustering Factor的算法如下:我们知道可以通过dbms_rowid.rowid_block_number(rowid)找到记录对应的block号。索引中记录了rowid,因此oracle就可以根据索引中的rowid来判断记录是否是在同一个block中。举个例子,比如说索引中有a,b,c,原创 2009-12-09 10:32:00 · 2783 阅读 · 0 评论 -
柱状图(Histogram),绑定变量,bind peeking,cursor_sharing 之间的关系1 柱状图
柱状图(histogram):柱状图用于记录表中的列的分布情况,有了柱状图的统计信息之后,CBO就能决定到底是否使用使用该列的索引,如果数据分布不均匀,CBO可能仅仅依据索引的选择性(selectivity)来判断是否使用该索引,从而导致选择不到最优的执行计划。下面是实验步骤:SQL> create table test as select * from dba_objects;表已原创 2009-12-09 16:28:00 · 3110 阅读 · 0 评论 -
柱状图(Histogram),绑定变量,bind peeking,cursor_sharing 之间的关系2 绑定变量与柱状图
前面讨论了有了柱状图的统计信息的时候,对于分布不均衡的列,如果没有使用绑定变量,CBO将会选择正确的执行计划,下面来谈谈对于分布不均衡的列,使用了绑定变量,不收集柱状图统计信息,收集了柱状图统计信息分别会发生什么情况。 本测试同样使用TEST表,表结构和内容请看前一篇内容在不收集柱状图统计信息的情况下:session 1中SQL> exec dbms_stats.gath原创 2009-12-10 09:54:00 · 3187 阅读 · 3 评论 -
柱状图(Histogram),绑定变量,bind peeking,cursor_sharing 之间的关系3 柱状图与cursor_sharing
前面讨论了柱状图对于绑定变量的影响,现在讨论柱状图对于cursor_sharing的影响,本实验继续以TEST表实验,关于TEST表的具体结构和完整内容请查看前面的内容。SESSION 1中SQL> select * from v$version;BANNER----------------------------------------------------------原创 2009-12-10 14:28:00 · 4278 阅读 · 0 评论 -
count(*), count(1) ,count(唯一键索引),count(非唯一键索引),count(存在null索引)的效率
看见pub上面有人问count(*),count(1),count(索引字段)有什么区别,效率是否相同,恩 是个好问题下面我来研究研究SQL> create table test as select * from dba_objects;表已创建。SQL> alter table test modify object_id primary key;表已更改。SQL> set a原创 2009-12-11 13:01:00 · 7709 阅读 · 4 评论 -
index range scan,index fast full scan,index skip scan发生的条件
index range scan(索引范围扫描):1.对于unique index来说,如果where 条件后面出现了 ,between ...and...的时候,那么就可能执行index range scan,如果where条件后面是=,那么就会执行index unique scan。2.对于none unique index来说 如果where 条件后面出现了=,>,3.对于组合索原创 2009-12-10 16:52:00 · 13409 阅读 · 1 评论 -
bitmap index
bitmap index 适用于 dss(决策支持系统) 和Data warehouse,ORACLE 建议的是不要在繁重的OLTP中使用 bitmap index ,我个人建议:千万别在OLTP中使用bitmap index,否则你死定了。请看一下测试:SQL> create table test as select * from dba_objects;表已创建。SQL> update tes原创 2009-12-16 15:45:00 · 6058 阅读 · 1 评论 -
SQL 语句中对于like 的调优
SQL> create table test as select * from dba_objects;表已创建。SQL> select owner,object_name from test where owner like ROBINSON%;OWNER OBJECT_原创 2010-03-23 14:45:00 · 9858 阅读 · 4 评论 -
直方图统计导致错误的执行计划
今天下午一哥们遇到个case.他说如下SQL语句SELECT WORKITEMID FROM WFWIPARTICIPANT WHERE PARTICIPANT IN (771, 99999, 41, 146, 李锦);用DBMS_STATS收集统计信息之后会走全表扫描,而用analyze table WFWIPARTICIPANT compute stati原创 2010-04-15 17:02:00 · 4291 阅读 · 1 评论 -
使用with as 优化SQL
在一个SQL语句中,如果某个表需要被访问多次,而且每次访问的时候限制调剂基本上一致的话,我们就可以利用with as来优化下面举个例子:SQL> CREATE TABLE t1 (id number, name varchar2(10));Table created.SQL> begin 2 FOR i IN 1 .. 1000 LOOP 3 INSERT INTO t1 VALUES(i,'fuck'); 4 END loop; 5 commit;原创 2010-06-03 23:25:00 · 6626 阅读 · 2 评论 -
通过设置SQLPLUS ARRAYSIZE(行预取)加快SQL返回速度
有时候你可能会用SQLPLUS spool 表的数据,那么怎么加快spool速度呢?SQLPLUS中有个行预取的选项SQLPLUS中 arraysize默认为15 SQL> show arraysizearraysize 15它表示从Oracle服务器端一次只传递15行记录到客户端(SQLPLUS),当然了JDBC,WEBLOGIC也有行预取,具体自己Google举个例子:SQ原创 2011-06-21 22:47:00 · 5730 阅读 · 4 评论 -
帮ITPUB网友调SQL
http://www.itpub.net/viewthread.php?tid=1462612&extra=page%3D1&page=1 SQL> explain plan for select ((v.yvalue * 300) / (u.xvalue * 50)),原创 2011-07-22 17:02:52 · 5560 阅读 · 11 评论 -
一次帮助网友优化的SQL案例
网友QQ发来如下信息,问我下面这个SQL是否能有性能提升的地方,他们监控到这个SQL磁盘读很高 SQL> set autotrace onSQL> select * from( select GRDL_ID qyid,KHMC nsrmc,KHBM nsrsbh,KHBM s原创 2011-07-18 13:04:45 · 4655 阅读 · 4 评论 -
SELECT MIN(ID),MAX(ID) FROM TABLE 优化问题
2011/07/20到支付宝面试,被问及一个问题 SELECT MIN(ID),MAX(ID) FROM TABLE 如何优化好的现在来做个实验:SQL> select * from v$version where rownum<2;BANNER----------原创 2011-07-21 17:45:31 · 15812 阅读 · 0 评论 -
组合索引怎么应该怎么选取引导列?
有这样一个SQLselect count(*) from t1,t2 where t1.id=t2.id and t1.owner='SCOTT';id列选择性很高,owner选择性很低要优化它很简单,只需要在t1表上建立一个组合索引(owner,id),在t2表上建原创 2011-08-05 16:14:36 · 7491 阅读 · 5 评论 -
一次访问ORACLE数据字典的优化
前面写过一篇帖子:DBA任务---确保统计信息准确性http://blog.csdn.net/robinson1988/article/details/6321537今晚上有位哥们QQ问我有没有什么SQL脚本用来收集统计信息的 几乎未加思考我就把上面的脚本原封不动的贴个了那位原创 2011-09-08 00:16:40 · 4722 阅读 · 0 评论