Oracle直方图导致SQL不走索引.

在ITPUB 上看到一个帖子 http://www.itpub.net/thread-1875212-1-1.html

同一条SQL语句,只有查询条件不一样,查询返回的结果集都为0,一个走了全表扫描,一个走索引。查看全表扫描的SQL语句:
SQL走全表,产生了2422609个逻辑读,cost为535K
SQL> SELECT URL,YHZH,HFRZY,HFLR,SPURL,TPURL,YPURL,SCSJ,LY,JCSJ FROM YHXX_HFXX T 
2       WHERE T.URL='http://club.kdnet.net/dispbbs.asp?id=10165509_boardid=1'   
3        /
no rows selected

Execution Plan
----------------------------------------------------------
Plan hash value: 2068618995
-------------------------------------------------------------------------------
| Id  | Operation         | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |           |   917K|   266M|   535K  (1)| 01:47:05 |
|*  1 |  TABLE ACCESS FULL| YHXX_HFXX |   917K|   266M|   535K  (1)| 01:47:05 |
-------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter("T"."URL"='http://club.kdnet.net/dispbbs.asp?id=10165509_b oardid=1')
             
Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
    2422609  consistent gets
          3  physical reads
       5520  redo size
        880  bytes sent via SQL*Net to client
        458  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          0  rows processed

强制HINT使用索引,产生4个逻辑读,但是cost比全表扫描高:643K --显然这个计划才是最好的,但是为什么cost会这么高呢?下面会分析.

SQL> SELECT  /*+index(YHXX_HFXX IDX_YHXX_HFXX_URL)*/
2       URL,YHZH,HFRZY,HFLR,SPURL,TPURL,YPURL,SCSJ,LY,JCSJ
3       FROM YHXX_HFXX 
4      WHERE URL='http://club.kdnet.net/dispbbs.asp?id=10165509_boardid=1'  

5       /
no rows selected

Execution Plan
----------------------------------------------------------
Plan hash value: 518948569
-------------------------------------------------------------------------------------------------
| Id  | Operation                   | Name              | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                   |   917K|   266M|   643K  (1)| 02:08:48 |
|   1 |  TABLE ACCESS BY INDEX ROWID| YHXX_HFXX         |   917K|   266M|   643K  (1)| 02:08:48 |
|*  2 |   INDEX RANGE SCAN          | IDX_YHXX_HFXX_URL |   917K|       | 10735   (1)| 00:02:09 |
-------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("URL"='http://club.kdnet.net/dispbbs.asp?id=10165509_boardid=1')

Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          4  consistent gets
          0  physical reads
          0  redo size
        880  bytes sent via SQL*Net to client
        458  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          0  rows processed


这里最奇怪的地方是当我们强制用hint的时候,虽然也走了索引,但是执行计划显示的estimated rows居然是917K和全部扫描一样多!

那就意味着优化器根据统计信息推断出里面所有的行的URL字段和where 条件里的URL='http://club.kdnet.net/dispbbs.asp?id=10165509_boardid=1' 值完全相同.这显然不可能。

这里我们注意到URL这个字符串值很长,在有直方图信息的时候,estimated row 首先考虑直方图信息,而且直方图只会取前32个字符生产一个浮点数,用这个浮

点数来计算直方图的统计信息。所以如果URL字段收集了直方图信息,并且URL的前32位完全相同,那么以为着在直方图统计的时候,会认为它们是一样的。

这里URL的前32都是“http://club.kdnet.net/dispbbs.as”,里面所有数据的URL都是针对同一个地址不同的id,这样就被认为是完全一样的了。

那么Oracle就认为数据要全部选出来,当然这种情况下扫描表是最好的了。因为选了第一个计划。

解决方案: 删除直方图统计信息

exec dbms_stats.gather_table_stats(ownname => 'YQJK',tabname => 'YHXX_HFXX',estimate_percent => 10,method_opt=>'for columns  URL size 1',cascade=>TRUE) ;

