oracle慢sql
『壹』 oracle 查詢的sql語句特別慢,是什麼原因,是or特別慢嗎,用什麼優化,急急急!!!
把查詢計劃的內容發出來,你這一大堆代碼誰能看出來啥啊。看你的代碼這么長,條件那麼多,語句用了函數,很多低效的or,not in等操作,另外還用了group by,order by,左右連接等等,如果表數據量很大的話,你這個語句性能不好是預料中的事情。如果你這條語句無法優化,建議從調整表結構角度考慮
『貳』 oracle 查詢語句 第一次執行很快,第二次執行就很慢 。是什麼原因
oracle sql 第一次查詢快, 以後查詢慢
大多數情況下,用oracle, 第一次查詢慢, 第二次查詢肯定比第二次查詢快對吧,
但對於這種情況,第一次查詢快, 以後查詢慢。
Cardinality Feedback基數反饋, 是版本11.2中引入的關於SQL 性能優化的新特性,該特性主要針對 統計信息陳舊、無直方圖或雖然有直方圖但仍基數計算不準確的情況, Cardinality基數的計算直接影響到後續的JOIN COST等重要的成本計算評估,造成CBO選擇不當的執行計劃。以上是Cardinality Feedback特性引入的初衷。
基數反饋多少也造成了一些麻煩,典型的情況是測試語句性能時,第一次的性能最好,之後再運行其性能變差。
如何禁用Cardinality Feedback基數反饋
對於這些」惹火」特性,為了stable,往往考慮關閉該特性。
可以通過多種方法禁用該特性
1. 使用 _optimizer_use_feedback 隱藏參數
session 級別
SQL> alter session set 「_optimizer_use_feedback」=false;
會話已更改。
system級別
SQL> alter system set 「_optimizer_use_feedback」=false;
系統已更改。
————————————————
原文鏈接:https://blog.csdn.net/demonson/article/details/80522150
『叄』 oracle 一句sql 執行速度特別慢,請指導如何改寫,謝謝
selectf.channel_name,c.name,c.rule_detail,count(1)monthly,rank()over(orderbycount(1)desc)rank
fromcljy.sys_cljyc,channel_paylog_dayfwhereSUBSTR(f.recv_time,1,6)=
to_char(sysdate,'yyyymm')andc.namelike'%經典%'and
exists(selectcount(1)fromcljy.sys_pay_prize_targetj,nt_staff_channelgwherej.device_number=f.serial_numberandg.depart_id=f.recv_depart_id)--andrownum<2
groupbyf.channel_name,c.name,c.rule_detail
先把andrownum<2注釋去掉能執行成功的話就沒錯,老感覺這個語句死循環了。。。測完再回復我,給你看
『肆』 oracle資料庫運行sql很卡很慢很頓,看等待事件都是cursor:pin s on x,這是啥
詳解cursor: pin S wait on X等待事件 『cursor: pin * events』等待事件 該類等待事件一般是為了pin相關的子游標 『Cursor: pin S on X』 最常見的等待事件, 進程為了共享操作例如執行pin游標而以SHRD S mode申請mutex, 但是未立即獲得。原因是該游標被其他進程以EXCL X mode 持有了。 實際該 cursor: pin S wait on X等待事件往往是由於其他因素誘發的。Mutex爭用僅僅是問題的症狀,但根本原因需要Database Consultant 進一步挖掘。 下面我們列出一些已知的常見案例, 在這些例子中可以看到 我上面提到的 Mutex的爭用僅僅是偽爭用: 過多的子游標 High Version Counts 過多的子游標版本Version Count可能導致Mutex 爭用,一般一個SQL的Version Count不要高於500。 檢查High Version Count很簡單, 在AWR里就有SQL ordered by High Version Count,也可以寫SQL查V$SQL、V$SQLAREA 昂貴的X$、V$視圖查詢 一些對於V$、X$視圖的查詢,需要訪問X$KGL*之類的fixed table,可能觸發Mutex爭用。 Mutex持有者得不到CPU Mutex持有者若得不到足夠的CPU片可能一直阻塞他人,直到它拿到需要的CPU。 這種情況可能由於OS操作系統的實際情況或者使用Resource Manager而引起。需要配合AWR中的Host CPU、Instance CPu一起看。 已經被KILLED的SESSION仍持有Mutex 當session正持有Mutex,而其對應的Process被強制KILL掉, 則直到PMON徹底清理掉該Dead Process並釋放Mutex,其他session才能不再等待。 診斷該類問題,最好能檢查PMON的TRACE。 當然也存在部分BUG會導致PMON清理過程非常慢。 舉例來說,bug 9312879描述了一種場景:PMON 需要獲得某個Mutex以便清理某個dead process,但是該Mutex又被其他進程持有,則PMON甚至無法開始真正清理並釋放Mutex。 如果自己搞不定可以找ASKMACLEAN專業ORACLE優化團隊成員幫您搞定!
『伍』 執行一下Oracle SQL時,慢如蝸牛,如何優化
至少可以改成這個樣子:
--------------------------------------------------------
select b.reach_item_no as 小區編號,
c.reach_item_name as 小區名稱,
substr(b.floor_no, 1, 2) as 樓棟,
count(1) as 應抄數,
sum(decode(d.mp_item_no, null, 0, 1)) as 實抄數,
to_char(round((sum(decode(d.mp_item_no, null, 0, 1)) / count(1)) * 100)) as 抄收率,
'20090701' as 抄收日期
from meter_running a,
customer_files b,
reach_item_location c,
raw_day_e d
where a.customer_no = b.customer_no
and b.reach_item_no = c.reach_item_no
and d.mp_item_no(+) = a.mp_item_no
and d.data_dt(+) = '20090701'
group by substr(b.floor_no, 1, 2), b.reach_item_no, c.reach_item_name,
order by 1, 3
--------------------------------------------------------
如果執行還慢,那麼就要看索引是否建了,統計信息是否收集,分配的pga是否夠大。這種關聯使用hash join應該效率更高,如果分配的pga太小,走nl,估計會比較慢。
『陸』 求助各位大俠,關於plsql連接oracle 慢
1、你在伺服器上用plsql連接沒有問題
說明:第一不是伺服器問題,第二不是plsql軟體問題
2、你在自己電腦上連接sql正常
說明:不是網路問題
3、但是你在你自己的電腦上連接伺服器上的oracle有問題
個人認為應該從一下兩個方面找原因
第一:你的plsql版本和你在伺服器上測試時候用的版本是否一致
第二:你本地的oracle客戶端版本和伺服器上的版本是否一致
第三:你本地的tns文件和伺服器上的tns文件是否一致
我沒有遇到過這樣的問題,但是如果我遇到了也就這個思路了!
『柒』 Oracle:怎麼修改這個sql來提高查詢效率現在5秒100條太慢了
SELECTA.ID,SUM(CASEWHENA.NAME='a'ANDB.NAME='S'THENSZEND),
SUM(CASEWHENA.NAME='b'ANDB.NAME='SS'THENSZEND)
FROMAJOINBONA.ID=B.ID
『捌』 oracle sql 查詢我使用自已寫的函數查詢很快,加了函數做條件就很慢是為什麼
慢是因為
對於 幾十萬條記錄左右,
你那個 test(a) 函數, 需要執行 很多次, 每行執行一次, 然後判斷 LIKE '%123%'
至於:
select a,b, test(a) c from demo; --只這樣查很快
我估計你使用的是 PLSQL Developer。
查詢的時候, 默認是查詢第一頁, 因此很快。
因為只顯示少部分行。
例如一頁20行的話, 那麼也就執行你那個函數 20次。
『玖』 oracle資料庫執行sql很慢怎麼回事
由於經常執行sql語句,如果一條一條執行效率低下。
oarclecmd.commandtext
=
sqlstr;
oraclecmd.executenonquery();
sqlstr
可以寫成如下所示語句
begin
sql1;
sql2;
......
sqln;
end;
//注意此處的分號很重要
然後同樣調用executenonquery()方法,可以一次執行多條sql語句。