SQL优化-同SQL不同执行计划(二)

SQL优化-同SQL不同执行计划(三)-完 【疑惑三、疑惑四解答】通过上两个问题探索,已经基本确定是IO所致。Myepoch提出问题,【SQL1全表扫描】和【SQL2】执行计划【总成本】完全相同,但是为什么执行时间差别那么大呢?其实,既然是【总成本】,那么他就包涵了很多,大家多数时候误认为【总成本】就是【执行时间成本】,这是个错误的理解,【总成本】包括【CPU成本】、【时间成本】和【IO成本】等,在多数情况下,【总成本】和【 阅读详情

  【疑惑二解答】

在绝大多数时候,都会认为【全表扫描】的 SQL 会慢于【索引快速扫描】的 SQL ,我们应该相信 Oracle 的选择,在【疑惑一解答】中已经排除了【统计信息】错误的可能,同时统计信息也给我们提供了一个重要的线索,不知道大家主要到了没有,数据库创建的时候默认块大小应该是 8Kb 。
【 TBNC_P 】表存储了 3 万记录,而数据块使用了 244 块。
【 TBNC_A 】表存储了 4 万记录,而数据块使用了 19535 块。
 
且不说合理与否,但是这样巨大的差异,肯定隐藏这什么玄机。
我的第一个感觉,数据很有可能存在 Lob 字段,或是其他。
先改造了一下【 SQL1 】语句, 强制 使用全表扫描并查看执行计划:
【 SQL1 全表扫描】
Select /*+ FULL(aps) */
 art.article_id, art.article_title, aps.adminaccount
 from TBNC_A art, TBNC_P aps
 where art.column_id = aps.scopestr
   and aps.funcnodepath = 'A001B002C002D002E003'
   and aps.adminaccount = ' lgm ';
 
我又重新自己看了一下执行计划每步的 cost ,发现个的疑问,执行计划片段如下:
【 SQL1 】
步骤                                                                                                                  成本     估计返回行    估计返回字节
5    Select statement                                                                                         4291            888         64.172
4         Hash Join                                                                                               4291            888         64.172
2             TBNC_P TABLE ACCESS [BY INDEX ROWID]         3             11          0.322
1                 WEB.SYS_LGM INDEX [RANGE SCAN]                                        1             87            --
3             TBNC_A TABLE ACCESS [FULL]                                    4288          40782       1752.352
 
【 SQL1 全表扫描】
步骤                                                                                                                  成本      估计返回行    估计返回字节
4    Select statement                                                                                         4344          44229       3196.236
3         Hash Join                                                                                               4344          44229       3196.236
1             TBNC_P TABLE ACCESS [FULL]                           56            541          15.85
2             TBNC_A TABLE ACCESS [FULL]                                    4288          40782       1752.352
 
 
【 SQL2 】
步骤                                                                                                                成本      估计返回行    估计返回字节
4    Select statement                                                                                      4344          44229       3196.236
3         Hash Join                                                                                            4344          44229       3196.236
1             TBNC_P TABLE ACCESS [FULL]                        56            541          15.85
2             TBNC_A TABLE ACCESS [FULL]                                 4288          40782       1752.352
 
【 SQL1 全表扫描】和【 SQL2 】执行计划【总成本】都是 4344 ,但从 myepoch 的反馈,
【 SQL1 全表扫描】比改造前能有所改善,但【 SQL1 全表扫描】还是明显比【 SQL2 】慢。
到此【 SQL1 全表扫描】改造失败,未能彻底解决问题。
 
从另一条线索继续前行 ( 数据块疑问 ) ,为什么【 TBNC_A 】表存储了 4 万记录,
为什么 Oraclde 使用了那么多数据块呢?如果一条记录被存储在多个数据块中,
那么 Oracle 在读取此条数据的时候会如何处理呢?带着好多猜想继续调查。
我们可以清楚看到【 SQL1 】成本陡变的地方是【步骤 3 】,所以 Oracle 选择【 SYS_LGM 】从成本角度确实可以降低成本,【 SYS_LGM 】属于【 TBNC_P 】表,但是因为【 TBNC_A 】的全表扫描,
导致整个成本急剧增加,占据了整个成本的 99% ,很显然问题存在这里,
消灭【 TBNC_A 】的全表扫描,变成了首要目标 。
为了加快进度, email 联络了 myepoch 联络后,得到了完整表结构,结构如下:
为了看出重点,我把有问题的地方都是表结构上需要注意的地方标上红色。
create table TBNC_A
(
  ARTICLE_ID           NUMBER(10) not null,
  ARTICLE_TITLE        VARCHAR2(255) not null,
  ARTICLE_CONTENT      CLOB not null,
  COLUMN_ID            VARCHAR2(255) not null,
  ARTICLE_INDATETIME   DATE,
  ARTICLE_ORDER        NUMBER(10),
  ARTICLE_MENU         CLOB,
  ARTICLE_BODY         CLOB not null,
  ARTICLE_ATTACHMENT   CLOB,
  ARTICLE_CHECKID      VARCHAR2(1),
   ARTICLE_PROOFREADID  VARCHAR2(1),
  ARTICLE_CHECKTEXT    CLOB,
  LOCKACCOUNT          VARCHAR2(255),
  ARTICLE_RELATIVEFROM VARCHAR2(500)
)
tablespace WEB
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 160
    minextents 1
    maxextents unlimited
  );
