當前位置:首頁 » 編程語言 » sqlor性能

sqlor性能

發布時間: 2022-07-02 01:23:30

sql資料庫查詢中滿足任何一個條件,使用OR還是多條語句效率高

當然是一條語句效率高

因為一條語句 也就意味著只對該表中的數據執行一次從頭到尾的查詢

三條語句的話,要對該表數據執行三次查詢

❷ sql in好還是or好,我的條件有五六個以上,但用or的話感覺太長了,不知道哪個效率高點

自己沒測試過,這兩篇文章看著比較靠譜:

網頁鏈接作者結論:如果in和or所在列有索引或者主鍵的話,or和in沒啥差別,執行計劃和執行時間都幾乎一樣。在沒有索引的情況下,隨著in或者or後面的數據量越多,in的效率不會有太大的下降,但是or會隨著記錄越多的話性能下降非常厲害

網頁鏈接作者結論:總體來說,In的效率更高一些。

❸ sql or 效率超慢,那位大仙幫忙分析分析

發現內層的 a.AAZ319在外層無用,所以僅只用內層sql,另外個人揣測樓主關於
and (a.aaz319 = '1000000000000010' and a.aaa155 in ('1'))
or (a.aaz319 = '1000000000000011' and a.aaa155 in ('1','2'))
or (a.aaz319 = '1000000000000017' and
a.aaa155 in ('1', '2', '3'))
這一塊的原意應該是要將一系列 or 之後的結果作為and條件,應括起來,另外in的效率也很低,感覺的你的這段sql應該是代碼拼接出來的,如果能不使用in盡量不使用in

因不太了解具體情況,以下僅作參考

select * from (
SELECT a.AAZ010 as rybh,
MAX(c.AAC003) as rymc,
MAX(c.AAC004) as aac004,
MAX(c.AAC006) as aac006,
MAX(c.AAC084) as aac084,
MAX(c.AAC002) as aac002,
MAX(a.APE031) as ape031,
COUNT(a.AAZ010) as wgs,
SUM(NVL(MAX(a.APE735),0)) as qzz,
MAX(c.APA151) as apa151
FROM KA59 a, AC01 c
WHERE 1 = 1
AND a.AAZ010 = c.AAC001
AND a.APA709 = '1'
and a.APE031 = '1'
AND a.ABB057 >to_date('2012-05-01' || ' 00:00:00', 'yyyy-mm-dd hh24:mi:ss')
and a.ABB057 <to_date('2012-07-11' || ' 23:59:59', 'yyyy-mm-dd hh24:mi:ss')
and ((a.aaz319 = '1000000000000010' and a.aaa155 in ('1'))
or (a.aaz319 = '1000000000000011' and a.aaa155 in ('1','2'))
or (a.aaz319 = '1000000000000017' and a.aaa155 in ('1', '2', '3')))
GROUP BY a.AAZ010
) bb
order by bb.qzz

❹ SQL查詢語句性能優化建議

1對查詢進行優化,應盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。
2.應盡量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:

select id from t where num is null

可以在num上設置默認值0,確保表中num列沒有null值,然後這樣查詢:

select id from t where num=0

3.應盡量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。

4.應盡量避免在 where 子句中使用 or 來連接條件,否則將導致引擎放棄使用索引而進行全表掃描,如:

select id from t where num=10 or num=20

可以這樣查詢:

select id from t where num=10

union all

select id from t where num=20

5.in 和 not in 也要慎用,否則會導致全表掃描,如:

select id from t where num in(1,2,3)

對於連續的數值,能用 between 就不要用 in 了:

select id from t where num between 1 and 3

6.下面的查詢也將導致全表掃描:

select id from t where name like '«c%'

若要提高效率,可以考慮全文檢索。

7.如果在 where 子句中使用參數,也會導致全表掃描。因為SQL只有在運行時才會解析局部變數,但優化程序不能將訪問計劃的選擇推遲到運行時;它必須在編譯時進行選擇。然而,如果在編譯時建立訪問計劃,變數的值還是未知的,因而無法作為索引選擇的輸入項。如下面語句將進行全表掃描:

