我有一個 postgresql 資料庫,并且有一個包含數百萬條記錄的表。此表有列auto_id (sequence added), id, schedule, date, status。
auto_id 是添加到其中的主鍵和序列。
在我的 jpa 存盤庫中,我有一個帶有以下查詢的方法,
@Query("delete from Rate r where r.id IN :rateIds")
void deleteByIds(@Param("rateIds") List<Integer> rateIds);
在此查詢中,我將按 id 列值洗掉,此串列大小約為 100。但在此 id 的表中,有數千條記錄。當我執行此代碼時,回應時間過長。
該表中添加了一個索引,該索引結合了 id、schedule、date 和 status 列。
誰能給我一個解決方案來加速這個洗掉?是否可以向 id 列添加索引,它會更快嗎?
謝謝你。
uj5u.com熱心網友回復:
可以應用幾種解決方案!據我所知,在下面提出
索引肯定會有所幫助,但當需要
retrieved洗掉而不是洗掉資料時它們會很好。嘗試創建一個
Stored procedure,因為它們pre-compiled執行速度更快,而不是原生查詢!Asynchronous如果可能,請觸摸此洗掉操作。即接受洗掉操作并讓它在后臺運行,一接到電話就發送確認請求(因為您的串列可能grow or shrink并且您不能總是依賴資料庫性能)使用
JdbcTemplate代替 JPA 因為它更快(這篇文章有一些相關的討論 Spring Data JPA 太慢了)
uj5u.com熱心網友回復:
我創建了一個這樣的程式,
CREATE OR REPLACE FUNCTION schema."fn_delete"(ids text) RETURNS boolean AS $BODY$ DECLARE
query VARCHAR(8000);
BEGIN
query := 'delete from table where id in ('||ids||')';
EXECUTE query;
RETURN TRUE;
END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100;
在存盤庫中添加了這個,
@Query(value = "SELECT schema.fn_delete(:ids);", nativeQuery = true)
boolean deleteFunc(@Param("ids") String ids);
叫它。
我還添加了這個屬性,
spring.datasource.tomcat.remove-abandoned-timeout=120
謝謝@Harsh 的回答。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/497663.html
標籤:PostgreSQL 弹簧靴 jpa 索引 sql-删除
