程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> 數據庫機能優化三:法式操作優化晉升機能

數據庫機能優化三:法式操作優化晉升機能

編輯:MSSQL

數據庫機能優化三:法式操作優化晉升機能。本站提示廣大學習愛好者:(數據庫機能優化三:法式操作優化晉升機能)文章只能為提供參考,不一定能成為您想要的結果。以下是數據庫機能優化三:法式操作優化晉升機能正文


數據庫優化包括以下三部門,數據庫本身的優化,數據庫表優化,法式操作優化.此文為第三部門 

概述:法式拜訪優化也能夠以為是拜訪SQL語句的優化,一個好的SQL語句是可以削減異常多的法式機能的,上面列出經常使用毛病習氣,而且提出響應的處理計劃

1、操作符優化
1. IN、NOT IN 操作符
IN和EXISTS 機能有表面和內表辨別的,然則在年夜數據量的表中推舉用EXISTS 取代IN 。
Not IN 不走索引的是相對不克不及用的,可以用NOT EXISTS 取代
2. IS NULL 或IS NOT NULL操作
索引是不索引空值的,所以如許的操作不克不及應用索引,可以用其他的方法處置,例如:數字類型,斷定年夜於0,字符串類型設置一個默許值,斷定能否等於默許值便可
3. <> 操作符(不等於)
不等於操作符是永久不會用到索引的,是以對它的處置只會發生全表掃描。 用其它雷同功效的操作運算取代,如 a<>0 改成 a>0 or a<0a<>'' 改成 a>''
4. 用全文搜刮搜刮文本數據,代替like搜刮
全文搜刮一直優於like搜刮:
(1)全文搜刮讓你可以完成like不克不及完成的龐雜搜刮,如搜刮一個單詞或一個短語,搜刮一個與另外一個單詞或短語鄰近的單詞或短語,或許是搜刮同義詞;
(2)完成全文搜刮比完成like搜刮更輕易(特殊是龐雜的搜刮);

2、SQL語句優化
1、在查詢中不要應用select *
為何不克不及應用,地球人都曉得,然則許多人都習氣如許用,要明確能省就省,並且如許查詢數據庫不克不及應用“籠罩索引”了
2. 盡可能寫WHERE子句
盡可能不要寫沒有WHERE的SQL語句
3. 留意SELECT INTO後的WHERE子句
由於SELECT INTO把數據拔出莅臨時表,這個進程會鎖定一些體系表,假如這個WHERE子句前往的數據過量或許速度太慢,會形成體系表歷久鎖定,諸塞其他過程。
4.關於聚合查詢,可以用HAVING子句進一步限制前往的行
5. 防止應用暫時表
(1)除非卻有須要,不然應盡可能防止應用暫時表,相反,可使用表變量取代;
(2)年夜多半時刻(99%),表變量駐扎在內存中,是以速度比暫時表更快,暫時表駐扎在TempDb數據庫中,是以暫時表上的操作須要跨數據庫通訊,速度天然慢。
6.削減拜訪數據庫的次數:
法式設計中最好將一些經常使用的全局變量表放在內存中或許用其他的方法削減數據庫的拜訪次數
7.盡可能少做反復的任務
盡可能削減有效任務,然則這一點的著重點在客戶端法式,須要留意的以下:
A、 掌握統一語句的屢次履行,特殊是一些基本數據的屢次履行是許多法式員很少留意的
B、削減屢次的數據轉換,或許須要數據轉換是設計的成績,然則削減次數是法式員可以做到的。
C、根絕不用要的子查詢和銜接表,子查詢在履行籌劃普通說明成外銜接,過剩的銜接表帶來額定的開支。
D、歸並對統一表統一前提的屢次UPDATE,好比
UPDATE EMPLOYEE SET FNAME='HAIWER' WHERE EMP_ID=' VPA30890F'
UPDATE EMPLOYEE SET LNAME='YANG' WHERE EMP_ID=' VPA30890F'
這兩個語句應當歸並成以下一個語句
UPDATE EMPLOYEE SET FNAME='HAIWER',LNAME='YANG'
WHERE EMP_ID=' VPA30890F'
E、UPDATE操作不要拆成DELETE操作+INSERT操作的情勢,固然功效雷同,然則機能差異是很年夜的。
F、不要寫一些沒成心義的查詢,好比
SELECT * FROM EMPLOYEE WHERE 1=2

3、where應用准繩
1)鄙人面兩條select語句中:
select * from table1 where field1<=10000 and field1>=0;
select * from table1 where field1>=0 and field1<=10000;
假如數據表中的數據field1都>=0,則第一條select語句要比第二條select語句效力高的多,由於第二條select語句的第一個前提消耗了年夜量的體系資本。
第一個准繩:在where子句中應把最具限制性的前提放在最後面。
2)鄙人面的select語句中:
select * from tab where a=… and b=… and c=…;
如有索引index(a,b,c),則where子句中字段的次序應和索引中字段次序分歧。
第二個准繩:where子句中字段的次序應和索引中字段次序分歧。
以下假定在field1上有獨一索引I1,在field2上有非獨一索引I2。
3) select field3,field4 from tb where field1='sdf' 快
select * from tb where field1='sdf' 慢,
由於後者在索引掃描後要多一步ROWID表拜訪。
select field3,field4 from tb where field1>='sdf' 快
select field3,field4 from tb where field1>'sdf' 慢
由於前者可以敏捷定位索引。
select field3,field4 from tb where field2 like 'R%' 快
select field3,field4 from tb where field2 like '%R' 慢,
由於後者不應用索引。
4) 應用函數如:
select field3,field4 from tb where upper(field2)='RMN'不應用索引。
假如一個表有兩萬筆記錄,建議不應用函數;假如一個表有五萬條以上記載,嚴厲制止應用函數!兩萬筆記錄以下沒無限制。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved