`
liulanghan110
  • 浏览: 1076655 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

非操作符

DB2 
阅读更多



 网上有些地方说有关非的操作符不能利用索引,这些操作符有
!= <> !< !> NOT EXISTS NOT IN NOT LIKE 下面来测试一下 != <> !< !> NOT IN NOT EXISTS NOT LIKE 会在其他文章中详细说明)

测试版本为 DB2 v8.1.0.64 ( 查看 DB2 版本 db2level) DB2 v9.7

1. 测试选择性不强的情况。

先创建测试数据 :

create table student
(
   
id int primary key not null ,
   
sid   int
)

: 定义主键时系统自动创建索引,如果 DROP 表,关于这个表的所有索引也被删除,也包括系统创建的索引。

create procedure insertDate()
BEGIN
     DECLARE v_id int;
     set v_id = 0;
     while v_id < 100000
     DO
       insert into student values(v_id,v_id );
       set v_id = v_id + 1;
     end while;
END
;

-- 插入数据

         call insertDate ()

-- 创建索引

         CREATE INDEX STU_SID ON STUDENT
   
( SID    ASC
   
)
    PCTFREE
10
    ALLOW REVERSE SCANS
;

注意 : 在一个表的数据大量修改后,要运行下面的命令:

RUNSTATS ON TABLE NBADV. STUDENT FOR INDEX  NBADV. STU_SID   SHRLEVEL REFERENCE

runstats on table nbadv . student with distribution and detailed indexes all

:NBADV. STUDENT [ 模式名 ].[ 表名 ] NBADV. STU_SID [ 模式名 ].[ 表名 ]

测试语句 :

select sid from student where sid <> 1 (!= <> 一样,就不测试了 )

 

select sid from student where sid !< 1

 



  

select sid from student where sid !> 100001

  

 

 

上面的语句都只能排除 10W 分之一,可以看到都没有利用索引。

 

2. 测试选择性强的情况。

 

  将上面的测试数据执行下面的修改

update student set sid = 1 where sid > 100 or sid = 0

注意 : 在一个表的数据大量修改后,要运行下面的命令:

RUNSTATS ON TABLE NBADV. STUDENT FOR INDEX  NBADV. STU_SID   SHRLEVEL REFERENCE

 

测试语句 :

select sid from student where sid <> 1 (!= <> 一样,就不测试了 )

 



 

select sid from student where sid !< 2

 



 select
sid from student where sid > 1 or sid < 1

 



 可以发现上面三个语句都利用了索引,但是
<> 利用索引后效率并没有高出多少,而 !< 利用索引后效率很高。将
select sid from student where sid <> 1 转化为 select sid from student where sid > 1 or sid < 1 后效率也是很高。我是这么理解的, <> 时将索引列上所有数据一个个取出来判断,然后取出不等于 1 的数据,这样索引列上每一个数据都要被取出判断,所以,效率很低。但是 !< 时,首先找到所以列上数据 2 的位置,然后将 2 之后的数据都取出来,由于查找 2 的位置很快,而取出数据也只有 100 个,所以,速度会很快。而 <1 and

>1 会查找 1 的开始位置和结束位置,然后取出开始位置之前和结束位置之后的数据,由于查找数据位置很快,而取出数据 也只有 100 行,所以速度很快。

   

下面测试 not in

10 万行数据中只有 100 不等于 1 的数据时:

select sid from student where sid   not in  (1)



 

 

select sid from student where sid > 1

 



  

10 万行数据中只有 99999 不等于 1 的数据时:

select sid from student where sid   not in  (1)

select sid from student where sid > 1

执行计划一样,如图:

 

 



 可以看到当条件的筛选性不强时,
not in 和其他方式效率差不多,当数据筛选性很强时,就需要将 not in 转换成其他写法了。

 

总结 :

<> 虽和 not in 虽然能利用索引,但是利用索引后效率并不能改变多少,所以建议在数据筛选性很强时(满足条件的数据比较多),将 <> 转化为 < XX and >XX not in 也可以转化成别的。而 !< 或者 !> 可以利用索引,且索引利用后效率提升很多,不必转换。

 

 

 

  • 大小: 9.3 KB
  • 大小: 9.6 KB
  • 大小: 9.6 KB
  • 大小: 10.8 KB
  • 大小: 12.4 KB
  • 大小: 24.8 KB
  • 大小: 12.5 KB
  • 大小: 9.9 KB
  • 大小: 9.9 KB
分享到:
评论

相关推荐

    VHDL操作符详细列表

    * `XNOR` 异或非操作符,用于实现两个数字信号的逻辑异或非运算。 * `NOT` 非操作符,用于实现一个数字信号的逻辑非运算。 符号操作符 VHDL 语言提供了多种符号操作符,用于实现符号运算。这些操作符包括: * `+`...

    Swift视频教程:基本操作符系列 选并操作符

    `操作符,它是逻辑非操作符。它用于反转布尔值,`!true`将返回`false`,而`!false`将返回`true`。在编程中,这常用于否定一个条件,例如`if !expression`。 通过学习和掌握这些基本的选并操作符,Swift开发者可以更...

    C++关键字和操作符替代名

    39. **not**:逻辑非操作符。 40. **not_eq**:不等于操作符(!=)的替代名。 41. **nullptr**:空指针常量。 42. **operator**:用于重载操作符。 43. **or**:逻辑或操作符。 44. **or_eq**:按位或等于...

    C++操作符优先级表

    **逻辑非操作符** `!` - **描述**: 对操作数进行逻辑非运算。 - **示例**: ```cpp bool done = false; if (!done) { // 执行某操作 } ``` - **是否可重载**: 可重载。 - **结合性**: 右结合。 ##### 15. **...

    FPGA设计的操作符综述.pdf

    文章中提到的FPGA设计操作符包括:位非操作符“~”、按位与“&”、按位或“|”、按位异或“^”、逻辑非“!”、逻辑与“&&”、逻辑或“||”、缩位与“&”、缩位或“|”、缩位异或“^”、缩位与非“~&”、缩位或非“~|...

    C++ 操作符重载

    1. **非成员函数与成员函数**:操作符重载可以是类的成员函数或非成员函数(友元)。成员函数通常用于处理类的内部状态,而友元函数则能访问私有和保护成员,提供更大的灵活性。 2. **数量限制**:不是所有操作符都...

    操作符学习案例

    5. **位操作符**:对二进制位进行操作,如`&`(按位与)、`|`(按位或)、`^`(按位异或)和`~`(按位非)。例如: ```java int bitwiseResult = a & b; // 对a和b的二进制表示执行按位与 ``` 6. **增量和减量操作符...

    javascript 操作符(~、&、-、^、&lt;&lt;、&gt;&gt;)使用案例.docx

    按位非操作符 `~` 是一个一元操作符,用于对一个整数进行按位取反操作。该操作符将每个二进制位从 `0` 变为 `1` 或从 `1` 变为 `0`。 **示例代码**: ```javascript var num1 = 25; var num2 = ~num1; console.log...

    JavaScript 学习笔记之操作符

    其中按位非操作符会将操作数的二进制位进行取反操作;按位或操作符用于对两个操作数的每一位进行“或”运算;按位与操作符则用于对每一位进行“与”运算;按位异或会进行“异或”运算,即相同为0,不同为1;左移操作...

    【C语言】【逻辑非】双感叹号的用法(csdn)————程序.pdf

    C语言中的逻辑非操作符!(bang operator)是一种一元操作符,用于将非零值转换为零,零值转换为一。它的用法有多种,例如在if语句中判断条件、在赋值语句中取反操作等。 在C语言标准ISO/IEC 9899:201x中,对逻辑非...

    MATLAB 中的常用操作符

    在MATLAB这一强大的数学计算与可视化工具中,掌握其丰富的操作符系统对于高效地进行数据分析、算法开发以及科学计算至关重要。以下是对MATLAB中常见操作符的深入解析,旨在为用户提供一个全面的理解框架。 ### 算术...

    C++操作符详解

    逻辑操作符包括逻辑与(&&)、逻辑或(||)和逻辑非(!)。这些操作符用于组合条件表达式。例如,`a && b` 只有当a和b都为真时才为真,`a || b` 当a或b任一为真时即为真,`!a` 则表示a的否定。 五、位操作符 位操作符作用...

    第5节-操作符详解.pdf

    根据提供的文档信息,本章节主要围绕C语言中的操作符进行了详细的阐述。操作符在编程语言中扮演着极其重要的角色,因为它们是构建程序逻辑的基本工具之一。以下是对文档提到的各种操作符及其用法的深入解释。 ### ...

    Linq操作符27个常用说明.docx

    - **功能描述**:`Cast` 操作符用于将一个非泛型的 `IEnumerable` 集合转换为泛型的 `IEnumerable&lt;T&gt;` 集合。 - **应用场景**:当你需要将一个非泛型集合转换为泛型集合时,可以使用 `Cast`。 #### 22. OfType 操作...

    ZEMAX评价函数中操作符汇总

    - EFXL/EFLY: 控制X和Y平面上的有效焦距,尤其在非旋转对称系统中,这两个操作符可以调整中间镜组的焦距。 - POWR: 光焦度,衡量一个表面的聚焦能力,仅适用于标准表面。 - PIMH: 近轴像高,是近轴成像时像平面上...

    操作符重载详解

    1. **非成员函数重载**:操作符重载可以通过非成员函数实现,这种情况下,操作符函数需要一个隐含的`this`指针作为第一个参数。 2. **成员函数重载**:大多数情况下,我们会将操作符重载为类的成员函数,这使得我们...

    C++操作符重载专题

    3. **作为友元函数或非成员函数:**当操作符重载函数作为类的友元函数或非成员函数时,它需要显式地接收所有参与运算的对象作为参数。这种方式适用于那些需要访问私有成员的操作符,或者当其中一个操作数为内置类型...

    实验一MATLAB环境熟悉与基本运算.pdf

    * 逻辑非操作符 (~) * 逻辑异或操作符 (xor) 六、MATLAB 特殊运算符 MATLAB 特殊运算符: * 结构体访问操作符 (.) * 矩阵下标操作符 (:) * 单元数组操作符 ({}) * 注释操作符 (%) 七、MATLAB 数组操作函数 ...

    C++操作符重载手册

    1. **成员/非成员选择** 变量赋值操作符(如`+=`)应为成员函数,而返回新对象的操作符(如`+`)应为非成员函数,利用`+=`实现。 2. **类型转换** 非成员函数可以在左操作数上进行类型转换,如有需要应使用非成员...

Global site tag (gtag.js) - Google Analytics