2016-02-13 81 views
1

我有一個數據庫表,如下所示。數據庫交易成本與條款

Database Table

我的目的是設置行默認的一些事件之一。這意味着,如果使用選擇以與ID的行= 5作爲默認值,則ISDEFAULT用於行與ID值= 2將被設置爲Ñ並用ID = 5將相同的用於行更新至Y

正如我想到的,有兩種方法來實現這一點。在這兩種方式中,它都需要進行兩次數據庫事務。

  1. 設置ISDEFAULT的所有行到Ñ,然後更新與ID = 5〜ý的行。
  2. 更新ISDEFAULT字段Ñ其中ISDEFAULT = Y,然後更新與ID = 5〜ý的行。

在這兩種情況下,我們首先需要遍歷整個表到ISDEFAULT場升級到ñ。如果表大小增長,遍歷整個表成本高且耗時。

我正在尋找針對此方案的優化解決方案。請讓我知道,哪一個更好,爲什麼?我會欣賞知道任何其他優化的解決方案。

回答

0

你真的不必遍歷整個數據庫!

在情況1中:「將isDefault的所有行設置爲N,然後將ID = 5的行更新爲Y.」,這絕對是一個不錯的選擇。爲什麼要把所有的行都設置爲N?我們唯一需要做的是在案例2中:

「將isDefault字段更新爲N,其中isDefault = Y」。在這種情況下,我們必須鎖定所有受影響的行並將它們設置爲N。如果B樹類似結構中的列isDefault上的索引或O(1)(常數)(如果索引是散列類型結構),則這樣做的複雜度爲O(log n)。如果在'isDefault'列上沒有任何索引,則必須遍歷所有行,這些行在實踐中效率低下是不可接受的。

然後優化的解決方案是情況2,再加上'isDefault'列上的索引。