id 为 tbl1 的index, uid 为 tbl2 的 index 。
SELECT * FROM tbl1 WHERE id IN (SELECT uid FROM tbl12 where rownum<3263)
使用了 tbl1中的 index 。
而
SELECT * FROM tbl1 WHERE id IN (SELECT uid FROM tbl12 where rownum<3264)
却采用全表查询。
表 tbl1 的记录数为 464243
表 tbl2 的记录数为 279268
当查询 rownum > 3263 的时候,数据库采用了全表查询,导致查询速度异常的慢。
这个可以使用
SELECT /*+ index(tbl1 INX_TBL1_ID) */* FROM tbl1 WHERE id IN (SELECT uid FROM tbl12 where rownum<3264)
来达到效果。
不过使用中的查询语句是多个表,请问如何写强制使用索引?
实际的SQL为:
SELECT c.DVBCUSTOMID, b.CUSTOMNM, i.TYPENM, h.DISCOUNTNM, b.ADDRESSCONN, b.ADDRESS, b.ZIPCODE, b.MAINTELE,
b.MOBILEPHONE, STBID, ICID, PROP, CLASS
FROM CMNG_CUSTOMINFO b, CMNG_CUSTOM c, CMNG_CUSTOMDISCOUNT h, CMNG_CUSTOMTYPE i, CMNG_STBCUSTOMVDO j, REP_NOSVR_1201 xx
WHERE xx.dvbcustomid = c.dvbcustomid and xx.dvbcustomid = j.dvbcustomid and c.CUSTOMID = b.CUSTOMID
AND c.DISCOUNTTYPE = h.DISCOUNTID AND c.TYPE=i.TYPE
计划策略:
SELECT STATEMENT, GOAL = CHOOSE Cost=3427 Cardinality=29001 Bytes=5191179
HASH JOIN Cost=3427 Cardinality=29001 Bytes=5191179
TABLE ACCESS FULL Object owner=SMSGX_DONG Object name=CMNG_CUSTOMDISCOUNT Cost=2 Cardinality=13 Bytes=195
HASH JOIN Cost=3424 Cardinality=29001 Bytes=4756164
TABLE ACCESS FULL Object owner=SMSGX_DONG Object name=CMNG_CUSTOMTYPE Cost=2 Cardinality=3 Bytes=36
HASH JOIN Cost=3421 Cardinality=29001 Bytes=4408152
HASH JOIN Cost=1449 Cardinality=29001 Bytes=2581089
HASH JOIN Cost=931 Cardinality=27639 Bytes=1160838
TABLE ACCESS FULL Object owner=SMSGX_DONG Object name=REP_NOSVR_1201 Cost=8 Cardinality=27639 Bytes=331668
TABLE ACCESS FULL Object owner=SMSGX_DONG Object name=CMNG_CUSTOM Cost=723 Cardinality=464243 Bytes=13927290
TABLE ACCESS FULL Object owner=SMSGX_DONG Object name=CMNG_STBCUSTOMVDO Cost=318 Cardinality=197468 Bytes=9280996
TABLE ACCESS FULL Object owner=SMSGX_DONG Object name=CMNG_CUSTOMINFO Cost=1398 Cardinality=464134 Bytes=29240442
后面三个表 CMNG_CUSTOM, CMNG_STBCUSTOMVDO, CMNG_CUSTOMINFO没有使用预期的索引,导致查询速度非常的慢。以至于应用服务器weblogic无法相应任何请求。