批量更新,Oracle下merge into就比較快了,想要再提升的話
成都創(chuàng)新互聯(lián)公司是創(chuàng)新、創(chuàng)意、研發(fā)型一體的綜合型網(wǎng)站建設(shè)公司,自成立以來公司不斷探索創(chuàng)新,始終堅持為客戶提供滿意周到的服務(wù),在本地打下了良好的口碑,在過去的10多年時間我們累計服務(wù)了上千家以及全國政企客戶,如玻璃鋼坐凳等企業(yè)單位,完善的項目管理流程,嚴格把控項目進度與質(zhì)量監(jiān)控加上過硬的技術(shù)實力獲得客戶的一致稱譽。
1、using包含的Select,看能再修改不,試試hint
2、試試存儲過程
3、從程序的角度修改調(diào)用新增or更新的邏輯
首先要區(qū)分具體情況,雖然表里有幾百萬幾千萬的數(shù)據(jù)量,但是update是同時update這幾百萬條的數(shù)據(jù)呢?還是只更新其中某幾條? 更新的數(shù)據(jù)量不同,解決方案自然也就有差異。同時update幾百萬數(shù)據(jù),這個sql的性能影響在于數(shù)據(jù)庫會做回滾段,以便異常時rollback。由于數(shù)據(jù)量大,性能就浪費在回滾段上了。 所以有2個方案供參考:
1. update時 ,禁用回滾段的生成,跟你前面說的nologing應該是一個意思
2. 分批更新,比如每更新10W條數(shù)據(jù),就執(zhí)行一次commit,這樣效率也會比原來的要快。
可以通過update方法進行批量修改。
sql:update table_name SET age=25;
備注:也可以添加必要的條件,針對固定條件的數(shù)據(jù)進行批量修改。
sql:update table_name SET age=age+1 where name ='zhangsan ';
update主要由where條件決定更新對象,不寫where條件會更新全表。
如
update table set column1 = 'a' where column1 = '1';
這條語句就是把所有column1列值為'1'的行的column1列都更新成'a'
什么叫批量更新一列記錄? 是要一次性更新多條記錄么,如果是這樣的話只能逐條去些UPDATE語句。不過可以把需要更新的所有數(shù)據(jù)全部存到excel表格里,然后用CONCATENATE函數(shù)去寫SQL語句
在網(wǎng)上看到的,記錄下,實現(xiàn)多行多列更新
update table1 r
set (r.city,r.COUNTY,r.CELL_NAME,r.CELL_UK)
=
( select
m.company_name,m.COUNTY_NAME,m.cell_name,m.cell_uk
FROM table2 m where m.flow_id = r.flow_id
)
where exists (select 1 from table2 m where m.flow_id = r.flow_id )
創(chuàng)建聯(lián)合主鍵如下:
ALTER TABLE ADD CONSTRAINTS '約束名' PRIMARY KEY (COLUMN,COLUMN,...);