这样的oracle 表怎么查询快? [身份证]字段 15 位和 18 位问题(100分)

  • 主题发起人 主题发起人 wsn
  • 开始时间 开始时间
W

wsn

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在有个表大概100多万条数据,有个字段id是存放身份证,已经为其建立索引,开始时
候都是18位的,有些人他自己的身份证还没有去更新,但是数据库里的身份证字段值
就已经按照算法为其调整到18位了,后来由于种种原因,这个字段里又混进了许多15位
的值,这样查询的时候要求 输入15位或18位都能找到相应的记录。
如果查询时候输入的条件和表里的值相符的话,那查询速度很快,但是若需要调整位数
比如 把18位的年份“19”和最末尾的校验位去掉在和数据库里的字段截取成15位长度以后的
值相比较就很慢,这个时候是用两个substr函数连一块的,又变成了全表扫描,速度实在不能忍受。
因为现实中身份证存在大量的重号现象,
因此我现在的做法只是把输入的值和字段里的值做 18位到15的转换 再比较。不知道各位在遇到类似问题的时候
是如何处理的。
另外,分配给我的操作权限太小,连BDA SUDIO都打不开,只能在plus里做select,我估计不会允许去改动里面的结构。

请指点迷津。 ( B/S , asp )
 
同志哥,转一个弯吗! 我们假设你单独查询一个18或15位字段时间是1秒
用两个substr函数组合查询的时间是100秒, 你不会进行两次搜索吗?
一次搜索15位的,一次搜索18位的, 总时间=2秒
 
既然按照18位设计的,那么新程序进来的身份证都是18位吧
写个小程序把数据库中的15位的全部改为18位。
这样查询的时候,即使输入15位也可以先把他转换成18位,在查询速度上应该不是问题吧
 
fatbug说得好。
 
15218 18215 你应该都能搞定了吧?

最好的办法,是统一库里的都到18位,做一个标志,目前此人登记的是多少位,写个小程序不难的说。

那么就容易了,输入的时候,把查询关键字转换成15和18两个变量,然后,还要我说?
SELECT * FROM yourTable WHERE id=s15 or id=s18 Ok了嘛
当然,估计速度下降不多的
 
我也建议你查两次,就是用 or 关联
 
15位的身份证后补三个字母不就可以了!
 
我同CJ的想法一样,你的程序中发现身份证号是15位的,
就自动转换一个18码来,同15位码一起来查。

SELECT * FROM yourTable WHERE id IN (s15, s18)
 
不知道你的身份证号码数据的前6位即地区编码是否比较分散,还是集中在一个地区,
如果比较分散,那么一个简单的查询优化就能提高不少速度了。
select * from idtable where id like '342223%' and id = '3422237683932'(这里或者是你截取id的条件表达式)
当然,你必须在sql plus里面检查这个查询的执行计划是否用到了你在id字段上定义的
索引,或者你可以调整查询条件的顺序,使oracle在查询时用到该索引。当然还有最简单
的方法,强制查询时对该条件使用索引。

其实,我在想,你检查一下你的查询的执行计划,应该可以分析出不少东西的。

另外,可否写成如下形式?

假设输入条件为15位id,123456789012345,
select * from idtable where id like '123456%' and (id='123456789012345' or id like '123456??789012345?')
 
谢谢大家 :)
恩,身份字段大多是江苏省内的,但也包含少量外地的,
现在先进行两次查找,十一之后再和对方商量一下增加一个统一到18位的字段
 
后退
顶部