oracle查询结果存入临时表,Oracle查询问题引发临时表使用
分析某段時間內,刷卡金額大于1000的卡的消費記錄,寫法如下。
sql語句寫法:select a.dno,a.dcard,a.dcard_money,a.dcard_type,a.ddate, a.dsubshop,a.dworker,a.dtype,j.Djf Dnowjf,b.dsje,B.Dcount
from st_card_salemx a,
( select m.dcard,Count(1) Dcount,Sum(dcard_money) dsje
from st_Card_Salemx m
where ddate >= to_Date('2016-7-17','yyyy-mm-dd')
and Ddate <= to_Date('2016-7-19','yyyy-mm-dd')
and dcard_type <> '06'
group by m.dcard
having Sum(dcard_money) >= 1000 ) b,st_card_jf j
where a.dcard = b.dcard and b.dcard = j.dcardno
and a.ddate >= to_Date('2016-7-17','yyyy-mm-dd')
and a.Ddate <= to_Date('2016-7-19','yyyy-mm-dd')
order by 2
問題:剛開始使用的時候,3分鐘可以出結果,用了一年以后,40分鐘都還沒有出結果。Dcard是主鍵,Ddate有索引,原因不明。有誰知道原因的請回復,十分感謝。
我的解決辦法:1、對子查詢b生成臨時表,用的時候往臨時表中寫入數據,查詢完成即刪除。
創建臨時表Create Global Temporary Table b(dcard varchar(20),dcount int,dsje numeric(12,2) )On Commit Preserve Rows;
2、這樣上面的查詢語句改為
select a.dno,
b,'yyyy-mm-dd')
order by 2
3、查詢。在程序中先啟動事務,往b表中寫入數據(就是子查詢的內容),執行查詢,回滾事務。這樣數據就能正確的顯示,并且速度很快,效率很高。
雖然問題得到了解決,但是原因未查明,請求指點。
按以上方法問題得到解決,現在只需要6秒即可得到結果。
備注:臨時表比較
sqlserver:分本地臨時表僅在當前會話中可見;全局臨時表在所有會話中都可見。本地臨時表的名稱前面有一個編號符 (#table_name),而全局臨時表的名稱前面有兩個編號符 (##table_name)。表結構是臨時的,會話結束或者重啟服務之后,臨時表即消失。
Oracle:表結構是永久的,重啟服務也依然存在,除非顯式drop table。
總結
如果覺得編程之家網站內容還不錯,歡迎將編程之家網站推薦給程序員好友。
本圖文內容來源于網友網絡收集整理提供,作為學習參考使用,版權屬于原作者。
總結
以上是生活随笔為你收集整理的oracle查询结果存入临时表,Oracle查询问题引发临时表使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java常用设计模式————单例模式
- 下一篇: LeetCode算法入门- Revers