删除直方图信息请参考 http://www.cnblogs.com/princessd8251/articles/3855707.html

Oracle直方图实战:从原理到调优 本文深入解析Oracle直方图的核心原理与实战调优。直方图通过揭示数据列的真实分布,帮助优化器在数据倾斜时做出更准确的执行计划选择,从而解决因错误估算导致的SQL性能问题。文章详细介绍了频率、高度平衡、混合及高频等直方图类型,并提供了从创建、查看到管理维护的完整实战指南与避坑建议。 阅读详情

相关推荐

oracle 收集直方图不走索引

1 Plan hash value: 1138811981 2 3 ---------------------------------------------------------------------------------------------- 4 | Id | Operation | Name | Rows |...

zhaoyangjian724的专栏 653

ora9ir2直方图测试

--环境:windows下oracle9i 9.2.0.1.0 --建一张表有一个state状态字段,同时给这个字段上建一个索引,状态为1的记录有100000条,为2的只有1条。--select * from t where...

ckw20688的博客 136

11g 搜集直方图导致不走索引

SELECT messagein0_.proccnt AS col_0_0_ FROM mbfe.messagein messagein0_ WHERE messagein0_.msgID='ID:414d5120514d453333313020202020204c224a3c200c49cb'; 1条记录 SQL_ID c1pvjs5wx132x, CHILD NUMBER 0 ----

zhaoyangjian724的专栏 760

11g 等频直方图下sql不走索引扫描

昨天下午开发人员报告一条非常奇怪的sql,使用该sql的执行计划使用全部扫描,但是查询列是建有索引的,oracle版本 11.2.0.2该sql格式如下 select * from doc_JUSTIN where do_no...

congdiku5262的博客 155

实战演练:用wvp-GB28181-pro + ZLMediaKit搭建一个可用的国标视频监控测试环境(附设备模拟器对接)

本文详细介绍了如何使用wvp-GB28181-pro和ZLMediaKit在Ubuntu系统上搭建GB28181视频监控测试环境。从环境准备、组件解析到核心服务部署与设备模拟器对接,提供完整的实战指南,帮助开发者快速构建可验证的监控系统。

weixin_42692935的博客 580

STM32G474串口调试避坑指南:从CubeMX配置到中断收发,手把手教你搞定USART1

本文详细解析了STM32G474串口调试中的常见问题,从CubeMX配置到中断收发,提供USART1的避坑指南。涵盖时钟树同步、GPIO模式选择、中断接收逻辑、波特率偏差修正等关键点,帮助开发者高效解决串口通讯难题,提升嵌入式开发效率。

weixin_29191081的博客 210

oracle is null走索引,oracle sql中涉及is null时如何优化(索引创建和直方图) | 学步园...

适用场景试想下面的sqlSelect*fromBD_INVMANDOC_baktwheret.negallowedisnullort.negallowed='N'如果negallowed列只有两个值:Y和N,并且存在NULL那么我们在negallowed列创建一个索引,这个语句仍然不能走索引,原因为索引中不存储null值。BD_INVMANDOC_bak表106万数据,其中5万行值为N,100万行...

weixin_31282049的博客 948

ENVI水体提取流程实践与问题

ENVI水体提取流程实践与问题 卫片解译中,水体属于比较好判别的一类。有水体指数、阈值法、监督分类等一系列方法进行提取,今天介绍利用水体指数和ENVI提取水体的过程。 1.所用数据 Landsat8卫片1景、ENVI5.3。 2.辐射定标与水陆分离 由于要对卫片进行水体指数的计算,因此需要对数据进行辐射定标以及大气校正的预处理。 辐射定标就是将图像的数字量化值(DN)转化为辐射亮度值或者反射率或者表面温度等物理量的处理过程。在工具栏中搜索Radiometric Correction,点开进行辐射定标。

Soul_taker的博客 4万+

oracle in 不走索引_索引聚簇因子(clustering_factor)

