資料庫操作優化一例

2022-03-24 15:24:01 字數 1908 閱讀 8250

資料庫公升級,需要對幾個表進行一些資料轉換,具體是這樣:針對每乙個 item,從 orders 表裡查出 shop_id,並把此 id 賦值給 items 和 skus 中的 shop_id。下面是最初實現的**,其中 largerresultprocessor 是乙個基類,負責遍歷泛型引數 t 所指向的資料庫表,並以每頁 100 項的方式分頁,並對每一項呼叫 processitem 函式,而子類只需實現 processitem 函式即可:

**

public

class

itemrenamecompanyid : largerresultprocessor

<

item

>'"

;var sql1

=string

.format(template1, item.id);

const

string

template2 =@"

update items set shop_id= where id = ;

update skus set shop_id= where item_id = ;";

trycatch

(exception exception)}}

上面這段**,邏輯比較簡單,針對每一項,使用 select 語句取出 shop_id,並且執行 update,只是有個問題,就是執行速度比較慢,對於我們 6 萬左右 item,4 萬左右 sku,99 萬左右 order 的表,需要執行約 40 分鐘,才能轉換完畢。

這些**,雖然是一次性操作,但是對於執行系統,停機時間越短越好,於是進行一些優化工作,資料庫對於大量重複的語句,如果使用引數的方式,因為可以避免對於語句的重複解析工作,所以速度會快一些,按照這個思路,簡單的修改如下:

**

public

class

itemrenamecompanyid : largerresultprocessor

<

item

>

catch

(exception exception)}}

測試這個程式,大概 25 分鐘可以完成轉換。有一些提高,不過,我們真正要修改的資料量並不大,一共只有 6 萬 加 4 萬 大約 10 萬條資料,所以 25 分鐘還是有些長了。簡單分析後,orders 是最大的表,如果整體速度慢,則導致速度慢最大的可能因素,應該是查詢 orders,所以稍換乙個思路,提前把 item_id 和 shop_id 的對應關係查詢出來,放到記憶體裡,從而避免每次 processitem 都要進行 orders 表的查詢。至於記憶體裡的資料,本來準備用 dictionary 的,後來一想,id 都是 long 型的資料,而且不能算「稀疏」矩陣,基本可以稱為「稠密」矩陣,所以,直接用陣列應該是速度更快,所以先查詢出 items 的最大 id,用於設定陣列大小,再按索引賦值即可:

**

public

class

itemrenamecompanyid : largerresultprocessor

<

item

>

;dynamic list

=dbentry.context.executedynamiclist(sql);

foreach

(dynamic row

inlist)

}protected

override

void

processitem(item item)

catch

(exception exception)}}

再測試這一段程式,執行 70 秒就完成了資料轉換,另外,查詢對應關係那一句 sql,因為針對的是剛恢復的資料庫,所以用了大概 3、40 秒,實際使用查詢管理器,在執行中的資料庫執行那一句 sql,只需要 1 秒左右就可以完成,所以,估計在實際轉換的時候,3、40 秒就可以完成轉換了。

演算法優化一例

本文將以排序演算法中的插入排序為例,介紹優化演算法,編制高效程式的方法。人們通常用於排序手中橋牌的方法是一次考慮一張牌,將它插入到已經排序過的牌的適當位置中 時刻讓它們保持有序 在計算機實現中,我們需要將較大的元素移到右邊,為插入的元素準備空間,然後再在空位置上插入該元素。該演算法的通常的乙個實現如...

sql優化一例

原sql,查詢總數300,每頁15資料也要8秒 select a from table where date format my time,y m d 2012 08 15 limit 0,15 優化後的sql,查詢總數18000,每頁15的資料只要1秒 select a from table wh...

ASP連線ACCESS資料庫一例

dim conn,rs set conn server.createobject adodb.connection set rs server.createobject adodb.recordset sub endconnection conn.close set conn nothing end...