oracle sql 優化

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

總結

  1. Select * 或者無索引的字段,即使表有索引,也需全表查詢
  2. Where條件無索引字段,is null ,null,’’,全表查詢
  3. 左連接或者右連接或者內連接的使用等不會縮短查詢時間,只是一種匹配方式
  4. 關聯查詢若只是查其中一張表數據,不要去查另一張表數據,否則變成兩張表全表查詢
  5. 關聯查詢條件需走索引,不然走全表查詢

 

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

 )

 

 

幾種運行結果

  1. -- insert 有索引:194s
  2. --inseert 無索引:68
  3. --insert /*+parallel(16)*/ 有索引:175
  4. alter table serv nologging;--加上後isnert:187s
  5. --create as: 53s + 31s建索引

總結

若是新表,則用create table [tablename] as 最快

  1. 若是老表,則加上nologging在insert
  2. 若是老表數據不多,先讓索引失效,在重建索引
  3. parallel(16)併發有效果,感覺不明顯

 幾種join的總結

若有兩張表:t1,t2

T1 Right join t2:至少count(t1)條記錄,t1,t2中有兩條匹配數據,則多count(1)-2+2*2條記錄,

右連接一樣

內連接:條數爲符合兩邊條件的乘機,即若兩邊都有2條數據滿足,則2*2條,若無 則2*0條

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章