在我以前还在从事开发工作的时候,我经常会疑惑,我的sql语句涉及的表上明明有索引,可为什么偏偏就是不走索引而是选择全表扫描呢?然后一顿百度之后,让我的sql强制走上了索引,可为什么走上索引之后比全表扫描还要慢呢?现在回过头来看看确实很好笑,不过简单归简单,今天还是来探究一下其中涉及到的知识点。 当一张表上有索引,那么sql在执行的时候却不走索引的原因有很多很多,...

weixin_39878646的博客 1319

用Typora画流程图和序列图:Mermaid语法实战教程(含常见报错解决)

本文是一份详细的Typora与Mermaid语法实战教程,教你如何在Markdown文档中高效绘制流程图和序列图。文章涵盖从环境配置、核心语法到复杂图表构建的全过程,并重点解析了常见报错原因与解决方案,助你将可视化图表无缝融入文档工作流。

weixin_29279101的博客 299

Jev模型入门:从API接入到本地部署的完整实践指南

大模型的应用方式正从单一聊天窗口转向复杂的自动化工作流,而推理模型因具备指令跟随与结构化输出能力,成为构建Agent和数据处理管线的关键组件。Jev作为面向通用场景的推理模型,不仅提供了OpenAI兼容的API接口,还支持本地量化部署,兼顾隐私、可控性与长期成本。本文从模型定位出发,明确Jev与基座模型的差异,随后介绍密钥管理、API调用、参数调优,并深入演示基于Ollama与llama.cpp的本地部署流程,包括GGUF模型文件与chat template的匹配要点。针对实践中的常见问题,如密钥泄露、ma

weixin_29057237的博客 359

数据分布不均匀导致查询不走索引。

测试表 SQL> desc test Name Null? Type ----------------------------------------- -------- ---------------------------- ID ...

whb234174124的博客 1006

微信小程序 - 实现人脸识别对比+人脸相似度数据,用户从相册选择或拍照上传两张图片进行人脸对比得到人脸相似度及判断是否是同一个人,微信小程序检测人脸相似度(免费纯前端方案+调用第三方API接口方案)

微信小程序实现人脸识别对比,微信小程序人脸对比 人脸对比识别 人脸对比相似度,实现获取手机摄像头权限,调用相机拍照实现人脸识别相似度对比,小程序人脸相似度对比,快速识别两张照片的相似程度(用百分比)图片相似度对比在线测试,图片相似度对比,微信小程序人脸相似度对比分析,计算两张人脸的相似度,从而判断是否同一个人,并给出相似度评分。小程序如何实现人脸相似度比对,小程序纯前端怎么对比两张图片的相似度,计算两幅图像的相似度,图像相似度对比方法,调用百度AI的人脸识别,微信小程序中实现人脸识别认证,实现人脸检测、人脸

🏆 前端领域优质创作者 4863

在oracle直方图,oracle直方图

直方图原理总结:一)在oracle中使用直方图来表示数据的分布质量。它会按照某一列不同值出现的数量的多少,以及出现频率的高低来绘制数据的分布情况,以便能够指导优化器根据数据的分布做出正确的选择(是使用索引还是全表扫描)。二)如果where子句的过滤谓词的列上有一个合理的正确的直方图,它将会对优化器做出正确的选择发挥巨大的作用,使得sql语句执行成本最低从而提升性能。在获得准确的直方图信息后,基于成...

weixin_42520909的博客 683

把云端打印带回办公室:通信场景 SAP_COM_0466 打通 SAP BTP ABAP environment 与本地打印机的 Pull Integration 实战

摘要: 本文探讨云端SAP系统如何通过SAP_COM_0466通信场景实现与本地打印机的安全连接。核心方案采用Pull Integration模式,由本地组件(如SAP Cloud Print Manager或第三方OMS)主动从云端打印队列拉取任务,避免网络边界冲突。配置流程涵盖通信安排创建、打印队列绑定及权限管理,并强调队列类型必须选择"Pull Integration Queue"的关键细节。方案通过分离云端生产与本地打印环节,既保障安全性又便于运维监控,适用于SAP BTP AB

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 144

