一个棘手的Oracle Hint相关的问题。

[复制链接]
查看11 | 回复5 | 2014-11-5 02:21:02 | 显示全部楼层 |阅读模式
SELECTcount(*)
FROM (

SELECT a.product_id

,a.member_id

,b.attr_value

FROMlance_temp3 a,

lance_temp2 b

WHEREa.product_id = b.product_id

) m
WHERE (LOWER(' '||m.ATTR_VALUE||' ') like '% oem %'
ORLOWER(' '||m.ATTR_VALUE||' ') like '% custom %';

上面是我的查询语句。lance_temp2表中数据量非常大,因此在进行like匹配的时候非常慢。
我为了减少时间,首先与lance_temp3表进行关联,再进行筛选。
可现在问题是,该语句的执行计划如下。由计划可以看出,仍然是先对lance_temp2进行筛选,再与lance_temp3表进行关联。
请问各位大侠,用什么样的hint,才能让它先关联,再筛选。
--------------------------------------------------------------------------------
---
| Id| Operation | Name| Rows| Bytes | Cost (%CPU)| Time
|
--------------------------------------------------------------------------------
---
| 0 | SELECT STATEMENT|
| 1 | 156 | 9(12)| 00:00:01 |
| 1 |SORT AGGREGATE |
| 1 | 156 |
||
|*2 | HASH JOIN |
| 1 | 156 | 9(12)| 00:00:01 |
|*3 |TABLE ACCESS FULL| LANCE_TEMP2 | 1 | 143 | 4 (0)| 00:00:01 |
|4 |TABLE ACCESS FULL| LANCE_TEMP3 | 9 | 117 | 4 (0)| 00:00:01 |
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("A"."PRODUCT_ID"="B"."PRODUCT_ID")
3 - filter(LOWER(' '||"B"."ATTR_VALUE"||' ') LIKE '% oem %' OR LOWER('

'||"B"."ATTR_VALUE"||' ') LIKE '% custom %' OR LOWER('
[ 本帖最后由 jannal13cn 于 2010-7-23 16:03 编辑 ]
回复

使用道具 举报

千问 | 2014-11-5 02:21:02 | 显示全部楼层
首先与lance_temp3表进行关联,再进行筛选 ???
那不更慢啊。。
优化下那sql啊
rows才1行,9行
是不是索引没分析或是没建?
[ 本帖最后由 jboracle1981 于 2010-7-23 16:42 编辑 ]
回复

使用道具 举报

千问 | 2014-11-5 02:21:02 | 显示全部楼层
因为我随手建个表测试的,就选了一行。
like操作的话,记录数越少,匹配时间越短啊
回复

使用道具 举报

千问 | 2014-11-5 02:21:02 | 显示全部楼层
斑竹正解
like '%XX%' 是走全表扫描
回复

使用道具 举报

千问 | 2014-11-5 02:21:02 | 显示全部楼层
如果是别的filter条件,比如大于、小于,先筛选再连接是比较合理的。
但是like的话,匹配时间 随着记录数线性增长啊。如果能先关联,再筛选就好了。
我现在的解决方案,是将关联结果生成临时表,再对临时表筛选。麻烦了点,但是时间还是省了不少的
回复

使用道具 举报

千问 | 2014-11-5 02:21:02 | 显示全部楼层
在内层的 SELECT 加个ROWNUM看看。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行