- 浏览: 1076897 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
flyfeifei66:
list<bean> bean 中有 list&l ...
freemarker中的list -
BelloVersion:
第五种错误Remote host closed connect ...
客户端如何使用httpclient向https服务器发送数据 -
willxue:
看了半天 前面说的是错的?。。。
反向键索引的原理和用途 -
liulanghan110:
quainter 写道麻烦博主,参数为数组时,paramete ...
MYBATIS 的parameter -
quainter:
麻烦博主,参数为数组时,parameterType怎么写啊?
MYBATIS 的parameter
网上有些地方说有关非的操作符不能利用索引,这些操作符有
!=
、
<>
、
!<
、
!>
、
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 也可以转化成别的。而 !< 或者 !> 可以利用索引,且索引利用后效率提升很多,不必转换。
发表评论
-
MySQL创建用户与授权
2015-12-08 19:19 1318一, 创建用户: 命令:CREATE USE ... -
数据库的拆分
2014-07-24 17:07 1120http://blog.csdn.net/bluishgl ... -
数据库事务隔离级别
2014-07-24 16:09 1048转自:http://singo107.iteye.com/b ... -
聚集索引和非聚集索引
2013-07-23 15:53 1865聚集索引和非聚集索引 聚集索引:表的物理存储按照 ... -
索引介绍
2013-07-23 14:39 1110按逻辑上来分: ... -
分区索引
2013-07-23 10:47 1254分区索引分为本地(loca ... -
反向键索引的原理和用途
2013-07-22 20:00 7295我们知道Oracle会自动为表的主键列建立索引,这个默认的 ... -
B树索引、位图索引和散列索引
2013-07-19 17:44 29824索引在数据结构上可以分为三种B树索引、位图索引和散列索引 ... -
SQLPLUS相关命令
2013-07-17 17:55 1121登录 sqlplus test/test123@MyD ... -
oracle trace文件查看
2013-07-17 17:51 1315CALL:每次SQL语句的处理都分成三个部分Parse:这步将 ... -
not in和not exists的区别
2013-05-27 13:59 2605先创建测试数据: create table test ... -
Latch (转)
2013-05-24 15:33 2500一. Latch 说明 1.1 Latc ... -
深度分析数据库的热点块问题(转)
2013-05-24 14:13 1441热点块的定义 ... -
join 条件在on和where 后的区别
2013-05-22 16:53 1276首先建两个表来测试下。 create table a( ... -
如何设计索引
2013-05-21 16:06 1632一个表建多少索引合适 ... -
重建索引
2013-05-20 23:30 1404关于索引重建,只需要记住一条: 如果它没坏,就不要 ... -
B+树索引
2013-05-20 16:10 147111.索引结构 1.1 B+树 ... -
ORACLE 循环
2012-10-12 18:39 12061、 Exit When 循环: ... -
高水位线
2012-10-08 16:38 1127所有的 oracle 段都有一个在段内容纳数据的上限 ... -
ORACLE直方图(转)
2012-10-08 13:42 1136一. 何谓直方图: ...
相关推荐
* `XNOR` 异或非操作符,用于实现两个数字信号的逻辑异或非运算。 * `NOT` 非操作符,用于实现一个数字信号的逻辑非运算。 符号操作符 VHDL 语言提供了多种符号操作符,用于实现符号运算。这些操作符包括: * `+`...
`操作符,它是逻辑非操作符。它用于反转布尔值,`!true`将返回`false`,而`!false`将返回`true`。在编程中,这常用于否定一个条件,例如`if !expression`。 通过学习和掌握这些基本的选并操作符,Swift开发者可以更...
39. **not**:逻辑非操作符。 40. **not_eq**:不等于操作符(!=)的替代名。 41. **nullptr**:空指针常量。 42. **operator**:用于重载操作符。 43. **or**:逻辑或操作符。 44. **or_eq**:按位或等于...
**逻辑非操作符** `!` - **描述**: 对操作数进行逻辑非运算。 - **示例**: ```cpp bool done = false; if (!done) { // 执行某操作 } ``` - **是否可重载**: 可重载。 - **结合性**: 右结合。 ##### 15. **...
文章中提到的FPGA设计操作符包括:位非操作符“~”、按位与“&”、按位或“|”、按位异或“^”、逻辑非“!”、逻辑与“&&”、逻辑或“||”、缩位与“&”、缩位或“|”、缩位异或“^”、缩位与非“~&”、缩位或非“~|...
1. **非成员函数与成员函数**:操作符重载可以是类的成员函数或非成员函数(友元)。成员函数通常用于处理类的内部状态,而友元函数则能访问私有和保护成员,提供更大的灵活性。 2. **数量限制**:不是所有操作符都...
5. **位操作符**:对二进制位进行操作,如`&`(按位与)、`|`(按位或)、`^`(按位异或)和`~`(按位非)。例如: ```java int bitwiseResult = a & b; // 对a和b的二进制表示执行按位与 ``` 6. **增量和减量操作符...
按位非操作符 `~` 是一个一元操作符,用于对一个整数进行按位取反操作。该操作符将每个二进制位从 `0` 变为 `1` 或从 `1` 变为 `0`。 **示例代码**: ```javascript var num1 = 25; var num2 = ~num1; console.log...
其中按位非操作符会将操作数的二进制位进行取反操作;按位或操作符用于对两个操作数的每一位进行“或”运算;按位与操作符则用于对每一位进行“与”运算;按位异或会进行“异或”运算,即相同为0,不同为1;左移操作...
C语言中的逻辑非操作符!(bang operator)是一种一元操作符,用于将非零值转换为零,零值转换为一。它的用法有多种,例如在if语句中判断条件、在赋值语句中取反操作等。 在C语言标准ISO/IEC 9899:201x中,对逻辑非...
在MATLAB这一强大的数学计算与可视化工具中,掌握其丰富的操作符系统对于高效地进行数据分析、算法开发以及科学计算至关重要。以下是对MATLAB中常见操作符的深入解析,旨在为用户提供一个全面的理解框架。 ### 算术...
逻辑操作符包括逻辑与(&&)、逻辑或(||)和逻辑非(!)。这些操作符用于组合条件表达式。例如,`a && b` 只有当a和b都为真时才为真,`a || b` 当a或b任一为真时即为真,`!a` 则表示a的否定。 五、位操作符 位操作符作用...
根据提供的文档信息,本章节主要围绕C语言中的操作符进行了详细的阐述。操作符在编程语言中扮演着极其重要的角色,因为它们是构建程序逻辑的基本工具之一。以下是对文档提到的各种操作符及其用法的深入解释。 ### ...
- **功能描述**:`Cast` 操作符用于将一个非泛型的 `IEnumerable` 集合转换为泛型的 `IEnumerable<T>` 集合。 - **应用场景**:当你需要将一个非泛型集合转换为泛型集合时,可以使用 `Cast`。 #### 22. OfType 操作...
- EFXL/EFLY: 控制X和Y平面上的有效焦距,尤其在非旋转对称系统中,这两个操作符可以调整中间镜组的焦距。 - POWR: 光焦度,衡量一个表面的聚焦能力,仅适用于标准表面。 - PIMH: 近轴像高,是近轴成像时像平面上...
1. **非成员函数重载**:操作符重载可以通过非成员函数实现,这种情况下,操作符函数需要一个隐含的`this`指针作为第一个参数。 2. **成员函数重载**:大多数情况下,我们会将操作符重载为类的成员函数,这使得我们...
3. **作为友元函数或非成员函数:**当操作符重载函数作为类的友元函数或非成员函数时,它需要显式地接收所有参与运算的对象作为参数。这种方式适用于那些需要访问私有成员的操作符,或者当其中一个操作数为内置类型...
* 逻辑非操作符 (~) * 逻辑异或操作符 (xor) 六、MATLAB 特殊运算符 MATLAB 特殊运算符: * 结构体访问操作符 (.) * 矩阵下标操作符 (:) * 单元数组操作符 ({}) * 注释操作符 (%) 七、MATLAB 数组操作函数 ...
1. **成员/非成员选择** 变量赋值操作符(如`+=`)应为成员函数,而返回新对象的操作符(如`+`)应为非成员函数,利用`+=`实现。 2. **类型转换** 非成员函数可以在左操作数上进行类型转换,如有需要应使用非成员...