iT邦幫忙

2023 iThome 鐵人賽

DAY 9
0
自我挑戰組

IT工作中曾遇到的問題系列 第 20

Oracle 執行Create Table很慢的一次案例

  • 分享至 

  • xImage
  •  

有一次,有人反應說用軟體Toad來建立一個新的table時,執行時間非常的久,過了15分鐘還沒有完成。

之前沒有遇過新建表格需要這麼久的時間,所以跟他要了一下SQL。

新建Table的SQL大致如下:

create table temp_01_200 as (
   select we.WIP_ENTITY_NAME,msi.SEGMENT1 item_no,msi.DESCRIPTION,wdj.SCHEDULED_COMPLETION_DATE start_date,
               wdj.START_QUANTITY,wdj.QUANTITY_COMPLETED qty
     from wip_discrete_jobs wdj,
               mtl_system_items msi,
                wip_entities we,
               WIP_OPERATIONS_V wo,
      ...(略)

由上述的SQL可以得知,它有一個Select的語法,要抓取資料到新的表格內。

所以單獨執行Select的SQL語法,但是執行的速度很快,而抓出來的資料筆數只有200筆。

所以我重新執行一次Create Table,並找出它的執行計畫,發現Buffer Sort有Full Scan Table的情況
https://ithelp.ithome.com.tw/upload/images/20230918/20156403QEyhGJTt5R.png

因為SQL有串一個WIP_OPERATIONS_V,所以檢查一下WIP_OPERATIONS_V的SQL語法,發現這個View有使用order by語法。

 ... (略)
 FROM BOM_DEPARTMENTS BD,
             BOM_STANDARD_OPERATIONS BSO,
             WIP_OPERATIONS WO,
             MFG_LOOKUPS LU1
       WHERE     BD.DEPARTMENT_ID = WO.DEPARTMENT_ID
             AND BSO.STANDARD_OPERATION_ID(+) = WO.STANDARD_OPERATION_ID
             AND NVL (BSO.OPERATION_TYPE, 1) = 1
             AND BSO.LINE_ID IS NULL
             AND LU1.LOOKUP_TYPE(+) = 'BOM_EAM_SHUTDOWN_TYPE'
             AND LU1.LOOKUP_CODE(+) = WO.SHUTDOWN_TYPE
    ORDER BY WO.OPERATION_SEQ_NUM;

因為新建的表格不需要order by,於是改寫Create Table語法,直接以實體table取代View,並將order by刪掉,重新執行Create Table很快就完成了。

我們的Oracle DB是CBO優化器,也有定期執行Table的統計值(Statistic)收集,但是有時候還是會有這樣的情形出現,之前類似的情況發生時,有時我們會加hint來強制變更執行計劃。


上一篇
Solaris 10 Zones設定ipfilter,以阻擋特定IP的連線
下一篇
幾個小功能,但是有需要時還蠻好用的
系列文
IT工作中曾遇到的問題30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言