1.Sql優化:explain
分析
- seelect * from tf_f_user;--全表掃描
- select t.user_id from tf_f_user t;--idex_fast_full_sacn
- select * from tf_f_user t where t.user_id is null;--全表掃描
- select * from tf_f_user t where t.user_id is not null;--全表掃描
- select * from tf_f_user t where t.user_id = '123';--無索引全表掃描,有索引查索引
- select count(1) from tf_f_user t;--index_fast_full_sacan
- select * from tf_f_user t , tf_f_user_member tt where t.user_id = tt.member_role_id;--兩張表全表掃描
- select t.* from tf_f_user t , tf_f_user_member tt where t.user_id = tt.member_role_id;--tf_f_user_member表index_fast_full_scan
- select * from tf_f_user t left join tf_f_user_member tt on t.user_id = tt.member_role_id;--全表掃描
- select t.* from tf_f_user t left join tf_f_user_member tt on t.user_id = tt.member_role_id;--tf_f_user_member表index_fast_full_scan
總結
- Select * 或者無索引的字段,即使表有索引,也需全表查詢
- Where條件無索引字段,is null ,null,’’,全表查詢
- 左連接或者右連接或者內連接的使用等不會縮短查詢時間,只是一種匹配方式
- 關聯查詢若只是查其中一張表數據,不要去查另一張表數據,否則變成兩張表全表查詢
- 關聯查詢條件需走索引,不然走全表查詢
2. 幾種insert數據的效率比較
原始sql,數據量爲9640188,一個左連接
insert into serv
(select USER_ID SERV_ID,
0 AGREEMENT_ID,
CUST_ID CUST_ID,
PRODUCT_ID PRODUCT_ID,
0 ACCT_ID,
0 BILLING_CYCLE_TYPE_ID,
in_date CREATE_DATE,
serial_number ACC_NBR,
open_date EFF_DATE,
to_date('20501231235959','YYYYMMDDHH24MISS') EXP_DATE,
eparchy_code REGION_ID,
brand_code BAND_ID,
decode(mm.member_role_code, 9225, 1, 9226, 2, 0) ATTR_CODE,
0 CREDIT_VALUE,
0 BILL_TYPE,
SERVICE_STATE_CODE STATE,
'' STATE_DATE,
'' ENCRYPT_INFO,
'' STOP_ATTR,
PREPAY_TAG SERV_PASSWD,
'0' CYCLE_STATE,
in_date CYCLE_DATE,
user_type_code USER_TYPE,
CITY_CODE CITY_CODE,
sysdate UPDATE_DATE,
'' RLB_DISP,
'' ROLL_FLAG,
NET_TYPE_CODE NET_TYPE_CODE,
FIRST_CALL_DATE FIRST_USER_DATE,
LAST_STOP_DATE LAST_STOP_DATE
from i_user t left join
(select distinct m.member_role_id, m.member_role_code
from tf_f_user_member m
where m.member_role_code in ('9225', '9226') and m.relation_type_code='ZF'
and m.end_date >= trunc(sysdate, 'mm')) mm
on t.user_id = mm.member_role_id
)
幾種運行結果
- -- insert 有索引:194s
- --inseert 無索引:68
- --insert /*+parallel(16)*/ 有索引:175
- alter table serv nologging;--加上後isnert:187s
- --create as: 53s + 31s建索引
總結
若是新表,則用create table [tablename] as 最快
- 若是老表,則加上nologging在insert
- 若是老表數據不多,先讓索引失效,在重建索引
- parallel(16)併發有效果,感覺不明顯
幾種join的總結
若有兩張表:t1,t2
T1 Right join t2:至少count(t1)條記錄,t1,t2中有兩條匹配數據,則多count(1)-2+2*2條記錄,
右連接一樣
內連接:條數爲符合兩邊條件的乘機,即若兩邊都有2條數據滿足,則2*2條,若無 則2*0條