-- Create/Recreate primary, unique and foreign key constraints
alter table TBNC_A
  add primary key (ARTICLE_ID)
  using index
  tablespace WEB
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 768K
    minextents 1
    maxextents unlimited
  );
-- Create/Recreate indexes
create index INDEX_COLUMN on TBNC_A (COLUMN_ID)
  tablespace WEB
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );
 
可以清楚看出,【 TBNC_A 】表设计,它拥有两个索引,一个是主键【ARTICLE_ID 】,
另换一个就是我们检索条件中的【COLUMN_ID 】,从使用的角度考虑,索引建立正确。
从表设计角度考虑,发现表中大量的使用了 5 个 CLOB 字段,到此困惑了半天的问题终于明白了点为什么 4 万记录要使用 2 万个数据块了。
所以为什么使用索引比全表扫描慢的原因也能推断个差不多了,一条记录存储在多个数据库块的事情在【 TBNC_A 】中是比较多,这样对数据库的全表扫描必须大量的读取物理数据块,谁都知道 IO 是最慢的操作之一, IO 多了, SQL 快不了。
所以综合上述,使用索引【 SYS_LGM 】没有错,只不过【 TBNC_A 】表的【 TBNC_A 】索引没有被使用,导致整个 SQL 性能急剧下降。
 
到此【疑惑二】基本就能解释的通了,但还需要继续求索。
 
接 -> SQL 优化-同SQL不同执行计划(三)
2008-05-15 早       凌 蓝风
ORACLE 11g DBM_SPM固定一个SQL多个执行计划 1.几个关于SQL查询视图以及dbms包介绍 V$SQL # 列出共享SQL区未group by的统计信息,每个输入的SQL的子游标都包含一行,在SQL执行结束之后更新,但是对于长时间运行的SQL,每5秒更新一次。 V$SQL_SHARED_CURSOR # 解释了为什么一个子游标没有与已经存在的游标共享,每一列都确定了特定的未共享的原因,address字段关联... 阅读详情

相关推荐

SQL优化:执行计划

讲述执行计划

一只不知疲倦的学习猿 1097

SQL优化-同SQL不同执行计划(一)

 问题来源:优快云 Oracle技术论坛问题        :myepoch提出相同SQL因为检索的值,不同执行效率差别巨大。问题环境:Oracle 10g,TBNC_P表在adminaccount有B树索引,TBNC_P总记录数:33422行TBNC_A总记录数:40782行结果      :已经解决,优化后的SQL执行时间,均小于0.032秒【SQL 1】:sel

凌蓝风的灿烂天空 5270

Oracle SQL执行计划与优化

目录 系统函数Userenv00、准备工作作业1ROWID、ROWNUM分析Oracle索引扫描四大类DML语句-MERGEDML语句-CALLEXPLAIN PLAN总结oracle table-lock的5种模式SQL优化器如何进行评估优化执行计划稳定性深入研究Oracle查询优化4大方面的主要途径SQL优化例子

yumushui的专栏 3522

oracle 相同的sql执行两次 执行计划会不一样吗,【讨论】请教同一条SQL执行计划不一致的问题...

同一条SQL语句,只有查询条件不一样,查询返回的结果集都为0,一个走了全表扫描,一个走索引。查看全表扫描的SQL语句:SQL走全表,产生了2422609个逻辑读,cost为535KSQL> SELECT URL,YHZH,HFRZY,HFLR,SPURL,TPURL,YPURL,SCSJ,LY,JCSJFROM YHXX_HFXX TWHERE T.URL='http://club.kdne...

weixin_33582801的博客 773

Oracle SQL 执行计划分析与优化指南

在 Oracle 数据库中,SQL 语句的执行计划可能会因统计信息、优化器参数等因素发生变化,从而影响查询性能。本指南介绍如何查看 AWR 中的多个执行计划、分析执行计划变化、获取 SQL 报告,以及如何使用 SQL Profile 强制绑定执行计划以提升查询稳定性。执行计划的波动可能会导致 SQL 语句的性能不稳定。如果 SQL 执行计划出现频繁变更,导致性能波动,可以使用 SQL Profile 强制绑定执行计划。执行后,根据提示输入相应 SQL ID,即可获取 SQL 性能报告。

