oracle查询结果存入临时表,Oracle查询问题引发临时表使用
分析某段時(shí)間內(nèi),刷卡金額大于1000的卡的消費(fèi)記錄,寫法如下。
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
問題:剛開始使用的時(shí)候,3分鐘可以出結(jié)果,用了一年以后,40分鐘都還沒有出結(jié)果。Dcard是主鍵,Ddate有索引,原因不明。有誰知道原因的請回復(fù),十分感謝。
我的解決辦法:1、對子查詢b生成臨時(shí)表,用的時(shí)候往臨時(shí)表中寫入數(shù)據(jù),查詢完成即刪除。
創(chuàng)建臨時(shí)表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、查詢。在程序中先啟動事務(wù),往b表中寫入數(shù)據(jù)(就是子查詢的內(nèi)容),執(zhí)行查詢,回滾事務(wù)。這樣數(shù)據(jù)就能正確的顯示,并且速度很快,效率很高。
雖然問題得到了解決,但是原因未查明,請求指點(diǎn)。
按以上方法問題得到解決,現(xiàn)在只需要6秒即可得到結(jié)果。
備注:臨時(shí)表比較
sqlserver:分本地臨時(shí)表僅在當(dāng)前會話中可見;全局臨時(shí)表在所有會話中都可見。本地臨時(shí)表的名稱前面有一個(gè)編號符 (#table_name),而全局臨時(shí)表的名稱前面有兩個(gè)編號符 (##table_name)。表結(jié)構(gòu)是臨時(shí)的,會話結(jié)束或者重啟服務(wù)之后,臨時(shí)表即消失。
Oracle:表結(jié)構(gòu)是永久的,重啟服務(wù)也依然存在,除非顯式drop table。
總結(jié)
如果覺得編程之家網(wǎng)站內(nèi)容還不錯(cuò),歡迎將編程之家網(wǎng)站推薦給程序員好友。
本圖文內(nèi)容來源于網(wǎng)友網(wǎng)絡(luò)收集整理提供,作為學(xué)習(xí)參考使用,版權(quán)屬于原作者。
總結(jié)
以上是生活随笔為你收集整理的oracle查询结果存入临时表,Oracle查询问题引发临时表使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java常用设计模式————单例模式
- 下一篇: LeetCode算法入门- Revers