Oracle中使用多个like查询的问题
表table的数据量非常大,其中有id和context两个字段,context是一串很长的字符串,长度为varchar2(4000),现在根据context的关键字“ap...
表table的数据量非常大,其中有id和context两个字段,context是一串很长的字符串,长度为varchar2(4000),现在根据context的关键字“apple”、“banana”来查询对应的id,但是又不能包含关键字“strawberry”。
问题一:如下两个SQL为什么效率相差很多?
SQL1:
SELECT b.id FROM table b WHERE (b.context LIKE '%apple%' OR b.context LIKE '%banana%') AND b.context NOT LIKE 'strawberry';
SQL2:
SELECT b.id FROM table b WHERE b.context LIKE '%apple%' OR b.context LIKE '%banana%' AND b.context NOT LIKE 'strawberry';
问题二:类似这种情形的,需要多个like查询的SQL有没有什么好的写法或者是需要注意的地方?
新人上路,恳请前辈大牛们不吝赐教,谢谢! 展开
问题一:如下两个SQL为什么效率相差很多?
SQL1:
SELECT b.id FROM table b WHERE (b.context LIKE '%apple%' OR b.context LIKE '%banana%') AND b.context NOT LIKE 'strawberry';
SQL2:
SELECT b.id FROM table b WHERE b.context LIKE '%apple%' OR b.context LIKE '%banana%' AND b.context NOT LIKE 'strawberry';
问题二:类似这种情形的,需要多个like查询的SQL有没有什么好的写法或者是需要注意的地方?
新人上路,恳请前辈大牛们不吝赐教,谢谢! 展开
3个回答
2018-03-06
展开全部
1、根据题意,SQL2应该不合符要求,另外SQL1和SQL2都没在strawberry加%。
SQL2: where 条件等价于:(b.context LIKE '%apple%') OR ( b.context LIKE '%banana%' AND b.context NOT LIKE 'strawberry')
语句效率应该相差不多,性能都不好,因为都要全表扫描且字符串都要从头到尾匹配。如果性能相差大,主要是你的语句最后1个LIKE 没用%,不要从头到尾匹配,这样可能SQL1更快。
2、类似对同一字段多次LIKE ,特别是比较耗时的,注意下数据的特点,尽量一次就过滤掉数据,如果是AND关系,数据不符合多的尽量放前面,如果是OR关系,数据符合多的尽量放前面。LIKE字符串尽量不要以%开头
SQL2: where 条件等价于:(b.context LIKE '%apple%') OR ( b.context LIKE '%banana%' AND b.context NOT LIKE 'strawberry')
语句效率应该相差不多,性能都不好,因为都要全表扫描且字符串都要从头到尾匹配。如果性能相差大,主要是你的语句最后1个LIKE 没用%,不要从头到尾匹配,这样可能SQL1更快。
2、类似对同一字段多次LIKE ,特别是比较耗时的,注意下数据的特点,尽量一次就过滤掉数据,如果是AND关系,数据不符合多的尽量放前面,如果是OR关系,数据符合多的尽量放前面。LIKE字符串尽量不要以%开头
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
sql2 的逻辑是错误的:
当数据中包含 apple,并且可能包含 strawberry也被选取出来了。
没有好的写法,涉及有like %xxx 的无法使用索引,所以效率无法提升。
当数据中包含 apple,并且可能包含 strawberry也被选取出来了。
没有好的写法,涉及有like %xxx 的无法使用索引,所以效率无法提升。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询