对于Oracle NUMBER数据类型,LIKE运算符与BETWEEN..AND运算符

Kev*_*nle 0 sql oracle

假设mytable是一个Oracle表,它有一个名为id的字段.id的数据类型是NUMBER(8).比较以下查询:

select * from mytable where id like '715%'
Run Code Online (Sandbox Code Playgroud)

select * from mytable where id between 71500000 and 71599999
Run Code Online (Sandbox Code Playgroud)

我认为第二个更有效,因为我认为"数字比较"需要的数量少于汇总语言指令而不是"字符串比较".我需要确认或更正.请确认/更正并抛出与任一运营商相关的任何进一步评论.

更新:我忘了提及一条重要的信息. 在这种情况下,id必须是一个8位数字.

Sha*_*awn 7

看起来第二个查询的执行计划更有效.

第一个查询是对id进行全表扫描,而第二个查询则不是.

我的测试数据:

第一次查询的执行计划:

在此输入图像描述

第二次查询的执行计划:

在此输入图像描述

  • 在封面下,不同之处在于第一个查询必须在评估`LIKE`条件之前将每个`id`值从一个数字隐式转换为一个字符串.这使得索引无法使用.如果列未编入索引,则两个版本都可能使用全表扫描,但第一个版本仍会增加每行的类型转换开销. (2认同)

Spa*_*ags 7

如果您只想要71500000和71599999之间的值,那么第二个更有效.第一个也将返回7150-7159,71500-71599等之间的值,依此类推.您可能需要筛选不必要的结果,或者编写另外几行代码来过滤掉其余部分.对于您似乎想要做的事情,第二种选择肯定更有效.