`
pedestrian_I
  • 浏览: 52882 次
  • 性别: Icon_minigender_1
  • 来自: 香港
社区版块
存档分类
最新评论

sql里做字符串的最佳匹配

阅读更多
之前有个项目要求做最佳匹配,要求如下
输入:字符串 比如31810484
输出:表Test中A字段与31810484最佳匹配的记录

最佳匹配的概念:
比如31810484,如果数据库里有
318
3181
31810
318104
3181048
那么应该选择与31810484最匹配的3181048做为输出

Step 1. 程序处理
接到这个需求之后,马上想到的是在程序里做比较,首先查询出所有的记录,然后拿目标串去匹配,匹配算法想的很简单.
1. 首先将数据库查询出的所有记录放在一个resultSet里面
2. 以某记录R的串长度(N)截取目标串前N位,如果截取后的串等于记录串R
3. 如果下一条匹配上的记录串比上一次的匹配记录串更长,则更新,一直找到最长匹配的那个为止.

这个代码写出来之后,逻辑上是OK的,后来代码检查时,发现这个效率实在是太低了,如果数据量小,OK. 如果数据量达到上千上万,效率就十分差了.

Step 2. 数据库处理
接着想,这个是数据库层面的事,应该由数据库来处理,于是花了一段时间去想写一个sql来处理这个需求,因数据库是oracle,我在这里写oracle版本

select * from (select * from Test where '31810484' like (A || '%') group by length(A) desc) where rownum <=1

这个sql能准确定位到最佳匹配.但是用了函数做为条件,效率也并不高.

Step 3. 加索引
给函数加索引,既是function base index.
于是加上了此索引
create index IDX_A_TEST ON Test (A || '%');
但是执行sql,发现还是很慢.
执行explain plan,发现此时还是全表扫描.
上网搜索才发现,原来需要设置些参数函数索引才会生效
ALTER SYSTEM SET QUERY_REWRITE_ENABLED=TRUE;
alter system set query_rewrite_integrity=trusted;
alter system set optimizer_mode=first_rows;
加上之后,速度提升了3-4倍,但是还是有点慢,还需要提高,继续跟进...
分享到:
评论

相关推荐

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    varchar2 1~4000字节 可变长度字符串,与CHAR类型相比,使用VARCHAR2可以节省磁盘空间,但查询效率没有char类型高 数值类型 Number(m,n) m(1~38) n(-84~127) 可以存储正数、负数、零、定点数和精度为38位的浮点数...

    .net数据访问类 SQL Helper 类

    注意: 用作参数集的键的连接字符串通过简单的字符串比较进行匹配。用于从 GetCachedParameterSet 中检索参数的连接字符串必须与用来通过 CacheParameterSet 来存储这些参数的连接字符串完全相同。语法不同的连接...

    最小巧的数据库管理工具,联系Linq语句的最佳工具,小巧方便,功能强大!

    LINQPad提供了多种执行...这也意味着对于要进行简单测试的任何简短代码,LINQPad非常有用,例如:棘手的数字格式字符串或者匹配正则表达式。该软件为最新破解注册版,带有完整的智能提示功能,免费版是没有智能提示的。

    SQLHelper.cs

    注意: 用作参数集的键的连接字符串通过简单的字符串比较进行匹配。用于从 GetCachedParameterSet 中检索参数的连接字符串必须与用来通过 CacheParameterSet 来存储这些参数的连接字符串完全相同。语法不同的连接...

    聊天机器人-ChatterBot初试.pdf

    通过ChatBot实例化⼀个聊天机器⼈,第⼀参数是聊天机器⼈的名字,storage_adapter指定存储适配器为SQL⽅式,logic_adapters指定 逻辑适配器为最佳匹配⽅式,默认回复为"嗯"。 trainer=ListTrainer(bot)将以List集合...

    CLR.via.C#.(中文第3版)(自制详细书签)Part1

    · 高效使用特定的CLR类型——委托、枚举、定制attribute、数组和字符串 · 理解垃圾回收器是如何管理内存资源的 · 使用线程池、任务、取消、计时器和异步I/O操作来设计响应性强、稳定性高和伸缩性大的解决方案 · ...

    CLR.via.C#.(中文第3版)(自制详细书签)

    · 高效使用特定的CLR类型——委托、枚举、定制attribute、数组和字符串 · 理解垃圾回收器是如何管理内存资源的 · 使用线程池、任务、取消、计时器和异步I/O操作来设计响应性强、稳定性高和伸缩性大的解决方案 ...

    CLR.via.C#.(中文第3版)(自制详细书签)Part3

    · 高效使用特定的CLR类型——委托、枚举、定制attribute、数组和字符串 · 理解垃圾回收器是如何管理内存资源的 · 使用线程池、任务、取消、计时器和异步I/O操作来设计响应性强、稳定性高和伸缩性大的解决方案 · ...

    CLR.via.C#.(中文第3版)(自制详细书签)Part2

    · 高效使用特定的CLR类型——委托、枚举、定制attribute、数组和字符串 · 理解垃圾回收器是如何管理内存资源的 · 使用线程池、任务、取消、计时器和异步I/O操作来设计响应性强、稳定性高和伸缩性大的解决方案 · ...

    dataquest_projects

    grep MapReduce算法的实现,该算法在给定文件夹中的所有文件中查找给定字符串的所有匹配项。 调查Fandango电影评分 使用Pandas,Numpy和Matplotlib分析电影收视率数据,以确定Fandango的收视率系统是否发生任何变化...

    Oracle9i的init.ora参数中文说明

    说明: 指定一个字符串值, 设置 TIME 数据类型的默认值, 该数据类型包含 HOUR, MINUTE 和 SECOND 这几个日期时间字段。 语法: TIME '09:26:50' (将值存储为 7 个字节)。 默认值: 从 NLS_TERRITORY 中获得 nls_time...

    MySQL学习笔记(2)——索引

    文章目录索引简介是什么:目的:缺点:索引...字符串不加引号索引失效10.用or关键词会使得索引失效 索引简介 是什么: 帮助MySQL高效获取数据的数据结构(B树结构) 目的: 1、提高查询效率 2、为字段排序 缺点: 降低了i

    asp.net知识库

    .NET 2.0中的字符串比较 小试ASP.NET 2.0的兼容性 为 asp.net 2.0 的菜单控件增加 target 属性 ASP.NET 2.0 的内部变化 常见的 ASP.NET 2.0 转换问题和解决方案 Asp.Net2.0无刷新客户端回调 体验.net 2.0 的优雅(1...

Global site tag (gtag.js) - Google Analytics