Oracle优化网上常见的5个错误观点
最近系统的研究了一下ORACLE SQL语句性能调优,在此大言不惭的得出一个观点——网上很多性能调优的结论都是错误的或者不周全的。
现在的DBA大牛些都太低调了,不出来斧正一下,小弟来借这个机会吐槽一下,说的不对,欢迎拍砖,特别是版本问题:
转入正题:
网络上大部分结论“可能”适用于ORACLE8或者以前版本(小弟出道晚没见过ORACLE
8),但是针对9i及以后的版本,很多结论都是欠周全的。
下面举几个最常见的问题:
量多用EXISTS
如果你说
半连接子查询返回数据少的时候用IN,返回数据多的时候用EXISTS,那么恭喜你,你错了 。
和EXISTS的效率是一模一样的,只是有时候EXISTS不能 SUBSTRING UNNESTING,导致执行计划走FILTER
,执行计划一旦走了FILTER,驱动表是改变不了的(12C
能不能我不清楚),想象一下,主表是1000W,子表返回20条,由于驱动表改变不了,很有可能是大表驱动小表了。
IN 否则用NOT EXISTS
NOT
IN 与 NOT EXISTS也是一个道理,但是要注意NULL的情况,NULL容易导致无法使用索引,可以创建函数索引或与常量一起做一个组合索引。
可以通过下面的列子来测试一下执行效果
- CREATE TABLE TEST02 AS SELECT * FROM DBA_OBJECTS;
- SELECT COUNT(*) FROM TEST02 A WHERE A.OWNER='SYS' AND A.OBJECT_ID=29 ;
- SELECT COUNT(*) FROM TEST02 A WHERE A.OBJECT_ID=29 AND A.OWNER='SYS' ;
同第3点一样,给个例子——下面两个语句的执行计划也是一样的,ORACLE知道哪个该做驱动表
,因此没有区别
- CREATE TABLE T1 AS SELECT LEVEL AS ID FROM DUAL CONNECT BY LEVEL<=10000;--大表
- CREATE TABLE T2 AS SELECT LEVEL AS ID FROM DUAL CONNECT BY LEVEL<=10;--小表
- SELECT COUNT(1) FROM T1,T2;
- SELECT COUNT(1) FROM T2,T1;
- 执行计划
- ----------------------------------------------------------
- Plan hash value: 4259280259
- ----------------------------------------------------------------------
- | Id | Operation | Name | Rows | Cost (%CPU)| Time |
- ----------------------------------------------------------------------
- | 0 | SELECT STATEMENT | | 1 | 60 (2)| 00:00:01 |
- | 1 | SORT AGGREGATE | | 1 | | |
- | 2 | MERGE JOIN CARTESIAN| | 100K| 60 (2)| 00:00:01 |
- | 3 | TABLE ACCESS FULL | T2 | 10 | 3 (0)| 00:00:01 |
- | 4 | BUFFER SORT | | 10000 | 57 (2)| 00:00:01 |
- | 5 | TABLE ACCESS FULL | T1 | 10000 | 6 (0)| 00:00:01 |
- ----------------------------------------------------------------------
- 统计信息
- ----------------------------------------------------------
- 0 recursive calls
- 0 db block gets
- 22 consistent gets
- 0 physical reads
- 0 redo size
- 527 bytes sent via SQL*Net to client
- 519 bytes received via SQL*Net from client
- 2 SQL*Net roundtrips to/from client
- 1 sorts (memory)
- 0 sorts (disk)
- 1 rows processed
如:SELECT
ID FROM T WHERE NUM=10 OR NUM=11 会全表扫描
下面来个例子,
- CREATE TABLE TEST02 AS SELECT * FROM DBA_OBJECTS;
- CREATE INDEX TEST_02_IDX_01 ON TEST02 (OBJECT_ID);
- ALTER SESSION SET OPTIMIZER_FEATURES_ENABLE='9.2.0';
- SELECT COUNT(*) FROM TEST02 A WHERE A.OBJECT_ID=28 OR A.OBJECT_ID=29 ;
查看执行计划
- 执行计划
- ----------------------------------------------------------
- Plan hash value: 3430686514
- ---------------------------------------------------------------------
- | Id | Operation | Name | Rows | Bytes | Cost |
- ---------------------------------------------------------------------
- | 0 | SELECT STATEMENT | | 1 | 5 | 2 |
- | 1 | SORT AGGREGATE | | 1 | 5 | |
- | 2 | INLIST ITERATOR | | | | |
- |* 3 | INDEX RANGE SCAN| TEST_02_IDX_01 | 2 | 10 | 2 |
- ---------------------------------------------------------------------
- Predicate Information (identified by operation id):
- ---------------------------------------------------
- 3 - access("A"."OBJECT_ID"=28 OR "A"."OBJECT_ID"=29)
实际上使用了索引
不过说不定我这盘文章中有些结论也是错的,自己测一遍才知道
Oracle优化网上常见的5个错误观点的更多相关文章
- oracle数据库管理系统常见的错误(一)
oracle数据库管理系统常见的错误之一如下: Listener refused the connection with the following error:ORA-12519, TNS:no a ...
- adb使用过程常见的几种错误总结
问题1:Failure [INSTALL_FAILED_ALREADY_EXISTS] 问题原因:该程序已存在. 解决方法:增加-r参数,即可成功覆盖安装 问题2:Failure [INSTALL_F ...
- Oracle优化-SQL_TRACE
思维导图 Oracle优化10-SQL_TRACE解读 Oracle优化11-10046事件 概述 当我们想了解一条SQL或者是PL/SQL包的运行情况时,特别是当他们的性能非常差时,比如有的时候看起 ...
- Oracle 优化器
http://blog.csdn.net/it_man/article/details/8185370一.优化器基本知识 Oracle在执行一个SQL之前,首先要分析一下语句的执行计划,然后再按执 ...
- ORACLE优化器RBO与CBO介绍总结
RBO和CBO的基本概念 Oracle数据库中的优化器又叫查询优化器(Query Optimizer).它是SQL分析和执行的优化工具,它负责生成.制定SQL的执行计划.Oracle的优化器有两种,基 ...
- Oracle优化总结
本文主要从大型数据库ORACLE环境四个不同级别的调整分析入手,分析ORACLE的系统结构和工作机理,从九个不同方面较全面地总结了ORACLE数据库的优化调整方案.关键词 ORACLE数据库 环境调整 ...
- Oracle优化的几个简单步骤
数据库优化的讨论可以说是一个永恒的主题.资深的Oracle优化人员通常会要求提出性能问题的人对数据库做一个statspack,贴出数据库配置等等.还有的人认为要抓出执行最慢的语句来进行优化.但实际情况 ...
- mysql 常见的几个错误问题
Mysql常见的几个错误问题及解决方法: 1.问题: mysql DNS反解:skip-name-resolve 错误日志有类似警告: 点击(此处)折叠或打开 120119 16:26:04 [War ...
- oracle优化原则(二)
SQL优化原则 二.SQL语句编写注意问题 www.2cto.com 下面就某些SQL语句的where子句编写中需要注意的问题作详细介绍.在这些where子句中,即使某些列存在索引,但是由于编写了劣质 ...
随机推荐
- Get与Post区别小结
Get:是以实体的方式得到由请求Url所指定资源的信息,如果请求Url只是一个数据产生过程,那么最终要在实体中返回的是处理过程的结果所指向的资源,而不是处理过程的描述. Post:是用来向 ...
- dedecms首页入口的详细注释
今天闲来无事,就拿来dede首页的文件给大家详细解释一遍,以便于新手学习,注释过程非常非常非常的详细,里面解释到dede表前缀#@__代替的原理.解释到dede很多自定义函数的具体位置和具体作用等等疑 ...
- BZOJ2821 作诗(Poetize) 主席树 bitset
原文链接https://www.lydsy.com/JudgeOnline/problem.php?id=2821 题目传送门 - BZOJ2821 题意 $n$ 个数,$m$ 组询问,每次问 $[l ...
- 关系网络数据可视化:1. 关系网络图&Gephi
1.关系网络图 如何来表示两个对象之间的关系? 把对象变成点,点的大小.颜色可以是它的两个参数,两个点之间的关系可以用连线来表示.连线分为无向(只是连接的导向,一些简单的关系很容易体现)和有向(复杂网 ...
- network is unreachable 网关PING不通解决办法
所里有几台机器没有办法ping通网关,但是ping交换机里的其它机器都可以ping通,其它机器ping网关也可以ping通.那么就排出了硬件的故障,主要问题就在问题机器的路由表上了. 看一下路由表 r ...
- Addition Chains POJ - 2248 (bfs / dfs / 迭代加深)
An addition chain for n is an integer sequence <a0, a1,a2,...,am=""> with the follow ...
- 002.MySQL高可用主从复制部署
一 基础环境 主机名 系统版本 MySQL版本 主机IP master CentOS 6.8 MySQL 5.6 172.24.8.10 slave01 CentOS 6.8 MySQL 5.6 17 ...
- js基础梳理-如何理解作用域和作用域链?
本文重点是要梳理执行上下文的生命周期中的建立作用域链,在此之前,先回顾下关于作用域的一些知识. 1.什么是作用域(scope)? 在<JavaScritp高级程序设计>中并没有找到确切的关 ...
- Django 学习第九天——请求与响应
一.HttpRequest 对象: 服务器接收到http协议的请求后,会根据报文创建 HttpRequest 对象视图函数的第一个参数是HttpRequest 对象再django.http 模块中定义 ...
- python数据结构之插入排序
插入排序(英语:Insertion Sort)是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.插入排序在实现上,在从后向前扫描 ...