select id可以改為強制查詢使用索引:

select id from t with(index(索引名)) where num=@num

8.應盡量避免在 where 子句中對欄位進行表達式操作,這將導致引擎放棄使用索引而進行全表掃描。如:

select id from t where num/2=100

應改為:

select id from t where num=100*2

9.應盡量避免在where子句中對欄位進行函數操作,這將導致引擎放棄使用索引而進行全表掃描。如:

select id from t where substring(name,1,3)='abc'--name以abc開頭的id

select id from t where datediff(day,createdate,'2005-11-30')=0--『2005-11-30』生成的id

應改為:

select id from t where name like 'abc%'

select id from t where createdate>='2005-11-30' and createdate<'2005-12-1'

10.不要在 where 子句中的「=」左邊進行函數、算術運算或其他表達式運算,否則系統將可能無法正確使用索引。

11.在使用索引欄位作為條件時,如果該索引是復合索引,那麼必須使用到該索引中的第一個欄位作為條件時才能保證系統使用該索引,否則該索引將不會被使用,並且應盡可能的讓欄位順序與索引順序相一致
12.不要寫一些沒有意義的查詢,如需要生成一個空表結構:

select col1,col2 into #t from t where 1=0

這類代碼不會返回任何結果集,但是會消耗系統資源的,應改成這樣:

create table #t(...)

13.很多時候用 exists 代替 in 是一個好的選擇:

select num from a where num in(selectnum from b)

用下面的語句替換:

select num from a where exists(select 1 from b where num=a.num)

14.並不是所有索引對查詢都有效,SQL是根據表中數據來進行查詢優化的,當索引列有大量數據重復時,SQL查詢可能不會去利用索引,如一表中有欄位sex,male、female幾乎各一半,那麼即使在sex上建了索引也對查詢效率起不了作用。

15.索引並不是越多越好,索引固然可以提高相應的 select 的效率,但同時也降低了 insert 及 update 的效率,因為 insert 或 update 時有可能會重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。一個表的索引數最好不要超過6個,若太多則應考慮一些不常使用到的列上建的索引是否有必要。

16.應盡可能的避免更新 clustered 索引數據列,因為 clustered 索引數據列的順序就是表記錄的物理存儲順序,一旦該列值改變將導致整個表記錄的順序的調整,會耗費相當大的資源。若應用系統需要頻繁更新 clustered 索引數據列,那麼需要考慮是否應將該索引建為 clustered 索引。

17.盡量使用數字型欄位,若只含數值信息的欄位盡量不要設計為字元型,這會降低查詢和連接的性能,並會增加存儲開銷。這是因為引擎在處理查詢和連接時會逐個比較字元串中每一個字元,而對於數字型而言只需要比較一次就夠了。

18.盡可能的使用 varchar/nvarchar 代替 char/nchar ,因為首先變長欄位存儲空間小,可以節省存儲空間,其次對於查詢來說,在一個相對較小的欄位內搜索效率顯然要高些。

19.任何地方都不要使用 select * from t ,用具體的欄位列表代替「*」,不要返回用不到的任何欄位。

20.盡量使用表變數來代替臨時表。如果表變數包含大量數據,請注意索引非常有限(只有主鍵索引)。

21.避免頻繁創建和刪除臨時表,以減少系統表資源的消耗。

22.臨時表並不是不可使用,適當地使用它們可以使某些常式更有效,例如,當需要重復引用大型表或常用表中的某個數據集時。但是,對於一次性事件,最好使用導出表。

23.在新建臨時表時,如果一次性插入數據量很大,那麼可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果數據量不大,為了緩和系統表的資源,應先create table,然後insert。

24.如果使用到了臨時表,在存儲過程的最後務必將所有的臨時表顯式刪除,先 truncate table ,然後 drop table ,這樣可以避免系統表的較長時間鎖定。

