SQL語句中的多個OR該怎么來優化
與或非是邏輯判斷的必須,如果真的需要很多or來判斷,那么誰也沒有辦法。
一般優化or的辦法是,減少or,也就是減少判斷條件。這個不僅僅是數據庫的問題,需要從業務等多方面來考慮。
比如,業務可以減少一個or,那么這就是最好的優化方式。如果幾個or字段都有索引,那么可以考慮分開查詢,這樣能走索引,因為or不走索引。
也算優化。縮小查詢范圍也算,雖然還是or,還是那么多條件,但是其他條件卻可以,讓數據量從10w,變為5千,這也是優化。
至于其他的方法,什么換個寫法等等,大多數都是扯淡,沒什么實際意義。
sql or 語句優化問題
試試這個:
SELECT * FROM get_childs1('1')
WHERE addorgid=childid
OR receiveorgid=childid
OR sendorgid=childid
OR adddeptid =childid
OR senddeptid =childid
OR receivedeptid=childid
改成:
SELECT * FROM get_childs1('1')
WHERE childid in(addorgid,receiveorgid,sendorgid,adddeptid,senddeptid,receivedeptid)
oracle 查詢的sql語句特別慢,是什么原因,是or特別慢嗎,用什么優
(select *o,
NVL(sum(*eamount), 0) vehicleamount,
from costsclaimdetail cd, costsclaims c
where *y = 1000
and *o = *o(+)
group by *o) cd,
對這個子查詢2個問題:
1、為啥這里要用左連接呢?難道cd與c里的costsno不一樣多?
2、外邊又有costsClaims c,而且還是 *o = *o(+),你不覺得重復么?
建議不要這個子查詢,直接在最外一層costsclaimdetail與costsclaims連接并group by
另1個子查詢類似
exists (select 'x'
from appuser tuser
where * = *dby
and *y = 1000)
這個子查詢可以改成costsClaims與appuser做連接
另外,不知道為什么這么多左連接,左連接比連接要慢
請教一條SQL語句的優化
在應用系統開發初期,由于開發數據庫數據比較少,對于查詢SQL語句,復雜視圖的的編寫等體會不出SQL語句各種寫法的性能優劣,但是如果將應用系統提交實際應用后,隨著數據庫中數據的增加,系統的響應速度就成為目前系統需要解決的最主要的問題之一。
系統優化中一個很重要的方面就是SQL語句的優化。對于海量數據,劣質SQL語句和優質SQL語句之間的速度差別可以達到上百倍,可見對于一個系統不是簡單地能實現其功能就可,而是要寫出高質量的SQL語句,提高系統的可用性。
在多數情況下,Oracle使用索引來更快地遍歷表,優化器主要根據定義的索引來提高性能。但是,如果在SQL語句的where子句中寫的SQL代碼不合理,就會造成優化器刪去索引而使用全表掃描,一般就這種SQL語句就是所謂的劣質SQL語句。
在編寫SQL語句時我們應清楚優化器根據何種原則來刪除索引,這有助于寫出高性能的SQL語句。 二、SQL語句編寫注意問題 下面就某些SQL語句的where子句編寫中需要注意的問題作詳細介紹。
在這些where子句中,即使某些列存在索引,但是由于編寫了劣質的SQL,系統在運行該SQL語句時也不能使用該索引,而同樣使用全表掃描,這就造成了響應速度的極大降低。 1. IS NULL 與 IS NOT NULL 不能用null作索引,任何包含null值的列都將不會被包含在索引中。
即使索引有多列這樣的情況下,只要這些列中有一列含有null,該列就會從索引中排除。也就是說如果某列存在空值,即使對該列建索引也不會提高性能。
任何在where子句中使用is null或is not null的語句優化器是不允許使用索引的。 2. 聯接列 對于有聯接的列,即使最后的聯接值為一個靜態值,優化器是不會使用索引的。
我們一起來看一個例子,假定有一個職工表(employee),對于一個職工的姓和名分成兩列存放(FIRST_NAME和LAST_NAME),現在要查詢一個叫比爾.克林頓(Bill Cliton)的職工。 下面是一個采用聯接查詢的SQL語句, select * from employss where first_name||''||last_name ='Beill Cliton'; 上面這條語句完全可以查詢出是否有Bill Cliton這個員工,但是這里需要注意,系統優化器對基于last_name創建的索引沒有使用。
當采用下面這種SQL語句的編寫,Oracle系統就可以采用基于last_name創建的索引。 *** where first_name ='Beill' and last_name ='Cliton'; . 帶通配符(%)的like語句 同樣以上面的例子來看這種情況。
目前的需求是這樣的,要求在職工表中查詢名字中包含cliton的人。可以采用如下的查詢SQL語句: select * from employee where last_name like '%cliton%'; 這里由于通配符(%)在搜尋詞首出現,所以Oracle系統不使用last_name的索引。
在很多情況下可能無法避免這種情況,但是一定要心中有底,通配符如此使用會降低查詢速度。然而當通配符出現在字符串其他位置時,優化器就能利用索引。
在下面的查詢中索引得到了使用: select * from employee where last_name like 'c%';4. Order by語句 ORDER BY語句決定了Oracle如何將返回的查詢結果排序。Order by語句對要排序的列沒有什么特別的限制,也可以將函數加入列中(象聯接或者附加等)。
任何在Order by語句的非索引項或者有計算表達式都將降低查詢速度。 仔細檢查order by語句以找出非索引項或者表達式,它們會降低性能。
解決這個問題的辦法就是重寫order by語句以使用索引,也可以為所使用的列建立另外一個索引,同時應絕對避免在order by子句中使用表達式。5. NOT 我們在查詢時經常在where子句使用一些邏輯表達式,如大于、小于、等于以及不等于等等,也可以使用and(與)、or(或)以及not(非)。
NOT可用來對任何邏輯運算符號取反。下面是一個NOT子句的例子:。
where not (status ='VALID')如果要使用NOT,則應在取反的短語前面加上括號,并在短語前面加上NOT運算符。NOT運算符包含在另外一個邏輯運算符中,這就是不等于(<>)運算符。
換句話說,即使不在查詢where子句中顯式地加入NOT詞,NOT仍在運算符中,見下例:。 where status <>'INVALID';對這個查詢,可以改寫為不使用NOT:select * from employee where salary<3000 or salary>3000;雖然這兩種查詢的結果一樣,但是第二種查詢方案會比第一種查詢方案更快些。
第二種查詢允許Oracle對salary列使用索引,而第一種查詢則不能使用索引。雖然這兩種查詢的結果一樣,但是第二種查詢方案會比第一種查詢方案更快些。
第二種查詢允許Oracle對salary列使用索引,而第一種查詢則不能使用索引。
轉載請注明出處華閱文章網 » sql語句or的優化