广告
返回顶部
首页 > 资讯 > 数据库 >如何进行null与index的分析
  • 544
分享到

如何进行null与index的分析

2024-04-02 19:04:59 544人浏览 薄情痞子
摘要

这期内容当中小编将会给大家带来有关如何进行null与index的分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 今天在测试过程中遇到一问

这期内容当中小编将会给大家带来有关如何进行null与index的分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

今天在测试过程中遇到一问题, sql该走Index的,没走. 加index hint也不行. 描述如下:

1. 建立测试表
create table t1
as
select object_id, object_name from dba_objects;



2. 在object_name列上建立b-tree index
create index idx_t1_name on t1(object_name);



3. 如果我是select object_name from t1, 按理说CBO应该会选择走Index scan. 但奇怪的是结果走的full table scan.
SQL> set autotrace trace exp
SQL> select object_name from t1;


Execution Plan
----------------------------------------------------------
Plan hash value: 3617692013


--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 50934 | 3282K| 57 (2)| 00:00:01 |
| 1 | TABLE ACCESS FULL| T1 | 50934 | 3282K| 57 (2)| 00:00:01 |
--------------------------------------------------------------------------


Note
-----
- dynamic sampling used for this statement


[@more@]
3. 使用index hint想强行走Index, 结果还是full table scan. 我就奇怪了. hint咋个不起做用呢? 郁闷.
SQL> select object_name from t1;


Execution Plan
----------------------------------------------------------
Plan hash value: 3617692013


--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 50934 | 3282K| 57 (2)| 00:00:01 |
| 1 | TABLE ACCESS FULL| T1 | 50934 | 3282K| 57 (2)| 00:00:01 |
--------------------------------------------------------------------------


Note
-----
- dynamic sampling used for this statement




4. 偶然看了下表结构
SQL> desc t1
Name Null? Type
----------------------------------------- -------- ----------------------------
OBJECT_ID NUMBER
OBJECT_NAME VARCHAR2(128)




NULL列引起我的注意. OBJECT_NAME可以为null !! 而在oracle中单个列上建b-tree Index, null是不会存进Index的( 复合索引可以, 只要整个Index columns不为null ). 那就是说如果有些行的object_name是null, 那走Index取值不是会丢掉object_name为null的行. 那如果我让object_name not null 呢?


SQL> alter table t1 modify object_name not null;


Table altered.


SQL> desc t1
Name Null? Type
----------------------------------------- -------- ----------------------------
OBJECT_ID NUMBER
OBJECT_NAME NOT NULL VARCHAR2(128)




再试一试
SQL> select object_name from t1;


Execution Plan
----------------------------------------------------------
Plan hash value: 3617692013


--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 50934 | 3282K| 57 (2)| 00:00:01 |
| 1 | TABLE ACCESS FULL| T1 | 50934 | 3282K| 57 (2)| 00:00:01 |
--------------------------------------------------------------------------


结果还是full table scan : (


试试用hint
SQL> select object_name from t1;


Execution Plan
---------------------------------------------------------- 
Plan hash value: 1352742509 


--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 50934 | 3282K| 264 (1)| 00:00:04 |
| 1 | INDEX FULL SCAN | IDX_T1_NAME | 50934 | 3282K| 264 (1)| 00:00:04 |




这回hint 起作用了. 这说明并不是Hint失效, 只是满足走Index的条件一开始没有具备. 看来null是个潜在杀手, 得小心防范. 
现在强走index是ok了. 但, 是什么东西会影响CBO的判断不走Index呢? 想到统计信息可能会是原因之一, 于是查看了一下.


SQL> select index_name, LAST_ANALYZED from user_indexes;
INDEX_NAME LAST_ANALYZED 
------------------------------------------------------------------------------------------ --------------- 
IDX_T1_NAME 01-MAR-18




SQL> select table_name, LAST_ANALYZED from user_tables;


TABLE_NAME LAST_ANALYZED 
------------------------------------------------------------------------------------------ --------------- 
T1




看到刚建的表没有做过统计. 于是 Go to analyze table, 结果如下:


SQL> exec dbms_stats.gather_table_stats('TEST','T1');


PL/SQL procedure successfully completed.


SQL> select table_name, LAST_ANALYZED from user_tables;


TABLE_NAME LAST_ANALYZED 
------------------------------------------------------------------------------------------ --------------- 
T1 01-MAR-18




再来看看执行结果有没有变化:
SQL> select object_name from t1;


Execution Plan
---------------------------------------------------------- 
Plan hash value: 222950081




------------------------------------------------------------------------------------ 
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | 
------------------------------------------------------------------------------------ 
| 0 | SELECT STATEMENT | | 49917 | 1218K| 57 (2)| 00:00:01 | 
| 1 | INDEX FAST FULL SCAN| IDX_T1_NAME | 49917 | 1218K| 57 (2)| 00:00:01 | 
------------------------------------------------------------------------------------


这下终于走Index这条路老 : ) 在Index 中, key value是排序存放的. Index Fast full scan 它是按照block的存储顺序来读取数据, 并可以一次I/O多块读取提高效率( 参数 readdb_file_multiblock_read_count), 但返回的值是没有排序的. 而
Index full scan会按照Key value顺序读取值, 返回排了序的结果. 所以, 做个order by会是走Index full scan.


SQL> select object_name from t1 order by object_name;


Execution Plan
---------------------------------------------------------- 
Plan hash value: 1352742509

-------------------------------------------------------------------------------- 
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | 
-------------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT | | 49917 | 1218K| 249 (1)| 00:00:03 | 
| 1 | INDEX FULL SCAN | IDX_T1_NAME | 49917 | 1218K| 249 (1)| 00:00:03 | 
--------------------------------------------------------------------------------