25.盡量避免使用游標,因為游標的效率較差,如果游標操作的數據超過1萬行,那麼就應該考慮改寫。

26.使用基於游標的方法或臨時表方法之前,應先尋找基於集的解決方案來解決問題,基於集的方法通常更有效。

27.與臨時表一樣,游標並不是不可使用。對小型數據集使用 FAST_FORWARD 游標通常要優於其他逐行處理方法,尤其是在必須引用幾個表才能獲得所需的數據時。在結果集中包括「合計」的常式通常要比使用游標執行的速度快。如果開發時間允許,基於游標的方法和基於集的方法都可以嘗試一下,看哪一種方法的效果更好。

28.在所有的存儲過程和觸發器的開始處設置 SET NOCOUNT ON ,在結束時設置 SET NOCOUNT OFF 。無需在執行存儲過程和觸發器的每個語句後向客戶端發送 DONE_IN_PROC 消息。

29.盡量避免大事務操作,提高系統並發能力。

30.盡量避免向客戶端返回大數據量,若數據量過大,應該考慮相應需求是否合理。

❺ SQL語句中的多個OR該怎麼來優化

與或非是邏輯判斷的必須,如果真的需要很多or來判斷,那麼誰也沒有辦法。
一般優化or的辦法是,減少or,也就是減少判斷條件。這個不僅僅是資料庫的問題,需要從業務等多方面來考慮。
比如,業務可以減少一個or,那麼這就是最好的優化方式。
如果幾個or欄位都有索引,那麼可以考慮分開查詢,這樣能走索引,因為or不走索引。也算優化。
縮小查詢范圍也算,雖然還是or,還是那麼多條件,但是其他條件卻可以,讓數據量從10w,變為5千,這也是優化。
至於其他的方法,什麼換個寫法等等,大多數都是扯淡,沒什麼實際意義。

❻ sql語句or與union all的執行效率哪個更高

這么寫比較好,

SQL code

select * from table where table_column in(1,2)

❼ sql中查詢中使用的or條件真的很慢嗎

不能說慢。 必要的可以用前提是加索引的 。 如果你一個表數據幾百萬條 你用or 沒索引啥也沒有 這種情況下用or 會導致全表掃描很慢 加上索引就好

❽ sql 語句括弧內or的執行效率問題

這3個方式都是用left
join的方式連接查詢,所以執行速度不會有明顯的差別
第三條語句寫錯了,

❾ 如何進行SQL性能優化

這里分享下mysql優化的幾種方法。

1、首先在打開的軟體中,需要分別為每一個表創建 InnoDB FILE的文件。

❿ sql中,or與and 的運算級別是不是一樣的

不一樣,and優先順序比or高。

or 優先順序:倒數第一

and 優先順序:倒數第二

select * fromAAwhere a >1 or b>1 and C>1

等同於:

select * fromAAwhere a >1 or (b>1 and C>1 )

如果你只想a>1和c>1建立或關系,則需要寫為:

select * from AA where(a>1 or b>1 )and C>1

結果:運算級別從高到低,or比and低兩級,中間隔了個XOR

註:不僅僅是在Sql Server中,電路中、編程語言中都是and的優先順序高於or。

熱點內容
androidactivity生命 發布:2024-04-27 07:33:48 瀏覽:83
win2008伺服器搭建網站 發布:2024-04-27 07:26:51 瀏覽:639
java的vector 發布:2024-04-27 07:05:00 瀏覽:203
舊電腦共享伺服器 發布:2024-04-27 06:32:21 瀏覽:339
java程序練習 發布:2024-04-27 06:24:00 瀏覽:438
sql30 發布:2024-04-27 06:22:10 瀏覽:55
怎樣防止sql注入 發布:2024-04-27 06:11:25 瀏覽:236
安卓為什麼不能登蘋果系統的游戲 發布:2024-04-27 06:11:23 瀏覽:601
編程日課 發布:2024-04-27 05:56:54 瀏覽:620
漏洞上傳工具 發布:2024-04-27 05:50:58 瀏覽:717