关于去空格trim的优化

hanbb1982 2006-04-25 04:01:51
我有几个表,里面的数据都是比较多的,里面有一对相对应的字段
我用了以下的查询语句后,发现好慢,不知道有没有好的解决方法呢:
select a.id,a.name,b.no from a left outer join b on trim(a.name)=trim(b.name) where b.name like %'lyly'%
我靠,查一条语句用了150秒。客户怎么可能接受呢!如果没有用trim的话,他只要1秒多就查出来了。
...全文
712 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
aijian 2006-05-25
  • 打赏
  • 举报
回复
是Trim的问题吧,从数据库里读取数据的时候,获得的数据通常会包含空格和ASII码为0的字符char(0),Trim()只能截去字符串两边的空格,所以会比较慢一些吧,可以写一个TrimStr()函数增加去除char(0)的功能
Public Function TrimStr(ByVal Str As String)As String

If InStr(STr,Char(0))<=0 Then

TrimStr=Trim(Str)
Else

TrimStr=Trim(Left(Str,InStr(Str,Char(0))-1))
End If
End Function
sailorsailor 2006-05-25
  • 打赏
  • 举报
回复
如果已经是varchar 的 就先做 trim 处理
同时 like'lyly%' 是可以用到索引的
但是 like '%lyly%' 是要全表扫描的
hanbb1982 2006-04-26
  • 打赏
  • 举报
回复
是trim 占资源
rainbow_ayst 2006-04-26
  • 打赏
  • 举报
回复
插入时 在页面或后台就做trim处理
vanyard 2006-04-26
  • 打赏
  • 举报
回复
不妨试试这样:
select a.id,a.name,b.no from a left outer join b on rtrim(ltrim(a.name))=rtrim(ltrim(b.name)) where b.name like %'lyly'%
baggio785 2006-04-26
  • 打赏
  • 举报
回复
select a.id,a.name,b.no from a left outer join b on trim(a.name)=trim(b.name) where b.name like %'lyly'%

先确定trim(a.name)=trim(b.name),where b.name like %'lyly'%到底哪个耗资源,先去掉一个试试
如果是trim,建议你在insert时,就使用trim;
hanbb1982 2006-04-26
  • 打赏
  • 举报
回复
数据库中用的就是varchar2类型的呀。
xiaoxiao1984 2006-04-26
  • 打赏
  • 举报
回复
临时的解决办法就是建立函数索引
觉得真正解决的方式是把数据库中char类型的字符串除了必要的其他都转换成varchar2类型的字符串,避免在存入数据的时候存入太多的空格
xiaoxiao1984 2006-04-26
  • 打赏
  • 举报
回复
呵呵,%%可以转换成instr()啊,然后再建立一个instr()的函数索引就可以了
create index func_index_test3 on b( instr(name,'lyly',1) )
hanbb1982 2006-04-26
  • 打赏
  • 举报
回复
要知道在%%里用索引沒有用的啊.
xiaoxiao1984 2006-04-26
  • 打赏
  • 举报
回复
先对trim 建立函数索引,CBO(或者choose)方式下函数索引才会起作用,如果是基于RBO的可能不起作用
create index func_index_test1 on a( trim(name) )
create index func_index_test2 on b( trim(name) )
bugchen888 2006-04-26
  • 打赏
  • 举报
回复
插入的时候就先去掉空格。。。。
xiaosheng2008 2006-04-26
  • 打赏
  • 举报
回复
可以创建函数索引
eclipse_jhd 2006-04-25
  • 打赏
  • 举报
回复
搂上的用instr()效率要慢了多了哦!!
LCJ922 2006-04-25
  • 打赏
  • 举报
回复
select a.id,a.name,b.no from a left outer join b on trim(a.name)=trim(b.name) where instr(b.name ,'lyly',1)>0 会否快些!

hanbb1982 2006-04-25
  • 打赏
  • 举报
回复
怎么就没人告诉我了呢。
hanbb1982 2006-04-25
  • 打赏
  • 举报
回复
是不是trim和%%一块用的话会很慢呢?
hanbb1982 2006-04-25
  • 打赏
  • 举报
回复
那么该怎么解决呢?我是做模糊查询的。
goldarcher2005 2006-04-25
  • 打赏
  • 举报
回复
%'lyly'% 这样无法用到索引,会做全表扫描
hanbb1982 2006-04-25
  • 打赏
  • 举报
回复
或者去掉where条件也很快。很郁闷啊,各位大虾帮忙啊。

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