Dear All
系统里有下面的语句,其中MDN是Varchar类型,在Where条件中MDN=13811276353,这个写法有问题,后面是一串数字而不是加引号的字符串,这会导致oracle做index的full scan,极其消耗CPU,请改成下面的形式:mdn=’13811276353’
可以看到,两种写法的执行计划不一样。前一条语句运行0.3秒,后一种0.03秒,相差10倍。
SELECT DISTINCT mdn
FROM nm_net_user_17520548
WHERE mdn = 13811276353;
SELECT STATEMENT, GOAL = ALL_ROWS 600 1 12
HASH UNIQUE 600 1 12
INDEX FAST FULL SCAN NETMESSAGE NM_NET_USER_17520548_MDN_IDX 599 1 12
SELECT DISTINCT mdn
FROM nm_net_user_17520548
WHERE mdn = '13811276353';
SELECT STATEMENT, GOAL = ALL_ROWS 4 1 12
SORT UNIQUE NOSORT 4 1 12
INDEX RANGE SCAN NETMESSAGE NM_NET_USER_17520548_MDN_IDX 3 1 12
第一个地方改了以后,SELECT DISTINCT mdn
FROM nm_net_user_17520548
WHERE mdn = ‘13811276353’;
观察oracle的CPU消耗比较高的5个进程从99%,下降到45%。
第二个地方改了以后,
SELECT *
FROM nm_data_17520548_15126274 tbl
WHERE tbl.mdn = ‘13811314270’;
观察oracle的CPU消耗比较高的10个进程从45%,下降到25%。
系统总体的处理能力从30条美妙到150条每秒,处理能力大幅提升。
熬了一个通宵,几处问题调整后,下发速度从20TPS提高到150TPS,多谢大家