SELECT count(*)
FROM (
SELECT a.product_id
,a.member_id
,b.attr_value
FROM lance_temp3 a,
lance_temp2 b
WHERE a.product_id = b.product_id
) m
WHERE (LOWER(' '||m.ATTR_VALUE||' ') like '% oem %'
OR LOWER(' '||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('
FROM (
SELECT a.product_id
,a.member_id
,b.attr_value
FROM lance_temp3 a,
lance_temp2 b
WHERE a.product_id = b.product_id
) m
WHERE (LOWER(' '||m.ATTR_VALUE||' ') like '% oem %'
OR LOWER(' '||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('
SELECT COUNT(*)
FROM (SELECT/*+leading(a)*/ a.product_id, a.member_id, b.attr_value
FROM lance_temp3 a, lance_temp2 b
WHERE a.product_id = b.product_id) m
WHERE (LOWER(' ' || m.ATTR_VALUE || ' ') LIKE '% oem %' OR LOWER(' ' || m.ATTR_VALUE || ' ') LIKE '% custom %';
先join 后filter 要好,所以才这样的。还有,你那个oem 和custom 是不是固定的如果是,可不可以换成instr 函数索引试试???
个人意见,,期待大侠!!!
SELECT count(*)
FROM (
SELECT a.product_id
,a.member_id
,b.attr_value
FROM lance_temp3 a,
lance_temp2 b
WHERE a.product_id = b.product_id
) m
WHERE (LOWER(' '||m.ATTR_VALUE || (case when 1=0 then m.product_id end)||' ') like '% oem %'
OR LOWER(' '||m.ATTR_VALUE||(case when 1=0 then m.product_id end)||' ') like '% custom %';
2、lance_temp3表共多少行数据?