OpenCV-Python实战(1)——OpenCV简介与图像处理基础

OpenCV 是一个的跨平台计算机视觉库,可以运行在 Linux、Windows 和 Mac OS 操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时也提供了 Python 接口,实现了图像处理和计算机视觉方面的很多通用算法。在本文中,将介绍 OpenCV 库,包括它的主要模块和典型应用场景,同时使用 OpenCV-Python 实战讲解图像处理基础要点。

盼小辉丶的博客 27万+

oracle收集直方图,Oracle的直方图

直方图1、概述当某列数据分布不均衡,为了让CBO能生成最佳的执行计划,我们可能需要对表收集直方图,直方图最大的桶数(Bucket)是254。收集直方图是一个很耗时的过程,如无必要,千万别去收集直方图。OLTP系统中没有必要千万不要去收集直方图,因为OLTP一般会用绑定变量,但11g之前一直有绑定变量窥探的问题,导致收集的直方图没有作用;对于SELECT列不要去收集直方图 要对WHERE列使用直方图...

weixin_30628943的博客 1271

假人有限元模型

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

ORACLE的直方图的

一.何谓直方图: 直方图是一种统计学上的工具,并非管理对象的某个方面的质量情况进行管理,通常情况下它会表现为一种几何图形表,这个图形表是根据从实际环境中所收集来的被管理对象某个方面的质量分布情况的数据所绘制成的,通常会画成以数量为底边,以频度为高度的一系列连接起来的矩形图,因此直方图在统计学上也称为质量分布图。比如下图所示,是一个以关学生化学考试成绩分数分布情况绘制的直方图:   二.Ora

DBA的世界 3399

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

直方图;索引

之前一直以为收不收集直方图有两个条件: 1.有索引 2.列值分布不均匀 第二点毋庸置疑,实验下第一点: 实验环境 CREATE TABLE TEST AS SELECT * FROM DBA_OBJECTS; CREATE TABLE TEST2 AS SELECT * FROM DBA_OBJECTS; UPDATE TEST2 SET OBJECT_ID = 11111

wbaug20th的专栏 732

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Oracle 直方图

Oracle 直方图解析 一、何谓直方图 直方图是一种统计学上的工具,并非Oracle 专有。通常用于对被管理对象的某个方面 的质量情况进行管理,通常情况下它会表现为一种几何图形表,这个图形表是根据从实际环 境中所收集来的被管理对象某个方面的质量分布情况的数据所绘制成的,通常会画成以数量 为底边,以频度为高度的一系列连接起来的矩形图,因此直方图在统计学上也称为质量分布 图。 二、Or

Michael Shi 975

Oracle直方图实战:从原理到性能优化

本文深入解析Oracle直方图的核心原理与实战应用。直方图作为优化器的关键工具,通过揭示数据分布解决因数据倾斜导致的SQL性能问题。文章详细介绍了频率、高度平衡、混合及Top频率四种直方图类型,并通过实战案例演示了如何收集、解读直方图,以及如何避免常见使用误区,最终实现精准的基数估算与性能优化。

yy01234的博客 690

SQL优化必懂概念(三):直方图

本文介绍直方图的意义和作用。

weixin_42575078的博客 765

oracle 不使用索引深入解析

并行查询将不会用到索引(新版未确认)(两个索引merge也比较少发生,除非bitmap索引)不出现也可能用index skip scan。由于连接机制原因,外表的数据访问方式是全表扫描。

jnrjian的博客 809

oracle统计信息和直方图

表行数,使用的块数,空的块数,块的使用率,行迁移和链接的数量,pctfree,pctused的数据,行的平均大小。

小栗子的博客 1045
上一篇: 驱动类的名字
下一篇: mybatis第一个入门demo
weixin_33724659
博客等级 码龄11年 4169粉丝 1358原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值