❶ 查詢的sql語句怎麼寫才能提高查詢效率
這是SQL語句優化的問題了。網上好多類似的文章,非常全面。
個人覺得比較常用的是:
SQL語句查詢中經常用到的欄位建索引,這樣可以非常明顯的提升查詢速度。
FROM表的順序,大表在前,小表在後,因為檢索的順序從後往前。
WHERE, WHERE A.COLUMN = B.COLUMN,把小表的欄位放在後邊(B表),大表在前。
固定值查詢的放在後邊 COLUMN = '1'這種。因為這個也是從後往前的順序。
如果有(NOT) IN (SELECT ...) 盡量避免,因為IN裡面也是一個大的查詢,使用 (NOT) EXISTS的語法代替。
還有UNION和UNION ALL,多表聯合,UNION的作用是可以去掉重復,如果多表沒有重復數據,使用UNION ALL效率也會大大提高。
❷ 如何提高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 '%abc%'
若要提高效率,可以考慮全文檢索。
7.如果在 where 子句中使用參數,也會導致全表掃描。因為SQL只有在運行時才會解析局部變數,但優化程序不能將訪問計劃的選擇推遲到運行時;它必須在編譯時進行選擇。然而,如果在編譯時建立訪問計劃,變數的值還是未知的,因而無法作為索引選擇的輸入項。如下面語句將進行全表掃描:
select id from t where num=@num
可以改為強制查詢使用索引:
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' // oracle總有的是substr函數。
select id from t where datediff(day,createdate,'2005-11-30')=0 //查過了確實沒有datediff函數。
應改為:
select id from t where name like 'abc%'
select id from t where createdate>='2005-11-30' and createdate<'2005-12-1' //
oracle 中時間應該把char 轉換成 date 如: createdate >= to_date('2005-11-30','yyyy-mm-dd')
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(select num 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資料庫的查詢速度
一、程序中:
1、保證在實現功能的基礎上,盡量減少對資料庫的訪問次數。
2、通過搜索參數,盡量減少對表的訪問行數,最小化結果集,從而減輕網路負擔,能夠分開的操作盡量分襲蔽開處理,提高每次的響應速度。
3、在數據窗口使用SQL時,盡量把使用的索引放在選擇的首列,演算法的結構盡量簡單。
二、避免使用不兼容的數據類型。
例如「float」、「int」、「char」等,都屬於不兼容。 數據類型的不兼容可能使優化器無法執行一些本來可以進行的優化操型態作。
三、盡量避免在Where子句中對欄位進行函數或表達式卜禪源操作,這將導致引擎放棄使用索引而進行全表掃描。
四、盡量使用數字型欄位。
一部分開發人員和資料庫管理人員喜歡把包含數值信息的欄位設計為字元型,這會降低查詢和連接的性能,並會增加存儲開銷。
❹ 從外到內提高SQL Server資料庫性能
如何提高SQL Server資料庫的性能 該從哪裡入手呢?筆者認為 該遵循從外到內的順序 來改善資料庫的運行性能 如下圖
第一層 網路環境
到企業碰到資料庫反映速度比較慢時 首先想到的是是否是網路環境所造成的 而不是一開始就想著如何去提高資料庫的性能 這是很多資料庫管理員的一個誤區 因為當網路環境比較惡劣時 你就算再怎麼去改善資料庫性能 也是枉然
如以前有個客戶 向筆者反映資料庫響應時間比較長 讓筆者給他們一個提高資料庫性能的解決方案 那時 筆者感到很奇怪 因為據筆者所知 這家客戶資料庫的記錄量並不是很大 而且 他們配置的資料庫伺服器硬體很不錯 筆者為此還特意跑到他們企業去查看問題的原因 一看原來是網路環境所造成的 這家企業的客戶機有 多台 而且都是利用集線器進行連接 這就導致企業內部網路廣播泛濫 網路擁塞 而且由於沒有部署企業級的殺毒軟體 網路內部客戶機存在病毒 掠奪了一定的帶寬 不僅資料庫系統響應速度比較慢 而且其他應用軟體 如郵箱系統 速度也不理想
在這種情況下 即使再花十倍 百倍力氣去提升SQL Server資料庫的性能 也是竹籃子打水一場空 因為現在數據冊豎庫伺服器的性能瓶頸根本不在於資料庫本身 而在於企業的網路環境 若網路環境沒有得到有效改善 則SQL Server資料庫性能是提高不上去的
為此 筆者建議這家企業 想跟他們的網路管理員談談 看看如何改善企業的網路環境 減少廣播包和網路沖突;並且有效清除區域網內的病毒 木馬等等 三個月後 我再去回訪這家客戶的時候 他們反映資料庫性能有了很大的提高 而且其他應用軟體 性能也有所改善
所以 當企業遇到資料庫性能突然降低的時候 第一個反應就是查看網路環境 看看其實否有惡化 只有如此 才可以少走冤枉路
第二層 伺服器配置
這里指的伺服器配置 主要是講資料庫伺服器的硬體配置以及周邊配套 雖然說 提高資料庫的硬體配置 需要企業付出一定的代價 但是 這往往是一個比較簡便的方法 比起優化SQL語句來說 其要簡單的多
如企業可以通過增加硬碟的數量來改善資料庫的性能 在實際工作中 硬碟輸入輸出瓶頸經常被資料庫管理員所忽視 其實 到並發訪問比較多的時候 硬碟輸入輸出往往是資料庫性能的一個主要瓶頸之一 此時 若資料庫管理員可以增加幾個硬碟 通過磁碟陣列來分散磁碟的壓力 無疑是提高資料庫性能的一個捷徑
如增加伺服器的內存或者CPU 當資料庫管理員發現資料庫性能的不理想是由內存或者CPU所造成的 此時 任何的改善資料庫伺服器本身的措施都將一物用處 所以 有些資料庫管理專家 把改善伺服器配置當作敗姿亂資料庫性能調整的一個先決條件
如解決部署在同一個資料庫伺服器上的資源爭用問題 雖然我們多次強調 要為資料庫專門部署一個伺服器 但是 不少企業為了降低信息化的成本 往往把資料庫伺服器跟應用伺服器放在同一個伺服器中 這就會導致不同伺服器之間的資源爭用問題 如把文件伺服器跟數據伺服器部署在同一個伺服器中 當對文件伺服器進行備份時 資料庫性能就會有明顯的下降 所以 在資料庫性能發現周期性的變化時 就要考慮是否因為伺服器上不同應用對資源的爭奪所造成的
故 筆者建察檔議 改善資料庫性能時第二個需要考慮的層面 就是要看看能否通過改善伺服器的配置來實現
第三層 資料庫伺服器
當通過改善網路環境或者提高伺服器配置 都無法達到改善資料庫性能的目的時 接下去就需要考察資料庫伺服器本身了 首先 就需要考慮資料庫伺服器的配置
一方面 要考慮資料庫伺服器的連接模式 SQL Server資料庫提供了很多的資料庫模式 不同的資料庫連接模式對應不同的應用 若資料庫管理員能夠熟悉企業自身的應用 並且選擇合適的連接模式 這往往能夠達到改善資料庫性能的目的
其次 合理配置資料庫伺服器的相關作業 如出於安全的需要 資料庫管理員往往需要對資料庫進行備份 那麼 備份的作業放在什麼時候合適呢?當然 放在夜晚 夜深人靜的時候 對資料庫進行備份最好 另外 對於大型資料庫 每天都進行完全備份將會是一件相當累人的事情 雖然累得不是我們 可是資料庫伺服器也會吃不消 差異備份跟完全備份結合將是改善資料庫性能的一個不錯的策略
第四層 資料庫對象
若以上三個層面後 資料庫性能還不能夠得到大幅度改善的話 則就需要考慮是否能夠調整資料庫對象來完成我們的目的 雖然調整資料庫對象往往可以提到不錯的效果 但是 往往會對資料庫產生比較大的影響 所以 筆者一般不建議用戶一開始就通過調整資料庫對象來達到改善資料庫性能的目的
資料庫對象有表 視圖 索引 關鍵字等等 我們也可以通過對這些對象進行調整以實現改善資料庫性能的目標
如在視圖設計時 盡量把其顯示的內容縮小 寧可多增加視圖 如出貨明細表 銷售人員可能希望看到產品編號 產品中英文描述 產品名字 出貨日期 客戶編號 客戶名字等等 但是 對於財務來說 可能就不需要這么全的信息 他們只需要產品編號 客戶編號 出貨日期等等少量的信息即可 所以 能可浪費一點代碼的空間 設計兩張視圖 對應不同部門的需求 如此 財務部門在查詢數據時 不會為不必要的數據浪費寶貴的資源
如可以通過合理設置索引來提高資料庫的性能 索引對於提高數據的查詢效率 有著非常好的效果 對一些需要重復查詢的數據 或者數據修改不怎麼多的表設置索引 無疑是一個不錯的選擇
另外 要慎用存儲過程 雖然說存儲過程可以幫助大家實現很多需求 但是 在萬不得已的情況下 不要使用存儲過程 而利用前台的應用程序來實現需求 這主要是因為在通常情況下 前台應用程序的執行效率往往比後台資料庫存儲過程要高的多
第五層 SQL 語句
若以上各個層面你都努力過 但是還不滿足由此帶來的效果的話 則還有最後一招 通過對SQL語句進行優化 也可以達到改善資料庫性能的目的
雖然說SQL Server伺服器自身就帶有一個SQL語句優化器 他會對用戶的SQL語句進行調整 優化 以達到一個比較好的執行效果 但是 據筆者的了解 這個最多隻能夠優化一些粗略的層面 或者說 %的優化仍然需要資料庫管理員的配合 要資料庫管理員跟SQL優化器進行配合 才能夠起到非常明顯的作用
不過 SQL語句的調整對於普通資料庫管理員來說 可能有一定的難度 除非受過專業的訓練 一般很難對SQL語句進行優化 還好筆者受過這方面的專業訓練 對這方面有比較深的認識 如在SQL語句中避免使用直接量 任何一個包含有直接量的SQL語句都不太可能被再次使用 我們資料庫管理員要學會利用主機變數來代替直接量 不然 這些不可再用的查詢語句將使得程序緩存被不可再用的SQL語句填滿 這都是平時工作中的一些小習慣
lishixin/Article/program/SQLServer/201311/22452
❺ sql語句問題,請問如何提高運行效率和速度
其實你的效率低的原因不是用SQL語句還是存儲過程的問題。看你的描述以及代碼,如果是多次循環上述代碼的話,確實效率會比較低,原因是有一次循環就會和資料庫產生一次查詢和更新通訊,希望增加效率應該從盡量減少和資料庫通訊方面來考慮解決,因為是這里出現了效率瓶頸。
下面是具體的代碼分析:
首先更新和插入操作是無法減少的,必須一條紀錄一條紀錄更新,一條紀錄一條紀錄的插入,但是查詢完全可減低為一次查詢。
下面是偽代碼:
strsql="select * from "&tabl&" where id+idd in ('所有要循環的id+idd,他們之間用逗號分開')"
rs.open strsql,conn,3,3
do while not rs.eof
rs("degree")=rs("degree")+1
tempstr=tempstr&id&idd&"|" '這里是將資料庫中存在的id,idd記錄保存下來,存入一個臨時變數中,用|符號分割開。
rs.update
rs.movenext
loop
'上面的代碼是更新了資料庫中存在的紀錄,並記錄下了存在的記錄ID+IDD
下面將所有存在的已update的id+idd的值從所有的id+idd的值中剔除掉,取到所有需要insert的id+idd紀錄,然後一起insert進資料庫即可。代碼我不再寫了,這樣的字元串對比操作並不難,因為這樣都是內存操作,速度會很快。僅提供一個思路。希望對你有用。
❻ 如何優化資料庫提高資料庫的效率
1.SQL優化的原則是:將一次操作需要讀取的BLOCK數減到最低,即在最短的時間達到最大的數據吞吐量。
調整不良SQL通常可以從以下幾點切入:
檢查不良的SQL,考慮其寫法是高李否還有可優化內容
檢查子查詢考慮SQL子查詢是否可以用簡單連接的方式進行重新書寫
檢查優化索引的使用
考慮資料庫的優化器
2.避免出現SELECT*FROMtable語句,要明確查出的欄位。
3.在一個SQL語句中,如果一個where條件過濾的資料庫記錄越多,定位越准確,則該where條件越應該前移。
4.查詢時盡可能使用索引覆蓋。即對SELECT的欄位建立復合索引,這樣查詢時只進行索引掃描,不讀取數據塊。
5.在判斷有無符合條件的記錄時建議不要用SELECTCOUNT(*)和selecttop1語句。
6.使用內層限定原則,在拼寫SQL語句時,將查詢條件分解、分類,並盡量在SQL語句的最里層進行限定,以減少數據的處理量。
7.應絕對避免在orderby子句中使用表達式。
8.如果需要從關聯表讀數據,關聯的表一般不要超過7個。
9.小心使用IN和OR,需要注意In集合中的數據量。建議集合中的數據不超過200個。
10.<>用<、>代替,>用>=代替,<用<=代替,這樣可以有效的利用索引。
11.在查詢時盡量減少對多餘數據的讀取包括多餘的列與多餘的行。
12.對於復合索引要注意,例如在建立復合索引時列的順序是F1,F2,F3,則在where或orderby子句中這些欄位出現的順序要與建立索引時的欄位者頃順序一致,且必須包含第一列。只能是F1或F1,F2或F1,F2,F3。否則不會用到該索引。
13.多表關聯查詢時,寫法必須遵循以下原則,這樣做有利於建立索引,提高查詢效率。格式如下selectsum(table1.je)fromtable1table1,table2table2,table3table3where(table1的等值條件(=))and(table1的非等值條件)and(table2與table1的關聯條件)and(table2的等值條件)and(table2的非等值條件)and(table3與table2的關聯條件)and(table3的等值條件)and(table3的非等值條件)。
注:關於多表查詢時from後面表的出現順序對效率的影響還有待研究。
14.子查詢問首念陸題。對於能用連接方式或者視圖方式實現的功能,不要用子查詢。例如:_idin(selectcustomer_idfromorderwheremoney>1000)。應該用如下語句代替:.customer_id=order.customer_idwhereorder.money>100。
15.在WHERE子句中,避免對列的四則運算,特別是where條件的左邊,嚴禁使用運算與函數對列進行處理。比如有些地方substring可以用like代替。
16.如果在語句中有notin(in)操作,應考慮用notexists(exists)來重寫,最好的辦法是使用外連接實現。
17.對一個業務過程的處理,應該使事物的開始與結束之間的時間間隔越短越好,原則上做到資料庫的讀操作在前面完成,資料庫寫操作在後面完成,避免交叉。
18.請小心不要對過多的列使用列函數和orderby,groupby等,謹慎使用disti軟體開發t。
19.用unionall代替union,資料庫執行union操作,首先先分別執行union兩端的查詢,將其放在臨時表中,然後在對其進行排序,過濾重復的記錄。
當已知的業務邏輯決定queryA和queryB中不會有重復記錄時,應該用unionall代替union,以提高查詢效率。
數據更新的效率
1.在一個事物中,對同一個表的多個insert語句應該集中在一起執行。
2.在一個業務過程中,盡量的使insert,update,delete語句在業務結束前執行,以減少死鎖的可能性。
資料庫物理規劃的效率
為了避免I/O的沖突,我們在設計資料庫物理規劃時應該遵循幾條基本的原則(以ORACLE舉例):
table和index分離:table和index應該分別放在不同的tablespace中。
RollbackSegment的分離:RollbackSegment應該放在獨立的Tablespace中。
SystemTablespace的分離:SystemTablespace中不允許放置任何用戶的object。(mssql中primaryfilegroup中不允許放置任何用戶的object)
TempTablesace的分離:建立單獨的TempTablespace,並為每個user指定defaultTempTablespace
避免碎片:但segment中出現大量的碎片時,會導致讀數據時需要訪問的block數量的增加。對經常發生DML操作的segemeng來說,碎片是不能完全避免的。所以,我們應該將經常做DML操作的表和很少發生變化的表分離在不同的Tablespace中。
當我們遵循了以上原則後,仍然發現有I/O沖突存在,我們可以用數據分離的方法來解決。
連接Table的分離:在實際應用中經常做連接查詢的Table,可以將其分離在不同的Taclespace中,以減少I/O沖突。
使用分區:對數據量很大的Table和Index使用分區,放在不同的Tablespace中。
在實際的物理存儲中,建議使用RAID。日誌文件應放在單獨的磁碟中。
❼ 如何進行SQL性能優化
這里分享下mysql優化的幾種方法。
1、首先在打開的軟體中,需要分別為每一個表創建 InnoDB FILE的文件。
❽ 怎麼樣寫SQL語句可以提高資料庫的執行速度應該注意那些
這個范圍太大了,一下子是很難說清楚的,如果用sql server 的話,可以使用它自帶的優化器來優化,然後看看它給你的建議去優化。要注意規范化編程。而且要抓住一個原則來寫,就是進可能縮小查詢出來的結果集,哪怕多次查詢都沒所謂,要一步一步把大數據量縮小。很多隻是還是得在時間中優化。SET STATISTICS TIME ON;SQL 語句SET STATISTICS TIME OFF;這個是sqlserver ,可以測出執行時間。編寫的時候要時刻想著:縮小結果集、減少連接次數和表數。大數據量不要用update,可以用臨時表作為過度來實現update操作。
❾ 怎麼提高資料庫查詢效率
提高查詢效率首先要想到的就是加索引,那什麼是索引呢?
MySQL索引的建立對於MySQL的高效運行是很重要的,索引可以大大提高MySQL的檢索速度。
打個比方,如果合理的設計且使用索引的MySQL是一輛蘭博基尼的話,那麼沒有設計和使用索引的MySQL就是一個人力三輪車。
索引分單列索引和組合索引。單列索引,即一個索引只包含單個列,一個表可以有多個單列索引,但這不是組合索引。組合索引,即一個索引包含多個列。
創建索引時,你需要確保該索引是應用在 SQL 查詢語句的條件(一般作為 WHERE 子句的條件)。
實際上,索引也是一張表,該表保存了主鍵與索引欄位,並指向實體表的記錄。
上面都在說使用索引的好處,但過多的使用索引將會造成濫用。因此索引也會有它的缺點:雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對表進行INSERT、UPDATE和DELETE。因為更新表時,MySQL不僅要保存數據,還要保存一下索引文件。
建立索引會佔用磁碟空間的索引文件。
如何使用索引呢?
首先索引有窄索引和寬索引兩個概念,窄索引是指索引的列數為1~2,寬索引就是說索引的列數大於2。
因為窄索引的效率要高於寬索引,所以能用窄索引就不要使用寬索引。
那麼對單欄位索引和復合索引應該如何使用?
目錄
單欄位索引的情況:
復合索引的優勢:
兩者的比較:
單欄位索引的情況:
1.表的主鍵,外鍵必須有索引
2.數據量超過300的表應該有索引
3.經常與其他表進行連接的表,在連接欄位上應該建立索引
4.經常出現在where字句中的欄位,特點是大表的欄位,應該建立索引
5.索引應該建在選擇性高的欄位上
6.索引應該建在小欄位上,對於大的文本欄位甚至超長欄位,不要建立索引
7.盡量用單欄位索引代替復合索引,復合索引的建立需要仔細的斟酌
復合索引的優勢:
1.單欄位索引很少甚至沒有
2.復合索引的幾個欄位經常同時以AND的方式出現在where語句
當where語句中的條件是OR時,索引不起作用。
兩者的比較:
以一個sql語句來舉例:SELECT * FROM STUDENT WHERE SEX="男" AND SAGE=18;
若在sex 和 sage 兩個欄位分別創建了單欄位索引,mysql查詢每次只能使用一個索引,雖然對於未添加索引時使用全盤掃描,我們的效率提升了很多,但如果在sex 和 sage兩個欄位添加復合索引,效率會跟高,如: 創建(sex, age,teacher)的復合索引,那麼其實相當於創建了(area,age,teacher)、(area,age)、(area)三個索引,這被稱為最佳左前綴特性。
那對於兩者優缺點的比較:
1.對於具有2個用and連接條件的語句,且2個列之間的關聯度較低的情況下,復合索引有一定優勢。
2.對於具有2個用and連接條件的語句,且2個列之間的關聯度較高的情況下,復合索引有很大優勢。
3.對於具有2個用or連接條件的語句,單索引有一定優勢,因為這種情況下復合索引將會導致全表掃描,而前者可以用到indexmerge的優化。
以上就是如何提高查詢效率的全部內容,如果有幫助到你的話記得點個關注喲
❿ SQL語句 怎樣提高select語句的執行效率
總結了幾條如下:
(1) 選擇最有效率的表名順序(只在基於規則的優化器中有效):
ORACLE 的解析器按照從右到左的順序處理FROM子句中的表名,FROM子句中寫在最後的表(基礎表 driving table)將被最先處理,在FROM子句中包含多個表的情況下,你必須選擇記錄條數最少的表作為基礎表。如果有3個以上的表連接查詢, 那就需要選擇交叉表(intersection table)作為基礎表, 交叉表是指那個被其他表所引用的表.
(2) WHERE子句中的連接順序.:
ORACLE採用自下而上檔談的順序解析WHERE子句,根據這個原理,表之間的連接必須寫在其他WHERE條件之前, 那些可以過濾掉最大數量記錄的條件必須寫在WHERE子句的末尾.
(3) SELECT子句中避免使用 『 * 『:
ORACLE在解析的過程中, 會將'*' 依次轉換成所有的列名, 這個工作是通過查詢數據字典完成的, 這意味著將耗費更多的時間
(4) 減少訪問資料庫的次數:
ORACLE在內部執行了許多工作: 解析SQL語句, 估算索引的利用率, 綁定變數 , 讀數據塊等;
(5) 在SQL*Plus , SQL*Forms和Pro*C中重新設置ARRAYSIZE參數, 可以增加每次資料庫訪問的檢索數據量 ,建議值為200
(6) 使用DECODE函數來減少處理時間:
使用DECODE函數可以避免重復掃描相同記錄或重復連接相同的表.
(7) 整合簡單,無關聯的資料庫訪問:
如果你有幾個簡單的資料庫查詢語句,你可以把它們整合到一個查詢中(即使它們之間沒有關系)
(8) 刪除重復記錄:
最高效的刪除重復記錄方法 ( 因為使用了ROWID)例子:
DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID)
FROM EMP X WHERE X.EMP_NO = E.EMP_NO);
(9) 用TRUNCATE替代DELETE:
當刪除表中的記錄時,在通常羨蠢尺情況下, 回滾段(rollback segments ) 用來存放可以被恢復的信息. 如果你沒有COMMIT事務,ORACLE會將數據恢復到刪除之前的狀態(准確地說是恢復到執行刪除命令之前的狀況) 而當運用TRUNCATE時兄高, 回滾段不再存放任何可被恢復的信息.當命令運行後,數據不能被恢復.因此很少的資源被調用,執行時間也會很短. (譯者按: TRUNCATE只在刪除全表適用,TRUNCATE是DDL不是DML)
(10) 盡量多使用COMMIT:
只要有可能,在程序中盡量多使用COMMIT, 這樣程序的性能得到提高,需求也會因為COMMIT所釋放的資源而減少:
COMMIT所釋放的資源:
a. 回滾段上用於恢復數據的信息.
b. 被程序語句獲得的鎖
c. redo log buffer 中的空間
d. ORACLE為管理上述3種資源中的內部花費