假设 mytable 是一个Oracle表,它有一个名为 id 的字段。 id 的数据类型为NUMBER(8)。比较以下查询:
select * from mytable where id like '715%'
和
select * from mytable where id between 71500000 and 71599999
我认为第二个更有效率,因为我认为“数字比较”需要的数量少于汇总语言指令而不是“字符串比较”。我需要确认或更正。请确认/更正并抛出与任一运营商相关的任何进一步评论。
更新:我忘了提及一条重要信息。在这种情况下, id 必须是8位数字。
答案 0 :(得分:7)
似乎第二个查询的执行计划更有效。
第一个查询是对id进行全表扫描,而第二个查询不是。
我的测试数据:
第一次查询的执行计划:
第二次查询的执行计划:
答案 1 :(得分:7)
如果您只想要71500000和71599999之间的值,那么第二个更有效率。第一个也将返回7150-7159,71500-71599等之间的值,依此类推。您可能需要筛选不必要的结果,或者编写另外几行代码来过滤掉其余部分。对于您似乎想要做的事情,第二种选择肯定更有效。
答案 2 :(得分:1)
我不喜欢将LIKE与数字列一起使用的想法。 此外,它可能无法提供您正在寻找的结果。 如果您的值为715000000,则它将显示在查询结果中,即使它大于71599999。
另外,我原则上不喜欢。 如果事物介于两个其他事物之间,则不应包括其他两个事物。但这只是个人的烦恼。 我更喜欢使用> =和< =这样可以避免在阅读查询时出现混淆。此外,有时我必须将查询更改为类似> = a和< C。如果我开始使用between运算符,当我不想包容时,我将不得不重写它。
HARV
答案 3 :(得分:0)
除了提出的其他要点之外,以你建议的方式使用LIKE会导致Oracle不使用ID列上的任何索引,因为数据从数字隐式转换为字符,从而导致全表扫描使用BETWEEN时使用LIKE vs.和索引范围扫描。当然,假设你有一个ID索引。但是,即使您不这样做,Oracle也必须对它在LIKE情况下扫描的每个值进行类型转换,而在另一个情况下则不必这样做。
答案 4 :(得分:0)
你可以使用数学函数,否则你必须使用to_char函数来使用,但它会导致性能问题。
从mytable中选择*,其中floor(id / 100000)= 715 要么 select * from mytable where floor(id / 100000)= TO_NUMBER('715')//这是参数