sql語句的優化案例分析
今天一測試人員提供過來一sql語句,結構如下:
SELECT t.* FROM v_service t,(SELECT DISTINCT icpcode,icpservid
FROM t_servcate2serv t1,(SELECT cateid FROM t_servcate
START WITH cateid=1 and showflag=1 CONNECT BY PRIOR cateid = parentid
and showflag=1) t2 WHERE t1.cateid=t2.cateid) t3
WHERE t.icpcode=t3.icpcode AND t.icpservid=t3.icpservid and (t.ServStatus='A' OR t.servstatus ='P' or t.servStatus='B' ) and (t.OnDemandFlag !=1 and t.OnDemandFlag!=2) and (t.accessmodeid=2 or t.accessmodeid=5 or ((t.accessmodeid=3 or t.accessmodeid=4) and (t.SERVTYPE=2 or t.SERVTYPE=3 or t.SERVTYPE=9 or t.SERVTYPE=0) ));
其中v_service是一檢視,內容如下:
create or replace view v_service
(icpcode, spname, spshortname, servidalias, icpservid, servname, servstatus, servattr, umflag, servtype, usagedesc, wwwurl, introurl, chargetype, price, chargedesc, starttime, endtime, servdesc, csrtel, spurl, accessmodeid, freeusetype, offlinedesc, offlinestate, offlinetime, freeusecount, ondemandflag, servicelogo, grouptype, servgroupid, type, specorderflag, specorderurl, brand, demourl, servcatid, freeurl)
as
select
t1.icpcode,t3.spname,t3.spshortname spshortname,T3.SERVIDALIAS,t1.icpservid,t1.servname, t1.servstatus,t1.ServAttr,
t1.umflag,T1.servtype,t1.UsageDesc,t1.wwwurl,t1.introURL, t1.ChargeType,t1.Price,t1.ChargeDesc,
t1.StartTime starttime,t1.EndTime,nvl(t2.servdesc,t1.servdesc) servdesc ,t3.csrtel,T3.CSRURL,
t4.ACCESSMODEID,t1.FREEUSETYPE,t1.OFFLINEDESC,t1.OFFLINESTATE,t1.OFFLINETIME,t1.FREEUSECOUNT,t1.ONDEMANDFLAG,
t1.SERVICELOGO,t7.GROUPTYPE,t7.SERVGROUPID,t7.TYPE,t1.SPECORDERFLAG,t1.SPECORDERURL,t2.brand,t2.demoURL,t1.SERVCATID,
w.freeurl
from service t1,t_servicemod t2,spinfo t3 ,SERVICE_ACCESS_MODE t4,
(select t6.ICPCODE,t6.ICPSERVID,t5.SERVGROUPID,t5.GROUPTYPE,t6.TYPE
from SERVICEGROUP t5,GROUP_SERVICE t6 where t5.SERVGROUPID=t6.SERVGROUPID) t7,
wap_service w
where t1.icpcode=t2.icpcode(+) and t1.icpservid=t2.icpservid(+) and
t1.icpcode=t3.spid(+) and t1.icpcode=t4.icpcode(+) and t1.icpservid=t4.icpservid(+) and
t1.ICPCODE=t7.icpcode(+) and t1.ICPSERVID=t7.icpservid(+) and
t1.ICPCODE=w.icpcode(+) and t1.ICPSERVID=w.icpservid(+) and
(t1.ServStatus='A' OR t1.servstatus ='P' or t1.servStatus='B') and
(t1.OnDemandFlag !=1 and t1.OnDemandFlag!=2) and
(t4.accessmodeid=2 or t4.accessmodeid=5 or (
(t4.accessmodeid=3 or t4.accessmodeid=4) and
(t1.SERVTYPE=2 or t1.SERVTYPE=3 or t1.SERVTYPE=9 or t1.servtype=0)
)
);
我暈,這麼複雜的sql語句也敢放在現網上執行,非得把資料庫搞塌掉!趕緊優化之!
這個查詢語句的效能消耗主要在檢視v_service上!
將檢視v_service改為一個物化檢視(materialized view),然後每天定時重新整理同步一次。
基於程式碼的改動量最小化,可直接取物化檢視名為v_service,將原檢視drop掉。
步驟如下:
1、建物化檢視(建之前需dba賦create materialized view的系統許可權給pas使用者)
create materialized view v_service
as
select 。。。。。。(同建檢視的select語句)
--建索引
create index indx_mv_service on v_service(icpcode,icpservid);
--定時重新整理,可一天一次(根據需要來定),放在job中定時呼叫
exec dbms_mview.refresh(list => 'v_service');
如下的對比結果供參考:
--v_service是檢視時
SQL> select count(*) from v_service;
COUNT(*)
----------
25794
已用時間: 00: 00: 01.03
--v_service是物化檢視時
SQL> select count(*) from v_service;
COUNT(*)
----------
25794
已用時間: 00: 00: 00.047
當然除了物化檢視外,其他的索引、臨時表和表關聯等都是要考慮的,在此就不一一闡述。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/38542/viewspace-882821/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL優化案例-單表分頁語句的優化(八)SQL優化
- SQL語句優化技術分析SQL優化
- 通過分析SQL語句的執行計劃優化SQL語句SQL優化
- SQL語句的優化SQL優化
- ORACLE SQL語句優化技術分析OracleSQL優化
- SQL語句優化SQL優化
- sql語句的優化分析SQL優化
- SQL Server優化之SQL語句優化SQLServer優化
- SQL 語句的優化方法SQL優化
- ORACLE SQL語句優化技術分析(zt)OracleSQL優化
- ORACLE SQL語句優化技術分析(轉)OracleSQL優化
- MYSQL SQL語句優化MySql優化
- sql語句效能優化SQL優化
- 求助:SQL語句優化SQL優化
- 優化 SQL 語句的步驟優化SQL
- 一個SQL語句的優化SQL優化
- 關於sql語句的優化SQL優化
- 一條sql語句的優化SQL優化
- SQL效能優化案例分析SQL優化
- 通過分析SQL語句的執行計劃優化SQL 二SQL優化
- MySQL之SQL語句優化MySql優化
- SQL語句優化(轉載)SQL優化
- 常用SQL語句優化技巧SQL優化
- Oracle之sql語句優化OracleSQL優化
- 對sql語句的優化問題SQL優化
- 優化SQL 語句 in 和not in 的替代方案優化SQL
- 通過分析SQL語句的執行計劃優化SQL(總結)SQL優化
- Oracle優化案例-單表分頁語句的優化(八)Oracle優化
- Oracle SQL語句優化之UNIONOracleSQL優化
- SQL語句操作符優化SQL優化
- SQL語句優化方法30例SQL優化
- 一條SQL語句的優化過程SQL優化
- 一次sql語句優化的反思SQL優化
- [zt] 基於索引的SQL語句優化索引SQL優化
- 資料庫效能優化之SQL語句優化資料庫優化SQL
- 淺談mysql配置優化和sql語句優化MySql優化
- 一條sql語句的建議調優分析SQL
- oracle效能問題:sql語句優化OracleSQL優化