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;
不妨试试这样: 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'%
先对trim 建立函数索引,CBO(或者choose)方式下函数索引才会起作用,如果是基于RBO的可能不起作用 create index func_index_test1 on a( trim(name) ) create index func_index_test2 on b( trim(name) )
呵呵,%%可以转换成instr()啊,然后再建立一个instr()的函数索引就可以了 create index func_index_test3 on b( instr(name,'lyly',1) )
插入时 在页面或后台就做trim处理
如果已经是varchar 的 就先做 trim 处理 同时 like'lyly%' 是可以用到索引的 但是 like '%lyly%' 是要全表扫描的
是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
觉得真正解决的方式是把数据库中char类型的字符串除了必要的其他都转换成varchar2类型的字符串,避免在存入数据的时候存入太多的空格
如果是trim,建议你在insert时,就使用trim;
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'%
create index func_index_test1 on a( trim(name) )
create index func_index_test2 on b( trim(name) )
create index func_index_test3 on b( instr(name,'lyly',1) )
同时 like'lyly%' 是可以用到索引的
但是 like '%lyly%' 是要全表扫描的
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