巧用分割槽查詢案例一則

kuqlan發表於2013-10-09

近期一位同事問我他們透過pl/sql dev匯出為csv文字檔案的SQL語句一直執行不下去

原來資料庫倉庫裡的一張分割槽表,資料量超級多,一天平均資料量超過8千多萬行...而他們想匯出一個月的資料,但是實際執行sql時發現sql無法執行完成。
然後他們將查詢條件縮減為一個星期,結果還是不行....嘗試按天匯出,試了以後還是不行...

他們幾乎折騰了3天多,甚至提出了一些不太合理資料庫要求(比如講資料庫的temp表空間誇張為幾個TB)。

他們sql是如下:

[@more@]

select t.cuttime,t.ceventid,t.cstbid,t.csource from abc.test_source t
where t.cuttime>=to_date('2013/08/06 00:00:00','yyyy/mm/dd hh24:MI:ss')
and t.cuttimeand t.ceventid in (1,2,5,7,23,21,26);


我隨便看看錶中資料行條數,執行如下sql,結果跑半天沒有結果出來,看來該表確實很大,然後我取消了sql
select count(*) from abc.test_SOURCE

透過如下查詢可以判斷,該表是分割槽表:
select * from user_PART_TABLES b where b.owner='abc' and table_name='test_SOURCE'

在透過如下查詢初步判斷,該分割槽表每天生成一個分割槽表:
SQL> col segment_name format a30
SQL> col owner format a10
SQL> select owner,segment_name,partition_name,segment_type from dba_segments where segment_name='test_SOURCE' AND OWNER='abc';


根據以上查詢結果,查詢了一天生成的分割槽表中記錄數,大致在8千萬以上:
select count(*) from abc.test_SOURCE partition (test_SOURCE_P_20130806);

如果採用如下原始sql肯定是跑不動的。

select t.cuttime,t.ceventid,t.cstbid,t.csource from abc.test_source t
where t.cuttime>=to_date('2013/08/06 00:00:00','yyyy/mm/dd hh24:MI:ss')
and t.cuttimeand t.ceventid in (1,2,5,7,23,21,26);

我對以上sql進行了如下的改造後,查詢結果可以出來了:
select count(*) from abc.test_source partition (VAV_SOURCE_P_20130806) t
where t.ceventid in (1,2,5,7,23,21,26);

在加上pl/sql dev的匯出CSV功能,再次進行匯出發現匯出成功。在次過程也發現那些操作者對PLSQL Dev的csv檔案匯出功能也不熟,以為先將查詢結果展現完畢才能完整匯出為csv檔案,實際上在PLSQL Dev上沒有必要查詢出結果集展現而直接選擇匯出CSV檔案即可。

為此有了如下的體會:
選用scale out和scale up的IT架構和系統軟體還不夠,應用軟體的設計也應該遵循此原則,還有團隊...

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/18841027/viewspace-1060951/,如需轉載,請註明出處,否則將追究法律責任。

相關文章