weixin_42329915的博客 1250

Hive SQL 执行计划

Hive SQL 执行计划

日常分享数据分析开发、编程语言内容 1437

oracle执行计划完全一样,急求解答:两个相同的数据库的执行计划差别怎么那么大,附带执行计划!!!...

最近工作中遇到一个很郁闷的问题:前提:我一个培训环境,一个测试环境,均是AIX 5.3的操作系统,2个CPU ,6G内存,测试环境是1个月前通过rman方式将数据从培训环境中导入的检查确认参数文件保持一致,表结构一致,数据量差别非常小问题现象:一个sql语句在两个配置和表结构相同的数据库中的执行计划不同,而且差别太大,查询结果出来后一个是5秒,一个几分钟sql语句:select *from (se...

weixin_35009700的博客 404

掌握SQL语句执行计划:性能优化与查询分析

本文还有配套的精品资源,点击获取 简介:在数据库性能优化中,执行计划是关键,它展示了SQL语句的处理细节,如数据检索、表扫描顺序、索引使用等。本文深入探讨如何获取和分析执行计划,以优化查询性能,涵盖执行计划的重要性、获取方法、关键元素,以及常见SQL语句的执行计划分析和调整策略。 1. SQL执行计划的重要性 在数据库性能调优的舞台上,SQL执行计划是一个关...

weixin_42471823的博客 1658

SQL优化——执行计划

获取执行计划的常用方法、定制执行计划、通过查看执行计划建立索引、通过光标移动阅读执行计划

码说芯语的博客 6241

基于ENVI5.3的Landsat条带去除、辐射定标、大气校正

基于ENVI5.3的Landsat条带去除、辐射定标、大气校正坏带修复辐射定标大气校正 坏带修复 1.下载landsat_gapfill插件,放入“安装目录\Exelis\ENVI53\extensions”,重启ENVI 2. 加载拟处理文件(MTL.txt格式) 3.打开landsat_gapfill 4.选择存放位置并命名文件 5.选择处理文件 辐射定标 1.选择工具Radiometric Calibration 2.选择已修复坏带文件 3.修改参数,选择输出位置及命名文件 大气校正 1

u010198950的博客 1万+

运放+三极管恒流源电路设计实战:从原理到仿真一步到位(附Multisim文件)

本文详细解析了运放与三极管构建恒流源电路的核心原理,重点阐述了负反馈机制如何实现精准的电流控制。通过Multisim仿真实战,从电路搭建、参数计算到负载调整率与动态响应分析,一步步指导设计过程,并提供常见故障的调试技巧与PCB设计要点,帮助工程师从理论平稳过渡到可靠实践。

7z8x2c4v6b9的博客 711

达梦SQL优化及执行计划解读

0、概述 在数据库的使用中,数据库的性能往往是至关重要的问题,而数据库的性能问题最终基本都要涉及到SQL优化。本文就将详细介绍一些达梦中SQL优化的知识。 1、执行计划详解 1.1、执行计划解读 无论是什么数据库,一般SQL优化我们都需要去查看SQL的执行计划,了解SQL具体是慢在哪里,才知道从哪里开始优化。 那么什么是执行计划呢? 执行计划是SQL语句的执行方式,由查询优化器为语句设计的执行方式,交给执行器去执行。在达梦中我们可以在SQL命令行使用EXPLAIN可以打印出语句的执行计划。 例如下面就是一个

Focus on PostgreSQL 1万+

EDSR图像超分辨程序复现(踩坑及解决记录)

EDSR图像超分辨程序复现(踩坑及解决记录)

Sunny_Coder的博客 3642

二、postgre数据库SQL优化:查看执行计划

sql优化是一项必备技能,为了优化sql任务,则需要明确需要优化的内容。除了经验之外,可以借助工具,查看sql执行过程中的耗时环节,从而针对性的进行优化,本文即为对执行计划的一些基本信息进行了总结学习。

积跬步,慕至千里的博客 6848

Kubernetes CRD 系列(一):CRD 介绍

CR(Custom Resource)其实就是在 Kubernetes 中定义一个自己的资源类型,是一个具体的 “自定义 API 资源” 实例,为了能够让 Kubernetes 认识这个 CR,就需要让 Kubernetes 明白这个 CR 的宏观定义是什么,也就是需要创建所谓的 CRD(Custom Resource Definition)来表述。 可能这么说并不是太直观,换个方式表达一下,我们想要创建一个 Pod 的时候,那么会编写一个 YAML 配置,然后前两行一般会这么写: [root@l

会哭的雨@的博客 7920

2、微软 Power Automate 入门指南

本文是一篇关于微软 Power Automate 的入门指南,详细介绍了 Power Automate 的基本概念、相关术语、登录方式以及如何创建一个简单的自动化流。文章还探讨了 Power Automate 在业务流程中的应用场景和优势,并展望了其高级功能和未来发展。适合希望快速入门 Power Automate 并提升业务自动化效率的读者。

corn8的博客 442

Sql执行计划,优化sql必备!

SQL执行计划学习背景:        实际项目开发中,由于我们不知道实际查询的时候数据库里发生了什么事情,数据库软件是怎样扫描表、怎样使用索引的,因此,我们能感知到的就只有sql语句运行的时间,在数据规模不大时,查询是瞬间的,因此,在写sql语句的时候就很少考虑到性能的问题。但是当数据规模增大,如千万、亿的时候,我们运行同样的sql语句时却发现迟迟没有结果,这个时候才知道数据规模已经限制了我们查...

choath的博客 3万+

R语言缺失值填补|插值法、均值法、邻近法

本文主要介绍如何利用R语言进行数值型缺失值的填补。主要使用zoo包中的na.aggregate() 、na.approx()、na.locf() 函数进行缺失值的均值填补、线性插值填补以及邻近值填补。

Mrrunsen的博客 3841

数据库SQL执行计划

能写sql 只是程序员的基本功,能写出性能优异的SQL是优秀程序员的必备技能 什么是Mysql的执行计划 要对执行计划有个比较好的理解,需要先对MySQL的基础结构及查询基本原理有简单的了解。 一条SQL如何执行?大概过程 MySQL本身的功能架构分为三个部分,分别是 应用层、逻辑层、物理层,不只是MySQL ,其他大多数数据库产品都是按这种架构来进行划分的。 应用层,主要负责与客户端进行交互...

Stu_zkl的博客 6054

SecOC专题之新鲜值TripCnt

本系列为一步步拆解新鲜值的分发及管理而撰写文章属于原创,根据自身开发经验及理解撰写,若有错误请指出Trip Counter是新鲜值中变化最慢的一个part,并且自增到最大值时,会从头开始翻转计数。Trip Counter需要收发双方都保存,由于其变化较慢,所以不会经常进行同步该值。这就要求开发过程中保证每次对该值的读写必须要正确。

qq_22969363的博客 1154

openclaw中文版安装教程和常用命令

OpenClaw 中文版的和,涵盖本地一键部署、Docker 隔离部署、阿里云极速部署三种方式,以及六大类高频命令,方便你快速上手和日常运维。

suny8的专栏 2998

SQL执行计划

SQL执行计划一、执行计划是什么执行计划(execution plan,也叫查询计划或者解释计划)是数据库执行 SQL 语句的具体步骤。执行计划可以让你知道复杂的sql语句是怎么执行的,有没有按照你想的方案执行,有没有按照最高效的方式执行,使用了众多索引的哪一个,通过索引还是全表扫描访问表中的数据,连接查询的实现方式和连接...

weixin_40310432的博客 2963

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Mysql执行计划和Mysql优化

1. 执行计划 1.1. 执行计划概念 执行计划是什么:使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。 作用:分析你的查询语句或是表结构的性能瓶颈。 语法:Explain + SQL语句 执行计划输出内容介绍:表的读取顺序、数据读取操作的操作类型、哪些索引可以使用、哪些索引被实际使用、表之间的引用、每张表有多少行被优化器查询。 执行计划包含的信息: 1.2. 执行计划各字段详解 1.2.1. 执行计划-ID select查询的序列号,包含一组数字,

前路无畏的博客 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

SQL优化之EXPLAIN执行计划(转载)

友情提醒:先看文章目录,大致了解文章知识点结构,点击文章目录可直接跳转到文章指定位置。

baomingshu的博客 2278

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

什么是SQL执行计划

什么是SQL执行计划

qq_43934844的博客 2138

SQL SERVER执行计划详解

序言 本篇主要目的有二: 1、看懂t-sql的执行计划,明白执行计划中的一些常识。 2、能够分析执行计划,找到优化sql性能的思路或方案。 如果你对sql查询优化的理解或常识不是很深入,那么推荐几骗博文给你:SqlServer性能检测和优化工具使用详细 ,sql语句的优化分析,T-sql语句查询执行顺序。 执行计划简介 1、什么是执行计划? 提交的sql语句会通过数据库查询优化器,经过分析生成多个数据库可以识别的高效执行查询方式。然后优化器会在众多执行计划中找出一个资源使用最少,而不是最快的执行方案,给你展

Smilecoc的博客 8346
上一篇: SQL优化-同SQL不同执行计划(一)
下一篇: SQL优化-同SQL不同执行计划(三)-完
ehuman
博客等级 码龄22年 21粉丝 8原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值