您好,登錄后才能下訂單哦!
這篇文章給大家介紹怎么在PostgreSQL中對刪除更新進行優化,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
刪除緩慢的原因:主要是約束的問題。(數據庫在有約束的時候,進行操作,會根據約束對相關表進行驗證,可想而知,20W的數據驗證要耗費多久的時間)。其次就是sql的編寫。(sql如果查詢中包含子查詢等的可以優化的where會影響匹配的速度<查詢的話就不多逼逼了>)。索引的問題 請看下面的 補充部分
具體解決方法:
ALTER TABLE tableName DISABLE TRIGGER ALL; delete 目標語句 ALTER TABLE tableName ENABLE TRIGGER ALL;
利用mybatis批量更新,第一張圖是原本的批量更新的寫法,發現在本地還可以的但是放在服務器會由于時間太久出現IO錯誤。
后來換成第二張圖的方式來更新。當然也可以java代碼for循環來單條更新來達到批量的目的。(對于這三種方式,第二種最快)
<update id="batchUpdate2" parameterType="java.util.List"> UPDATE lt_dzheinfo <trim prefix="set" suffixOverrides=","> <trim prefix="dzzhao =case" suffix="end,"> <foreach collection="list" item="reader" index="index"> when dzid=#{reader.readerId} then #{reader.readerBarcode} </foreach> </trim> <trim prefix="xming =case" suffix="end,"> <foreach collection="list" item="reader" index="index"> when dzid=#{reader.readerId} then #{reader.readerName} </foreach> </trim> <trim prefix="ztai =case" suffix="end,"> <foreach collection="list" item="reader" index="index"> when dzid=#{reader.readerId} then #{reader.readerState} </foreach> </trim> <trim prefix="mima =case" suffix="end,"> <foreach collection="list" item="reader" index="index"> when dzid=#{reader.readerId} then #{reader.readerPsw} </foreach> </trim> <trim prefix="dzlxid =case" suffix="end,"> <foreach collection="list" item="reader" index="index"> when dzid=#{reader.readerId} then #{reader.readerType} </foreach> </trim> <trim prefix="zjlx =case" suffix="end,"> <foreach collection="list" item="reader" index="index"> when dzid=#{reader.readerId} then #{reader.identityType} </foreach> </trim> <trim prefix="zjhma =case" suffix="end,"> <foreach collection="list" item="reader" index="index"> when dzid=#{reader.readerId} then #{reader.identityId} </foreach> </trim> <trim prefix="qyrqi =case" suffix="end,"> <foreach collection="list" item="reader" index="index"> when dzid=#{reader.readerId} then TO_TIMESTAMP(#{reader.enableDate}, 'YYYY-MM-DD HH24:MI:SS') </foreach> </trim> <trim prefix="jzrqi =case" suffix="end,"> <foreach collection="list" item="reader" index="index"> when dzid=#{reader.readerId} then TO_TIMESTAMP(#{reader.disableDate}, 'YYYY-MM-DD HH24:MI:SS') </foreach> </trim> <trim prefix="libid =case" suffix="end,"> <foreach collection="list" item="reader" index="index"> when dzid=#{reader.readerId} then #{reader.readerOfLibCode} </foreach> </trim> <trim prefix="xingbie =case" suffix="end,"> <foreach collection="list" item="reader" index="index"> when dzid=#{reader.readerId} then <choose> <when test="reader.readerSex=='男'.toString()"> true </when> <otherwise> false </otherwise> </choose> </foreach> </trim> <trim prefix="userid =case" suffix="end,"> <foreach collection="list" item="reader" index="index"> when dzid=#{reader.readerId} then #{reader.readerOperatorId} </foreach> </trim> <trim prefix="beizhu =case" suffix="end,"> <foreach collection="list" item="reader" index="index"> when dzid=#{reader.readerId} then #{reader.readerRemark} </foreach> </trim> <trim prefix="bzrqi =case" suffix="end,"> <foreach collection="list" item="reader" index="index"> when dzid=#{reader.readerId} then TO_TIMESTAMP(#{reader.enableDate}, 'YYYY-MM-DD HH24:MI:SS') </foreach> </trim> <trim prefix="optime =case" suffix="end,"> <foreach collection="list" item="reader" index="index"> when dzid=#{reader.readerId} then TO_TIMESTAMP(#{reader.enableDate}, 'YYYY-MM-DD HH24:MI:SS') </foreach> </trim> </trim> where dzid in <foreach collection="list" index="index" item="reader" separator="," open="(" close=")"> #{reader.readerId} </foreach> </update>
<update id="batchUpdate" parameterType="java.util.List"> <foreach collection="list" index="index" item="reader" separator=";"> UPDATE lt_dzheinfo SET dzzhao = #{reader.readerBarcode}, xming = #{reader.readerName}, ztai = #{reader.readerState}, mima = #{reader.readerPsw}, dzlxid = #{reader.readerType}, zjlx = #{reader.identityType}, zjhma = #{reader.identityId}, qyrqi = TO_TIMESTAMP(#{reader.enableDate}, 'YYYY-MM-DD HH24:MI:SS'), jzrqi = TO_TIMESTAMP(#{reader.disableDate}, 'YYYY-MM-DD HH24:MI:SS'), libid = #{reader.readerOfLibCode}, xingbie = <choose> <when test="reader.readerSex=='男'.toString()"> true </when> <otherwise> false </otherwise> </choose>, userid = #{reader.readerOperatorId}, beizhu = #{reader.readerRemark}, bzrqi = TO_TIMESTAMP(#{reader.enableDate}, 'YYYY-MM-DD HH24:MI:SS'), optime = TO_TIMESTAMP(#{reader.enableDate}, 'YYYY-MM-DD HH24:MI:SS') <where> dzid = #{reader.readerId} </where> </foreach> </update>
補充:數據庫突然變慢...索引作怪!
本人在最近發現,有些比容量較大的SQL數據庫,在使用一段時間后,會突然變很慢很慢。特別體現在一些經常進行操作及查詢的大表中。經過深入研究,這一般是索引的問題!如果把此表的索引重建一次,問題即可解決。
為更好地解決此問題,建意在SQL中新建一個數據庫維護計劃,選中“重新組織數據各索引頁”選項,并設置每天運行一次。
/* 刷新數據庫視圖.sql */ ALTER PROC P_RefreshView as DECLARE @vName sysname DECLARE refresh_cursor CURSOR FOR SELECT Name from sysobjects WHERE xtype = 'V' order by crdate FOR READ ONLY OPEN refresh_cursor FETCH NEXT FROM refresh_cursor INTO @vName WHILE @@FETCH_STATUS = 0 BEGIN --刷新指定視圖的元數據。由于視圖所依賴的基礎對象的更改,視圖的持久元數據會過期。 exec sp_refreshview @vName PRINT '視圖' + @vName + '已更新' FETCH NEXT FROM refresh_cursor INTO @vName END CLOSE refresh_cursor DEALLOCATE refresh_cursor GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO
關于怎么在PostgreSQL中對刪除更新進行優化就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。