对于定义为NULL的列,创建位图索引可走索引

上述就是小编为大家分享的如何进行null与index的分析了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网数据库频道。

您可能感兴趣的文档:

--结束END--

本文标题: 如何进行null与index的分析

本文链接: https://www.lsjlt.com/news/68331.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何进行null与index的分析
    这期内容当中小编将会给大家带来有关如何进行null与index的分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 今天在测试过程中遇到一问...
    99+
    2022-10-19
  • 如何进行HttpHandler与HttpModule的分析与应用
    这篇文章将为大家详细讲解有关如何进行HttpHandler与HttpModule的分析与应用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。神秘的HttpHandler与HttpModule大...
    99+
    2023-06-17
  • 如何用Python进行回归分析与相关分析
    目录一、前言1.1 回归分析1.2 相关分析二、代码的编写2.1 前期准备2.2 编写代码2.2.1 相关分析 2.2.2 一元线性回归分析 2.2.3 多元线性...
    99+
    2023-03-22
    python python回归分析 python相关分析
  • 如何进行系统分析与设计
    概述首先,系统是什么?根据《系统架构》一书的定义,系统是由一组实体和这些实体之间的关系所构成的集合,其功能要大于这些实体各自的功能之和。对于我们的场景,系统可能是 App、Web 应用、服务、批处理程序等,也可能是包括所有这些的一个大系统。...
    99+
    2023-06-05
  • 如何进行VS2005软件的理解与分析
    如何进行VS2005软件的理解与分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。看来是WebDeployment本身有一定的bug,笔者猜想可能是编码问题造成的,WebDep...
    99+
    2023-06-17
  • 如何进行Zookeeper分析与集群搭建
    本篇文章为大家展示了如何进行Zookeeper分析与集群搭建,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Zookeeper简介Zookeeper是一个高效的分布式协调服务,可以提供配置信息管理、命...
    99+
    2023-06-02
  • 如何进行malloc/free与new/delete的对比分析
    今天给大家介绍一下如何进行malloc/free与new/delete的对比分析。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。相同点:都可用于申请动态内存和释...
    99+
    2023-06-17
  • 如何进行asmcmd的分析
    如何进行asmcmd的分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在ASM实例中,所有的存储于ASM磁盘组中的文件对于操作系统命令而言是...
    99+
    2022-10-19
  • 如何进行Request的分析
    如何进行Request的分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。介绍Request类是一个http请求的类,对于爬虫而言是一个很重要的类。通常在Spider中创建这样...
    99+
    2023-06-17
  • 如何进行abstract的分析
    这篇文章将为大家详细讲解有关如何进行abstract的分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。抽象类: abstract抽象:不具体,看不明白。抽象类表象体现。在不断抽取过程中,将...
    99+
    2023-06-02
  • 如何进行JDBC的分析
    这篇文章给大家介绍如何进行JDBC的分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1. 数据库编程的基础条件如果你想实现代码操作数据库,那么以下条件是你实现它的前提编程语言:例如 Java、C++、Python 等...
    99+
    2023-06-22
  • 如何进行MV-Sketch的分析
    如何进行MV-Sketch的分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。网络测量是对网络行为进行特征化、对各项指标进行量化并充分理解与正确认识互联网的最基本手段,支持...
    99+
    2023-06-03
  • 如何进行SAP CPI的分析
    本篇文章为大家展示了如何进行SAP CPI的分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。最近Jerry由于项目需要,又得学习一个新工具:SAP Cloud Platform Integrati...
    99+
    2023-06-04
  • 如何对Oracle的index 的block进行dump
    如何对index 的block进行dump-oracle1,新建一个表testSYS@127.0.0.1:1521/oracle12cpdb> create table test as selec&#...
    99+
    2022-10-18
  • 如何进行Unix与Linux操作系统差异的分析
    这篇文章给大家介绍如何进行Unix与Linux操作系统差异的分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Unix与Linux操作系统是同一个操作系统吗是,也不是。或许这个答案有自相矛盾的地方,但是却是一个比较合理...
    99+
    2023-06-17
  • 如何进行Java中对HashMap的深度分析与比较
    如何进行Java中对HashMap的深度分析与比较,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在Java的世界里,无论类还是各种数据,其结构的处理是整个程序的逻辑以及性能...
    99+
    2023-06-03
  • PHP中如何进行轨迹分析和行业分析?
    PHP语言是一种广泛应用于网络开发的编程语言。它具有易学易用、支持多种数据库的优势,也因此被广泛应用于不同领域的开发。在需要进行轨迹分析和行业分析的场景下,PHP也能提供丰富的工具和方法。一、轨迹分析轨迹分析主要是针对用户在网站上的行为轨迹...
    99+
    2023-05-21
    PHP 行业分析 轨迹分析
  • 如何进行Django Celery分析
    本篇文章为大家展示了如何进行Django Celery分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。对于任务调度的实现方案,其实开源的项目有很多。我先说说对于任务调度的认识,如果从数据库层面来说...
    99+
    2023-06-04
  • 如何进行网站分析
    这篇文章给大家分享的是有关如何进行网站分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。  一、网站分析应从哪里开始  一个完整的网站分析应用过程是这样的: 分析目标 → 插码 &rar...
    99+
    2023-06-10
  • Mysql的Procedure参数如何为NULL问题分析
    本篇文章给大家分享的是有关Mysql的Procedure参数如何为NULL问题分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 最近写过程...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作