當前位置:首頁 » 編程語言 » sql提高update語句速度
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql提高update語句速度

發布時間: 2022-06-11 00:23:04

『壹』 sql:這個update怎麼優化能快一點呢

你這個地方什麼意思啊?

1

e.EVALUATION_RECORD_ID in ('','','','')

弄那麼多空字元幹嘛?弄一個不就行了嗎?

已經都這么簡單了,沒什麼優化餘地,頂多在你where條件的兩個欄位加索引

『貳』 如何提高資料庫update更新的速度

就是很慢,用update就是這樣 給你個意見,可以把結果insert 到一個新表裡,在rename表名到舊的表,很快

『叄』 SQL如何提高UPDATE語句運行速度

就是很慢,用update就是這樣
給你個意見,可以把結果insert 到一個新表裡,在rename表名到舊的表,很快

『肆』 怎麼樣寫SQL語句可以提高資料庫的執行速度應該注意那些

這個范圍太大了,一下子是很難說清楚的,如果用sql
server
的話,可以使用它自帶的優化器來優化,然後看看它給你的建議去優化。要注意規范化編程。而且要抓住一個原則來寫,就是進可能縮小查詢出來的結果集,哪怕多次查詢都沒所謂,要一步一步把大數據量縮小。很多隻是還是得在時間中優化。SET
STATISTICS
TIME
ON;SQL
語句SET
STATISTICS
TIME
OFF;這個是sqlserver
,可以測出執行時間。編寫的時候要時刻想著:縮小結果集、減少連接次數和表數。大數據量不要用update,可以用臨時表作為過度來實現update操作。

『伍』 SQL 更新語句Update 效率問題

--這樣就是替換的了。
--@UPDATE_YEARNEW 參數為要變成的新日期年份
--@UPDATE_YEAROLD 參數為舊日期年份

DECLARE @UPDATE_YEARNEW AS INT,@UPDATE_YEAROLD AS INT
SET @UPDATE_YEARNEW=2008 --設置要更改的新日期
SET @UPDATE_YEAROLD=2007 --設置要更改的舊年份
UPDATE LOG SET TIME=DATEADD(YEAY@UPDATE_YEARNEW-@UPDATE_YEAROLD,TIME) WHERE YEAR(TIME)=@UPDATE_YEAR

『陸』 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進資料庫即可。代碼我不再寫了,這樣的字元串對比操作並不難,因為這樣都是內存操作,速度會很快。僅提供一個思路。希望對你有用。

『柒』 如何提升update語句的性能(MySQL)

update ... select ... from ... where ... 你的瓶頸是在查詢子句,並不是update的問題,優化完查詢執行自然會上去。 -------------------------- 優化SQL查詢的原則如下: 1、使用索引來更快地遍歷表。 預設情況下建立的索引是非群集索引,但有時它並不是最佳的。在非群集索引下,數據在物理上隨機存放在數據頁上。合理的索引設計要建立在 對各種查詢的分析和預測上。一般來說: a.有大量重復值、且經常有范圍查詢( > ,< ,> =,< =)和order by、group by發生的列,可考 慮建立群集索引; b.經常同時存取多列,且每列都含有重復值可考慮建立組合索引; c.組合索引要盡量使關鍵查詢形成索引覆蓋,其前導列一定是使用最頻繁的列。索引雖有助於提高性能但不是索引越多越好,恰好相反過多的索引會導致系統低效。用戶在表中每加進一個索引,維護索引集合就要做相應的更新工作。 2、在海量查詢時盡量少用格式轉換。 3、ORDER BY和GROPU BY使用ORDER BY和GROUP BY短語,任何一種索引都有助於SELECT的性能提高。 5、任何對列的操作都將導致表掃描,它包括資料庫函數、計算表達式等等,查詢時要盡可能將操作移至等號右邊。 6、IN、OR子句常會使用工作表,使索引失效。如果不產生大量重復值,可以考慮把子句拆開。拆開的子句中應該包含索引。

記得採納啊

『捌』 如何提高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.選擇最有效率的表名順序。ORACLE的解析器按照從右到左的順序處理FROM子句中的表名,因此FROM子句中寫在最後的表(基礎表 driving table)將被最先處理. 在FROM子句中包含多個表的情況下,你必須選擇記錄條數最少的表作為基礎表。如果有3個以上的表連接查詢, 那就需要選擇交叉表(intersection table)作為基礎表, 交叉表是指那個被其他表所引用的表。
2.WHERE子句中的連接順序。ORACLE採用自下而上的順序解析WHERE子句,根據這個原理,表之間的連接必須寫在其他WHERE條件之前, 那些可以過濾掉最大數量記錄的條件必須寫在WHERE子句的末尾。
3.SELECT子句中盡量避免使用 『* 』。
4.使用DECODE函數來減少處理時間。
5.查詢結果能不排序就不排序。盡量不用Order by,distinct,union,MINUS,INTERSECT。
6.用表連接代替子查詢in。
7.用索引提高查詢效率。但是索引不能隨便用,還要搞清楚每種索引適用的情況,比如B*索引、復合索引、函數索引、bitmap索引等。雖然使用索引能得到查詢效率的提高,但是也必須注意到它的代價. 索引需要空間來存儲,也需要定期維護, 每當有記錄在表中增減或索引列被修改時, 索引本身也會被修改. 這意味著每條記錄的INSERT , DELETE , UPDATE將為此多付出幾 次的磁碟I/O,因為索引需要額外的存儲空間和處理,那些不必要的索引反而會使查詢反應時間變慢。
8.不能再索引列上適用not、<>、is null、not is null、做四則運算,否則索引會被抑制,不起作用,變成全表掃描。
9.用>=替代>。比如SELECT * FROM S WHERE ID>=4效率SELECT * FROM S WHERE ID>3高。兩者的區別在於, 前者DBMS將直接跳到第一個ID等於4的記錄,而後者將首先定位到ID=3的記錄並且向前掃描到第一個DEPT大於3的記錄。
10.如果表的數據量很大,可以為該表建分區。經常使用的子查詢可以建成視圖。