使用 DataConnection 時的考量
使用 DataConnection 與商務規則引擎時請考量以下幾點。
使用主索引鍵
有主索引鍵時,兩個資料列的相等性是由資料列是否具有相同的主索引鍵,而非物件的比較而決定。 若資料列判定為相同,則記憶體中僅會保留一個複本,並釋出另一個。 如此可耗用較少的記憶體。
第一次在規則引擎中判斷提示 DataConnection 時,引擎一律會嘗試從其架構找出其主鍵資訊。 若是有主索引鍵,即會擷取主索引鍵資訊,然後用於所有後續的評估。
注意
若是需要變更資料庫,則主索引鍵為必要項目。
若是情況許可,儘可能為 DataConnection 提供執行中交易
如果沒有交易, DataConnection 上的每個查詢和更新都會起始自己的本機交易,而不同的查詢可能會在規則評估的不同部分傳回不同的結果。 若是基礎資料庫資料表中有所變更,使用者可能會發現處理不一致的情形。
雖然當資料表未隨著時間變更時,您可以使用 DataConnection 而不提供交易,但即使 DataConnection 僅用於讀取作業,還是建議使用交易。
不過,更新資料時應該永遠會使用交易。
查詢數目可能呈線性增加
由於 對 DataConnection 的查詢是由其他聯結物件參數化,因此針對 DataConnection 執行的查詢數目會直接對應至到達 DataConnection的聯結物件數目。 因此,如果連線到 DataConnection 物件的聯結物件數目會以線性方式成長, 則對 DataConnection 的查詢數目也會以線性方式成長。 目前並沒有減少查詢數的最佳化方法。
此範例為規則:
IF A.x = 7 AND DC.y = A.y
THEN
代表 ObjectBinding、DC 代表 DataConnection,而 x 和 y 代表 A 和 DC 的屬性。
對於通過測試 (x = 7) 的每個 A 實例,都會使用 DataConnection產生查詢。 若是有許多相符的執行個體,會產生相同的查詢數。
小心使用 OR 條件
如果規則只使用結合 (AND) 條件,則會儘早執行測試和查詢,因此傳遞的物件實例將會減少。 因此,後續 DataConnection 的查詢數目會按比例減少。 如果在規則中同時使用分離 (OR) 條件和 DataConnection ,則會將所有條件評估推送至最終查詢。 如果在規則中使用多個 DataConnection ,最後一個查詢以外的所有查詢都會有效地成為 Select-ALL 查詢語句。
一般而言,最好是將具有 OR 條件的規則分割為兩個或多個不連續規則,因為與多個不可部分完成的規則定義相較,使用 OR 條件的話將會降低效能。 無論是否使用 DataConnections 都會發生這種情形。
您也可以考慮使用只包含結合條件的個別規則,而不是具有 OR 條件的一個規則。 使用 OR 條件時,查詢數目會以所有聯結物件的實例乘法速度成長。 下列範例會顯示這一點。
IF (A.x ==7 OR A.x == 8) AND DC.y == A.y
THEN DC.z = 10
在此範例中,A 代表 ObjectBinding;DC 代表 DataConnection,而 x、y 和 z 代表 A 和 DC 的屬性。 如果 A 有 100 個實例,而 x 在第一個物件中為 1,第二個物件中為 2,在第 100 個物件中為 100,則 100 個查詢必須針對 DataConnection執行。
最好是重寫前述規則,將它分割為兩個規則。
規則 1
IF A.x =7 AND DC.y = A.y
THEN DC.z = 10
規則 2
IF A.x = 8 AND DC.y = A.y
THEN DC.z = 10
SQL 不支援某些述詞和函式
某些規則引擎支援的述詞和函式,SQL 是不支援的。 若在規則條件中使用這些不支援的述詞和函式,就無法併入查詢中。 下列詞彙無法最佳化為 SQL 查詢:
某些引擎內建函式在 SQL 查詢中沒有相等函式。 這些是 Power、 FindFirst和 FindAll。 使用 DataConnection 資料行作為其一或多個引數無法優化為查詢的一部分;例如,Power ( 2、dc.Column1) 。
使用 DataConnection 資料行做為其正則運算式引數的內建述詞比對, (第一個引數) 。 例如,Match("abc*", dc1.Column2) 是有效的,但是 Match(dc1.Column1, dc1.Column2) 則是無法轉譯的。
使用具有 DataConnection 資料行做為其其中一個參數的使用者函式。 例如,c1.M(dc.Column1) 無法最佳化,因為無法在資料庫伺服器上執行使用者函式,必須由商務規則引擎來執行。
代表 DataConnection上設定作業的使用者函式;例如,dc.Column1 (5) 。
使用 ObjectReference 至 DataConnection 的函式;例如,ObjecRef (dc) 。
若是一或多個函式引數是無法轉譯的,函式呼叫也會變成無法轉譯;例如,Add(c1.M(dc.Column1), 5)。